2014-12-25 2 views
0

Java 객체에 대한 참조 수를 확인할 수있는 방법이 있습니까?Java 객체에 대한 참조 수

myObject를 개체에 대한 참조로 만들고 개체가 이미 작업을 완료하도록합니다. 처리 방법으로 죽을 준비를하고 다른 목적으로 참조 myObject를 사용하려고하므로 가비지 수집기를 사용하여이를 삭제할 수 있습니다. 그러나 개체에 대한 다른 참조가없는 것은 아닙니다. 그것을 확인하는 방법?

+1

왜 중요한가요? 인스턴스를 명시 적으로 'null'할 필요가 없습니다. 도달 할 수 없을 때 * 가비지 수집 될 수 있습니다 (가비지 수집 될 때 또는 지정되지 않은 경우). –

+0

다른 목적으로 myObject를 사용한다고 가정합니다. 나는 조금 질문을 다시한다. –

+1

아니요. 아직도 이해가 안됩니다. ['WeakReference'] (http://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html)를 찾고 있습니까? ? –

답변

0

주석에 설명되어 있듯이 객체에 대한 참조 수를 알고 싶지는 않으므로/거의 알 필요가 없습니다. 가비지 콜렉션의 장점은 프로그램의 한 부분이 프로그램의 다른 부분이 여전히 오브젝트에 대한 참조를 보유하는지 여부를 고려하지 않고 오브젝트에 대한 참조를 널 (null) 할 수 있다는 것입니다.

개체가 가비지 수집 된시기를 알고 싶다면 WeakReference을 붙이십시오. Elliott Frisch가 주석에서 말한대로 - reference.get()이 null을 반환하면 개체가 가비지 수집되었습니다. 더 거친 대체 방법은 객체의 finalize 메소드를 덮어 쓰고 호출 될 때 기록하는 것입니다.

메모리 누수가 있다고 생각되는 경우 Eclipse memory analyzer 또는 기타 메모리 분석/프로파일 링 도구를 사용하십시오.

당신이 정말로 객체 다음 내가 생각할 수있는 유일한 해결책은 Jikes RVM를 사용하는 것입니다 개최 참조의 수를 알 필요가있는 경우 - 그것은 백업주기 컬렉션 참조 카운팅 수집을 포함하는 메모리 관리 툴킷을 가지고, 당신이해야 수집기에 연결하여 복제주기 콜렉터를 실행 한 후 오브젝트에 보유 된 참조 수를 판별 할 수 있어야합니다 (오브젝트가 전이 참조를 보유하고 있지 않은 경우 제외). RVM을 사용하는 것은 간단한 작업이 아닙니다. 또한 프로덕션 환경에서 RVM을 사용하지 않아야합니다.이 도구는 엄격한 연구 도구입니다.

는 또한 아이디어가 획득 객체에 WeakReference를 등록 getObject 통해 객체에 대한 참조를 얻기 위해 개체를 강제하는 것입니다 다음

public class Wrapper<T> { 
    private WeakReference<T> thisReference; 
    private ConcurrentLinkedQueue<WeakReference<Object>> references = 
    new ConcurrentLinkedQueue<>(); 

    public T getObject(Object obj) { 
    T thisObject = thisReference.get(); 
    if(thisObject != null) { 
     references.offer(new WeakReference(obj)); 
    } 
    return thisObject; 
    } 

    public int referenceCount() { 
    if(thisReference.get() == null) { 
     references.clear(); 
     return 0; 
    } else { 
     Iterator<WeakReference<Object>> iterator = references.iterator(); 
     while(iterator.hasNext()) { 
     WeakReference<Object> reference = iterator.next(); 
     if(reference.get() == null) { 
      iterator.remove(); 
     } 
     } 
     return references.size(); 
    } 
    } 
} 

처럼 뭔가를 함께 해킹을 시도 할 수 있습니다. referenceCount은 0이 아닌 WeakReferences의 수를 셉니다. 가짜 수집이 아직 이루어지지 않았으므로 references 컬렉션에 도달 할 수없는 WeakReferences이있을 수 있으므로이 방법은 Jikes를 통해 실제 참조 카운팅 컬렉터를 사용하는 것보다 간단하지만 정확하지는 않습니다. 도망친 thisObjectgetObject을 통해 등록되지 않은 다른 객체로 전달되는 것을 막을 수있는 것도 없습니다. 이것은 또한 Wrapper에 대한 참조를 보유하고있는 사람의 새로운 문제를 소개합니다. 그래서 이것이 당신에게 도움이되는지 확신 할 수 없습니다. 결론은 사용자 코드가 아닌 가상 머신 (예 : Jikes)의 레벨에서 정확한 참조 계산을 수행해야한다는 것입니다.

관련 문제