내 응용 프로그램이 특정 개체의 사용을 기록합니다. 설치 프로그램은 AspectJ를 사용하여 내가 관심있는 컨텍스트를 식별하고 이러한 사용법을 기록합니다. 나중에 분석을 위해 로그 파일을로드하지만 효율성을 이유로 더 이상 객체에 도달 할 수없는 시점을 알면 유용합니다.개체가 가비지 수집 될 때의 로깅
나의 현재 접근법은 내가 관심있는 객체를 '쓰레기 기록원'으로 기록하는 것이다.이 객체는 객체의 신원 해시 코드를 포함하는 '보호기'객체를 생성하고 이것을 약한 해시 맵에 저장한다. 개체가 수집 될 때 보호 개체가 약한 해시 맵에서 제거되어 수집되므로 수집 된 개체의 ID 해시 코드를 기록하는 코드가 실행되는 것이 좋습니다. 가비지 수집기에서 병목 현상을 일으키는 것을 방지하기 위해 별도의 스레드와 큐를 사용합니다. 여기에 쓰레기 로거 코드는 다음과 같습니다
public class GarbageLogger extends Thread {
private final Map<Object,Saver> Savings =
Collections.synchronizedMap(new WeakIdentityHashMap<Object,Saver>());
private final ConcurrentLinkedQueue<Integer> clearTheseHash =
new ConcurrentLinkedQueue<Integer>();
public void register(Object o){
Savings.put(o,new Saver(System.identityHashCode(o));
}
private class Saver{
public Saver(int hash){ this.hash=hash;}
private final int hash;
@Override
public void finalize(){
clearTheseHash.add(hash);
}
}
@Override
public void run(){
while(running){
if((clearTheseHash.peek() !=null)){
int h = clearTheseHash.poll();
log(h);
}
else sleep(100);
}
}
// logging and start/end code omitted
}
내 문제는 공간이 필요하지 않은 경우 약한 해시 맵이 반드시 그 항목을 삭제하지 않기 때문에이 개체가 후, 나는 오랜 시간을 기다리고있을 수도, 매우 복잡한 보인다이다 녹음하기 전에 수집합니다. 기본적으로, 나는 이것을 달성하기위한 더 좋은 방법을 찾고 있습니다.
주 - 임의의 개체를 모니터링하고 해당 개체를 제어 할 수 없으므로 finalize 메서드를 재정의 할 수 없습니다.
정말 원하는 것 같다 [참조 대기열] (http://stackoverflow.com/a/14450693/869736). –
그래서 WeakIdentityHashMap 및 ConcurrentLinkedQueue를 ReferenceQueue로 대체 하겠지만 GarbageLogger 스레드가 수집 된 참조를 팝하고 로그 할 필요가 있습니까? – selig
맞습니다. –