我的应用程序记录了某些对象的使用情况——我的设置使用 AspectJ 来识别我感兴趣的上下文并记录这些使用情况。我稍后加载日志文件进行分析,但出于效率原因,知道何时不再可访问对象很有用。
我目前的方法是使用“垃圾记录器”记录我感兴趣的对象,然后创建一个包含对象身份哈希码的“保存器”对象,并将其存储在弱哈希图中。这个想法是当对象被收集时,saver 对象将从弱哈希映射中移除并被收集,从而运行代码来记录收集对象的身份哈希码。我使用单独的线程和队列来防止在垃圾收集器中造成瓶颈。这是垃圾记录器代码:
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 方法。