这是我的问题 - 我想计算一个对象从给定点(可能是对象创建)开始存活多长时间(即在堆上)。我不需要记录这在死亡时有多长时间,只是在某个时刻。
我目前的想法是创建一个WeakReference
记录开始和结束时间的扩展,即
public class WeakTimeReference extends WeakReference<Object> {
private final long start;
private long end = -1;;
public WeakTimeReference(Object obj, ReferenceQueue<Object> queue){
super(obj,queue);
long = System.currentTimeMillis();
}
public Long getLife(){ return (end == -1) ? null : end-start; }
}
然后将这些添加到一个WeakHashMap
(这样我就可以知道我什么时候已经创建了一个引用),即
private Map<Object,WeakTimeReference> map =
new WeakHashMap<Object,WeakTimeReference>();
private ReferenceQueue queue = new ReferenceQueue();
public void add(Object o){
if(!map.containsKey(o))
map.put(o,new WeakTimeReference(o,queue));
}
然后,当我想知道时间时,我只看queue
即
while(queue.poll()){
WeakTimeReference ref = (WeakTimeReference) queue.remove();
// do something with ref.getLife()
}
但是,问题是我不确定如何end
在WeakTimeReference
. 没有方法可以覆盖,Reference
当它入队时被调用,或者任何这样的方法ReferenceQueue
。
我唯一的想法是,我可以用一个类来包装对象,该类有一个finalize
为我执行此操作的方法,并将它们放在WeakHashMap
被包装对象指向的指针中。但这似乎很混乱。
所以我的问题是:
当参考对象被放置在参考队列上时,无论如何要执行操作?
如果做不到这一点,任何人都可以看到我实现这一目标的更简洁的方法吗?