빈 개수가 너무 많아 getInstance() 메소드를

591 views
Skip to first unread message

자유

unread,
Jul 17, 2012, 7:38:29 AM7/17/12
to ks...@googlegroups.com
공통팀에서 말하길 프로젝트에 빈 개수가 너무 많아서 와스 기동이 너무 느리고 메모리도 모자란다고 합니다

그래서 dao는 스프링적용않고 싱글턴패턴을 모든 dao 에 다 집어넣에 코딩하자고 하네요

예를들면

class ADao{
static instance=new ADao();
public static ADao getInstance(){
return instance;
}
}

이런걸 모든 dao 윘부분에 ..

더 멋진 방법 없나요?

지하철이라 말이짧아 죄송합니다..^^

YongHyuk Lee

unread,
Jul 17, 2012, 7:47:39 AM7/17/12
to ks...@googlegroups.com
얼마나 많길래 그래요.?
펌영역이 몇메가나 되길래..?

많아도 120메가 넘기 힘들텐데요...

많아서..
라는 말은 좀 무책임한데요..

많아서.. 느려서... ㅎㅎ

나의 iPhone에서 보냄

2012. 7. 17. 20:38 "자유" <kiki...@gmail.com> 작성:

> --
> Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
> 웹에서 이 토론을 보려면 https://groups.google.com/d/msg/ksug/-/iai-TmTJhvgJ을(를)를 방문하세요.
> 이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
> 그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
> 더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.
>

심상호

unread,
Jul 17, 2012, 8:28:42 AM7/17/12
to ks...@googlegroups.com
거의 대부분의 Spring Bean은 Logic을 담고 있는 Instance로, 대부분의 경우 Application Context 내에 하나만 존재합니다.

Instance가 많아서 느려진다는 얘기는
1. 실제로 필요한 Bean이 많다.
2. Application Context를 생성할 때 뭔가 잘못해서 쓸데없이 동일한 Bean을 여러개 생성하고 있다.
등의 이유가 있을 것 같은데요.

3. Instance 수와 성능은 별 관계가 없다.
의 이유도 있을 수 있겠네요.

그리고 만약 1과 같은 이유라면 Singleton pattern을 적용해도 별 차이가 없을겁니다.
어차피 객체 자체는 Heap에 잡힙니다. 하드웨어 성능을 높이거나 설계에 문제가 없는지 살펴보는게 좋을 듯 합니다.

농부건우

unread,
Jul 17, 2012, 8:30:09 AM7/17/12
to ks...@googlegroups.com
제가 알기로는 bean을 설정하여 사용시 기본적으로 동일한 객체를 넘겨 주기 때문에 싱글톤 패턴을 사용하지 않아도 동일한 효과를 보실 수 있습니다.

토비의 스프링3 p104 1.6 싱글톤 레지스트리와 오브젝트 스코프 보시면 도움이 되실것 같습니다.

2012년 7월 17일 오후 8:47, YongHyuk Lee <unlogi...@gmail.com>님의 말:

자유

unread,
Jul 17, 2012, 10:40:10 AM7/17/12
to ks...@googlegroups.com
참고로 느리다는 것은 was 기동 시간이 느리다는 겁니다

즉 was가 기동하면서 어노테이션 붙은 빈들을 모두 초기화 하기 때문에 느리다는 것입니다.

메모리는.순수 자바 보다 아무래도 스프링이 빈에 대 메타정보? 같은걸 더 많이 관리 할것같으니 스프링. 아무래도 단순 메모리 사용량만 본다면.그 차이가 얼마일지는 모르겠지만 스프링이 더 많이 쓰는겠지마뉴더많은 메모리를. 쓰는게 아닐까요
2012년 7월 17일 화요일 오후 9시 28분 42초 UTC+9, 심상호 님의 말:


> 거의 대부분의 Spring Bean은 Logic을 담고 있는 Instance로, 대부분의 경우 Application Context 내에 하나만 존재합니다.
>

> </div>

> Instance가 많아서 느려진다는 얘기는</div>
> 1. 실제로 필요한 Bean이 많다.</div>
> 2. Application Context를 생성할 때 뭔가 잘못해서 쓸데없이 동일한 Bean을 여러개 생성하고 있다.</div>
>
> 등의 이유가 있을 것 같은데요.</div>
>
> </div>
> 3. Instance 수와 성능은 별 관계가 없다.</div>
> 의 이유도 있을 수 있겠네요.</div>
>
> </div>
> 그리고 만약 1과 같은 이유라면 Singleton pattern을 적용해도 별 차이가 없을겁니다.</div>
> 어차피 객체 자체는 Heap에 잡힙니다. 하드웨어 성능을 높이거나 설계에 문제가 없는지 살펴보는게 좋을 듯 합니다.</div>
>
>
> </div>

코바(이수홍)

unread,
Jul 17, 2012, 11:18:30 AM7/17/12
to ks...@googlegroups.com
제 지식으로는 어노테이션 달린것을 다 스캔한다고 해도 

다 컨테이너로 객체생성 안하는 것으로 알고 있습니다.

메타 정보만 관리 하고 있다가 그 객체가 필요 할 때 생성  시키는 것으로 알고 있습니다.

자세한 정보는 토비님 블로그에서 확인 가능 할텐데 


잘 보시면 ASM 라이브러리 사용해서 메타데이터만 관리하다가 필요할때 로딩 한다는 것을 알 수 있습니다.

고로 WAS 처음 시작 할때 많은 메모리가 필요 하지 않다는 것을 알 수 있습니다.

