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);
}
}