2013-10-16 2 views
1

비 정적 인 맵을 가진 싱글 톤 객체가 있는지 알고 싶습니다. 왜지도의 객체가 힙이 아닌 공간을 차지할 것인가? 나는 Visual Basic VM에서 Map Pergem 공간에 객체가 교차하는 것을 볼 수 있습니다.젬당 싱글 톤 패턴을위한 메모리가 부족함

내가 알고있는 것은 정적 변수 일 뿐이며 클래스는 pergem space rest에서 모든 객체가 힙에 가야한다는 것을 알고있었습니다.

싱글 톤 객체가 정적 인 곳에서 참조가 힙을 가리키고 있지만 여전히 pergem에서 크기를 유지하는 싱글 톤 패턴 때문입니까?

이 경우 어떤 문제가 발생합니까?

+1

싱글 톤 내의 모든 필드는 실제로 정적입니다. 싱글 톤은 그냥 혼란스러워. PermGen (존재하는 구현체)은 클래스 데이터와 내부 문자열에 할당 된 객체로 가득 차 있습니다. 클래스 로더를 다시로드하는 경우 통계를 통해 이전 코드가 언로드되는 것을 방지 할 수 있습니다. 대부분의 GC 활동은 PermGen을 무시하므로 예상보다 오래 걸린 개체를 볼 수 있습니다. –

+1

싱글 톤을 사용하는 것이 근본적인 문제라고 말하고 싶습니다. DI로 전환하고 [@ 싱글 톤] (http://google-guice.googlecode.com/git/javadoc/com/google/inject/Singleton.html)을 사용하면 어떨까요? – maaartinus

답변

1

문제의 답은 yes입니다. 특히 정적 변수에서 직접 또는 간접적으로 객체를 참조하는 경우 [1] 언제든지 해당 객체를 가비지 수집 할 수 없으며 결국에는 permgen으로 이동합니다.

해결책은 싱글 톤을 사용하지 않는 것입니다. 그러나 귀하의 질문에 근거하여 귀하가 가진 진짜 문제는 해시 맵이 계속 성장한다는 것입니다. 이것을 캐시 형태로 사용하는 경우 캐시에서 시간 또는 크기에 따라 만료일을 설정해야합니다. 그렇지 않으면 OOM을 얻을 때까지 계속 확장됩니다.

[1] 특정 클래스 로더 트릭이있는 경우에는 더 많거나 적습니다.