물론 빈자체가 많을 땐 메타 데이터만으로도 많겠지만요 

2012년 7월 17일 화요일 오후 8시 38분 29초 UTC+9, 자유 님의 말:

코바(이수홍)

unread,
Jul 17, 2012, 11:32:20 AM7/17/12
to ks...@googlegroups.com
제가 보기엔 성능이나 안정성을 위해서도 

was 초반 구동 조금 느린것은 감수 해야 되지 않을까합니다

그리고 was 구동 자체 느린게 다른 이유가 있지 않을까 생각도 듭니다.

예를 들면 was 구동시 테스트 인데 커넥션풀을 많이 잡아서 테스트 한다거나 

DB를 미리 읽어서 가져 오는 코드가 있다거나 

미리 다 읽지 않아도 되는  Bean은 lazy-loading을 해서 최적화 한다거나 

여러가지 was 로딩시 하는 작업을 한번 살펴 보시고 최적화 하는 것도 좋은 방법 인것 같습니다

제가 보기엔 예제로 저렇게 하는것은 그닥 좋은 방법이 아니라고 생각됩니다

저렇게 하려면 생성자도 private 해서 싱글턴 형식으로 하시거나 해서 직접 관리 해야 하는데

나중에 부작용이 생기지 않을까 생각됩니다.

단순 싱글턴 패턴 방법은 문제가 있다고 디자인 패턴 책에서 봤는데

그런 부분도 책보시고 부작용 없이 싱글턴 객체 만드는 방법을 확인 하시고 만드 시던지 

제가 보기엔 그냥 스프링에게 맡기는 것이 가장 좋지 않을까 생각됩니다.

2012년 7월 17일 화요일 오후 8시 38분 29초 UTC+9, 자유 님의 말:
공통팀에서 말하길 프로젝트에  빈 개수가 너무 많아서 와스 기동이 너무 느리고 메모리도 모자란다고 합니다

이수홍

unread,
Jul 17, 2012, 6:41:55 PM7/17/12
to ks...@googlegroups.com
토비님 블로그애 있는 글을 제가 조금 잘못이해한듯 다로딩안되는건 모든 클래스를 다 로딩해서 컴포넌트 어노테이션을 안찾는다는 말인데 

만약 컴포넌트 어노테이션을 만나면 생성하겠지요 

lazy-init를 사용하는게 맞겠네요

역시 저도 공부하며 태스트는 좀더해봐야겠네요

나의 iPhone에서 보냄

2012. 7. 18. 오전 12:18 "코바(이수홍)" <sbc...@gmail.com> 작성:

--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
웹에서 이 토론을 보려면 https://groups.google.com/d/msg/ksug/-/M9a1hT7ay28J을(를) 방문하세요.

Gim

unread,
Jul 17, 2012, 7:14:37 PM7/17/12
to ks...@googlegroups.com

답변들 감사드립니다

이런생각들하다보면 스프링기반 프로젝트의 최대 크기라는것은 스프링 자체의 제한이라기보다 os위에서의 jvm과 와스의 한도가 문제일거라는 생각도 들면서..

그렇다면 웹로직기준으로 도메인 혹은 매니지드 서버를 분리하지않고 운영할수있는 프로젝트의 크기 같은 권고치가 있을까요? (메모리야 64비트os 64비트 jvm이라 거의 제약없이 쓸수있다라고 가정했을때요)

위에서 말씀하신대로 펌만 충분히 잡아주면 될까요? 너무큰 펌이나 힙이  일으키는 다른 부작용이나 불편함은 없을까요?

Sungchul Park

unread,
Jul 19, 2012, 7:57:19 AM7/19/12
to ks...@googlegroups.com
대충 해법이 답글에 언급되기는 했지만 정리해드리면...

메모리 문제

정확히 어떤 예외나 오류가 뜨는지 알아야 합니다. 만약 발생하는 예외의 메시지가 다음과 같다면
java.lang.OutOfMemoryError: PermGen space

PermGen 크기를 늘리고 몇가지 VM 고유의 옵션을 지정해 문제를 해결할 수 있습니다. 스프링은 AOP 같은 자바의 동적인 특징을 많이 활용하기 때문에 Permanent Generation 영역을 많이 사용합니다. 그러니 일단 크기를 키우시고 오라클 JVM의 경우 -XX:+CMSClassUnloadingEnabled와 -XX:+CMSPermGenSweepingEnabled 옵션을 지정해서 PermGen을 대상으로 GC와 안 쓰는 클래스 정보를 지우는 작업을 수행하도록 해야 합니다.

Java 6 이상을 쓰시고 GC가 부담된다면 -XX:+CMSClassUnloadingEnabled 만 지정하셔도 됩니다.

기동 속도 문제

그리고 초기에 기동 시간이 느린 문제는 초기화 지연(Lazy initialization) 기능을 쓰시면 됩니다. 스프링을 기본적으로 기동시에 모든 빈을 생성합니다. 다만 초기화 지연을 사용하면 초기화시 발생할지 모르는 오류를 운영 중에 발견하게 됩니다. 그러니 적절히 범위를 정해서 사용하시는 것이 좋습니다.

12. 7. 17. 오후 8:38, 자유 쓴 글:

Gim

unread,
Jul 20, 2012, 1:31:39 AM7/20/12
to ks...@googlegroups.com

우와 새로운 정보 감사드립니다

2012. 7. 19. 오후 8:57에 "Sungchul Park" <gyu...@gmail.com>님이 작성:
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
Reply all
Reply to author
Forward
0 new messages