Java 为对象的寿命计时

Java 为对象的寿命计时,java,weak-references,Java,Weak References,这是我的问题——我想计算一个对象在给定点(可能是对象创建)的活动时间(即在堆上)。我不需要记录死亡时的时间,只是在某个时刻 我目前的想法是创建一个WeakReference扩展,记录开始和结束时间,即 public class WeakTimeReference extends WeakReference<Object> { private final long start; private long end = -1;; public WeakTimeRe

这是我的问题——我想计算一个对象在给定点(可能是对象创建)的活动时间(即在堆上)。我不需要记录死亡时的时间,只是在某个时刻

我目前的想法是创建一个
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; }

}
然后,当我想知道时间时,我只需查看
队列
,即

while(queue.poll()){
   WeakTimeReference ref = (WeakTimeReference) queue.remove();
   // do something with ref.getLife()
}
然而,问题是我不确定如何在
WeakTimeReference
中设置
end
。在排队时调用的
Reference
中没有可重写的方法,或者
ReferenceQueue
中的任何此类方法

我唯一的想法是,我可以用一个类来包装对象,这个类有一个
finalize
方法来为我完成这项工作,并将它们放在包装对象指向的
WeakHashMap
中。但这看起来很混乱

所以我的问题是:

当引用对象被放置在引用队列上时,是否仍要执行操作

如果做不到这一点,有人能为我找到一种更简洁的方法来实现这一点吗?

使用终结器,但您必须遵循以下模式:

protected void finalize() throws Throwable
{
  try
  {
    // your code here
  }
  finally
  {
    super.finalize();
  }
}

或者,使用Java时,您将尽可能接近未定义的行为。

使用带有回调处理程序的包装器,它将在对象被GCed时通知观察者

class Wrapper implements ObjectInterface {
   Object obj;
   Statistics statisics;
   long t0 = System.currentTimeMillis;
   ...
   protected finalize() {
      statisics.notify(obj, System.currentTimeMillis - t0);
   }
}

我认为Spring AOP可以很好地完成这项任务

为什么需要这个?垃圾收集语言应该能将你与此隔离。我正在进行研究,以了解垃圾收集对其他事物的影响,所以我想建立一个关于某些对象存活时间的概念。但是我不想进入JVM内部,在这种情况下,使用终结器可能是最好的方法。但仅用于研究目的。而且也不能保证它在JVM之间是一致的。
class Wrapper implements ObjectInterface {
   Object obj;
   Statistics statisics;
   long t0 = System.currentTimeMillis;
   ...
   protected finalize() {
      statisics.notify(obj, System.currentTimeMillis - t0);
   }
}