2010-11-19 3 views
6

가비지 수집기에서 객체를 가져올 수 있는지 확인하는 방법이 있습니까? 이클립스 디버거를 통해, 나는 개체의 메모리 위치를 얻을가비지 수집기가 객체를 가져올 수 있는지 확인하십시오.

MyObject mo = myObject; 

다음 :

어딘가에 내 코드에서 나는 개체에 대한 참조를 가지고있다.

mo = null; 

이전에 참조 된 개체는 이제 가비지 컬렉션에 적합 또는 어딘가 다른 참조가 그것을이 있는지 여부를 확인하기 위해 어떤 방법이 있나요 : 그 후, 나는 참조 널 (null)을 설정?

고마워,

스테판

답변

13

런타임에는 임의의 개체로이 작업을 수행 할 수 없으며 실제로이 작업을 결정적으로 수행 할 수는 없습니다. 그러나, 사용자의 필요에 따라 적합 할 수있는 두 가지 옵션이 있습니다 :

  1. 당신이 null에 대한 참조를 설정 한 후 힙 덤프를 가지고, 다음과 같은 jhat 또는 프로파일 러로 힙 분석기 도구를로드는 이것을 지원합니다. 이러한 도구는 GC 루트에서 경로를 탐색하여 개체가 여전히 도달 가능한지 여부를 확인해야합니다.
  2. PhantomReference에있는 객체를 주어진 ReferenceQueue으로 묶습니다. 참조가 대기열에 들어 오면 객체가 가비지 수집 된 것을 알게됩니다. (안타깝게도, 참조가 unqueued되면 객체가 여전히 도달 할 수 있기 때문이거나 GC가 아직 객체를 검사하지 않았기 때문일 수 있습니다. 모든 GC 관련 질문과 마찬가지로 가비지 수집은 결정적 프로세스가 아닙니다!)하지만 전반적으로

, 나는 최선의 선택은 메모리 누수 문제 알고하고 그들을 피하기 위해 응용 프로그램을 설계하는 것에 동의합니다. 메모리 누수가있는 경우 충분히 명확해야하며 문제를 찾는 데 다시 집중할 수 있습니다 (다시 도달 할 수없는 객체의 힙을 덤프하고 분석하여 다시).

위의 단계는 비교적 시간이 많이 걸리고 자신을 재확인하기 위해 모든 변경 후에 수행해야하는 것이 아니라 특정 문제를 조사하는 데 사용하는 도구입니다.

+0

우리는 메모리 문제를 경험 한 huuuuuuuuuuuuuuge 어플리케이션입니다. 하나의 최적화가 이제는 개선으로 이어지지 만, 우리가 기대했던 만큼은 아닙니다. 따라서 특정 객체가 가비지 수집되는지 여부를 알고 싶습니다. 답장을 보내 주셔서 감사합니다. – swalkner

+0

순수 쓰레기가 나옵니다. D – delive

1

호 할 수있는 유일한 방법은 조심하고 응용 프로그램을 작성할 때 메모리 누수가 자바에있을 수 있음을 알고 있어야하는 것입니다.

당신이 할 수있는 일은 도구를 사용하여 그러한 문제를 발견했을 때 메모리 누수가 발생한 곳을 찾으려고 시도하는 것입니다. 이를 위해 Memory Analyzer을 강력히 추천합니다.

+0

답장을 보내 주셔서 감사합니다! 물론 조심하는 것이 가장 중요합니다. 그러나 때로는 충분하지 않거나 가능하지 않습니다. (andrzey doyle에 대한 답변 참조) – swalkner

관련 문제