Java 객체에 대한 참조 수를 확인할 수있는 방법이 있습니까?Java 객체에 대한 참조 수
myObject를 개체에 대한 참조로 만들고 개체가 이미 작업을 완료하도록합니다. 처리 방법으로 죽을 준비를하고 다른 목적으로 참조 myObject를 사용하려고하므로 가비지 수집기를 사용하여이를 삭제할 수 있습니다. 그러나 개체에 대한 다른 참조가없는 것은 아닙니다. 그것을 확인하는 방법?
Java 객체에 대한 참조 수를 확인할 수있는 방법이 있습니까?Java 객체에 대한 참조 수
myObject를 개체에 대한 참조로 만들고 개체가 이미 작업을 완료하도록합니다. 처리 방법으로 죽을 준비를하고 다른 목적으로 참조 myObject를 사용하려고하므로 가비지 수집기를 사용하여이를 삭제할 수 있습니다. 그러나 개체에 대한 다른 참조가없는 것은 아닙니다. 그것을 확인하는 방법?
주석에 설명되어 있듯이 객체에 대한 참조 수를 알고 싶지는 않으므로/거의 알 필요가 없습니다. 가비지 콜렉션의 장점은 프로그램의 한 부분이 프로그램의 다른 부분이 여전히 오브젝트에 대한 참조를 보유하는지 여부를 고려하지 않고 오브젝트에 대한 참조를 널 (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를 통해 실제 참조 카운팅 컬렉터를 사용하는 것보다 간단하지만 정확하지는 않습니다. 도망친 thisObject
이 getObject
을 통해 등록되지 않은 다른 객체로 전달되는 것을 막을 수있는 것도 없습니다. 이것은 또한 Wrapper
에 대한 참조를 보유하고있는 사람의 새로운 문제를 소개합니다. 그래서 이것이 당신에게 도움이되는지 확신 할 수 없습니다. 결론은 사용자 코드가 아닌 가상 머신 (예 : Jikes)의 레벨에서 정확한 참조 계산을 수행해야한다는 것입니다.
왜 중요한가요? 인스턴스를 명시 적으로 'null'할 필요가 없습니다. 도달 할 수 없을 때 * 가비지 수집 될 수 있습니다 (가비지 수집 될 때 또는 지정되지 않은 경우). –
다른 목적으로 myObject를 사용한다고 가정합니다. 나는 조금 질문을 다시한다. –
아니요. 아직도 이해가 안됩니다. ['WeakReference'] (http://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html)를 찾고 있습니까? ? –