2011-01-09 3 views
1

Java 백엔드 시스템은 가비지 컬렉터에서 처리 할 수없는 큰로드가 발생하여 메모리 누수가 발생합니다. 이 문제를 어떻게 해결할 수 있습니까?가비지 컬렉터에서 메모리 누수 해결

+3

Java GC 작동 방식이 아닙니다. ... –

+2

이 숙제가 있습니까? – Mehrdad

+0

Java 메모리 누출을 찾는 방법 : http://stackoverflow.com/questions/40119/how-to-find-a-java-memory-leak –

답변

2

매우 의심 스럽습니다. 네이티브 코드가 아닌 한 메모리 누수가 실제로 메모리 팽창의 경우입니다. 메모리 팽창은 절대로 누락되지 않는 강력한 참조를 갖는 객체 일뿐입니다.

2

Java에서 메모리 누수로 끝날 수있는 유일한 방법은 더 이상 필요하지 않은 참조를 유지하는 것입니다. 응용 프로그램은 여전히 ​​참조에 액세스 할 수 있으므로 가비지 수집기는이를 정리할 수 없으며 실제로 가비지 수집기의 관점에서 볼 때 누수임을 알 수 없습니다.

유일한 문제는 누출 문제를 해결하는 것입니다. 그들을 찾아서 탐지하는 방법에 관해서는 ... 불행히도 많은 제안이 없습니다. 아마도 유닛 테스트에 코드를 추가하여 함수가 더 이상 필요하지 않은 메모리를 해제하는지 확인할 수 있습니다. 또는 VM 메모리를 대폭 줄인 단위 테스트를 실행하여 가장 많은 할당을 담당하는 단위를 결정할 수 있습니다. 일반적으로 누수가 발생할 수있는 패턴이 있습니다. 예를 들어 큰 문자열의 하위 문자열 (예 : 파일을 문자열로 읽는 경우)을 유지하는 경우 하위 문자열은 해당 문자열의 참조를 유지하기 때문에 이 프로그램과 누수로 이어지는 다른 일반적인 패턴을 탐지하는 프로그램이 작성 될 수 있다고 가정합니다. 그러나, 나는이 종류의 유출 가능성 탐지를 수행하는 현재 사용 가능한 프로그램을 전혀 모르고 있습니다.

1

비정상적인 JVM 구현을 사용하지 않는 한, "누수"현상은 필요한 것보다 훨씬 오래 객체를 유지할 경우에만 실제로 발생합니다. Java가 객체에 도달 할 수 있음을 감지하면 프로그램 의미에 영향을 줄 수 있으므로 객체를 수집하지 않습니다.

메모리 사용량을 줄이려면 더 이상 필요하지 않은 개체에 대한 참조를 끊거나 WeakReference 또는 WeakHashMap을 사용하여 자동으로 교정 할 수있는 방식으로 개체를 저장하십시오.

정확히 무엇이 메모리를 낭비하고 있는지 추적하려는 경우 객체 액세스를 살펴보면 잠재적 인 메모리 누수를 감지하여 this paper을 확인할 수 있습니다. 이 도구는 분명히 잘 작동하지만, 익숙하지는 않습니다.

희망이 도움이됩니다.

+0

그래서 도구는 종이 참조, SWAT, 흥미로운 소리지만, 인터넷 검색 다운로드 실제 구현을 공개하지 않습니다. 또는 나는 무엇인가 놓치고 있냐? – orangepips

+0

흠 ... 나는 실제로 사본을 얻을 수있는 곳을 모른다. :-(나는 아무것도 찾으면 알려주지. – templatetypedef

0

jmap은 (는) 친구입니다. 현재 (sun/oracle) JVM에서 누출이 있지만 OP가 말하는 것에 대해 의심 스럽습니다. Finalizers는 팬텀 참조와 유사합니다 (java.lang.ref.FinalReference의 impl). 올바른 방법으로 GC를 혼란스럽게하지 않아서 finalize 메소드로 사용할 수있는 객체가 다른 것입니다.