2010-01-20 2 views
3

저는 잠시 동안 (예전보다) 큰 자바 프로젝트를 진행하고 있습니다. 이 프로그램은 여러 단계로 작동하며 많은 개체가 이전 단계에서 유지되고 이후 단계에서 사용됩니다. 몇 가지 그룹/카테고리를 찾았습니다. 이유가 없어도 유지되지만 더 많은 정보가있을 것입니다.더 이상 사용되지 않는 객체는 어떻게 찾을 수 있습니까?

내 질문은 어떤 특정 시점에서 프로그램의 끝까지 터치하지 않은 채로 어떤 객체가 접촉되지 않았는지를 보여줄 수있는 좋은 도구가 있는지입니다. 나는 "yourkit"을 사용하여 모든 객체를 검사 해 왔지만 유지해야하는지 여부는 불분명합니다. 내가 당신의 기억 계산 /보고에 일종의 커버리지 툴을 결합한 것을 가지고 있다면, 나는 행복한 사람이 될 것이다.

+0

"손대지"개체에서의 의미는 무엇입니까? –

+0

나는 그 중 하나가 호출 된 객체이거나 그 중 하나가 액세스 된 public 필드를 의미합니다. – Benj

답변

2

VisualVM을 사용하여 힙을 검사하고 가비지 수집을 모니터링 할 수 있습니다. 프로그램에 중단 점을 설정 한 다음, 보관하지 말아야 할 것으로 의심되는 항목을 살펴보고 해당 항목에 대한 참조를 유지하는 항목을 찾아야합니다.

내가 원하는대로했던 상업용 도구 (JProbe?)를 사용 했었지만 8-9 년 전만해도 여전히 사용할 수 있는지, 아니면 사용 가능한지 모릅니다. 입니다.

+0

안녕하세요, 그건 Yourkit과 비슷한 도구처럼 들립니다. 어떤 보험 보상 요소를 제공합니까? – Benj

+0

예, 꽤 괜찮 았습니다. 디버거 스타일의 인터페이스가있어서 코드를 단계별로 실행하여 현재 스레드의 스택, 각 메소드 호출시 할당 된 부분, 스택 프레임과 대비되는 힙에 할당 된 내용, 많은 것들을 볼 수 있습니다. – TMN

3

약한 참조는 개체가 더 이상 참조되지 않는시기를 결정하는 데 사용됩니다.

// Create the weak reference. 
    ReferenceQueue rq = new ReferenceQueue(); 
    WeakReference wr = new WeakReference(object, rq); 
    // Wait for all the references to the object. 
    try { 
     while (true) 
     { 
       Reference r = rq.remove(); 
       if (r == wr) 
       { // Object is no longer referenced. } 
     } 
    } 
    catch (InterruptedException e) { } 
+0

안녕하세요, 약한 심판을 알고 있지만 정확히 당신의 아이디어는 무엇입니까? 내 프로그램을 현재 상태로 분석하고 싶습니다. 내가 만든 모든 개체에 대해 약한 참조를 컬렉션에 자동으로 추가 한 다음 해당 컬렉션을 확인할 수있는 방법을 찾은 것 같습니다. – Benj

+0

개체가 더 이상 참조되지 않으면 GCed됩니다. 질문은 이러한 객체에 대한 강력한 참조가 여전히 있으므로 GCed 될 수 없다는 것을 의미합니다. – noah

+0

사실, 이것조차도 정말 도움이 안 될 것입니다. 당신은 객체가 참조하는 객체를 압니다. 내가 알고 싶은 것은 그것들이 사용 되었는가입니다 ... 즉 그들은 참조 될 필요가 있습니다. – Benj

관련 문제