【发布时间】:2018-08-26 13:59:59
【问题描述】:
在这种情况下,我需要一些解决方案来帮助我了解一些方法:
void myMethod(...)
{
MyObject obj = new MyObject();
// do stuff
}
如果此方法已结束或 obj 不可达(这将表明该方法已结束)。
我正在编写一个小型 java 代理,我希望有一些技术可以让我确定此方法已结束或 obj 无法访问...在我的情况下,“do stuff”部分不使用对象。它不会将此变量传递到其他地方或将其添加到某个集合中。
我知道通过 Weak/Soft/Phantom-References 我可以部分实现这一点。如果调用了 GC,则通过:
void myMethod(...)
{
MyObject obj = new MyObject();
WeakReference objReference = new WeakReference(obj);
// do stuff
}
我总是可以在不同的地方验证:
if (objReference.get() == null) ...
但是,这只有在发生 GC 时才可能成立。
有没有其他方法可以实现这一目标? 例如,一些标记 JVM 可能会放在这个变量上,因为很明显这是一个绝对可以被垃圾回收的局部变量......
我不想依赖 ASM - 并为所有这些方法添加一个 try-finally 包装器。希望有一个更微妙、基于参考的解决方案。
【问题讨论】:
-
在定义局部变量后将其放入堆栈/队列中,在方法的最后拉取它。您可能依赖方法的结果(将其存储在某处),如果它存在,很明显它的所有局部变量都不是“活动的”。不过,我不明白这样做的目的。
-
方法的结尾不是微不足道的——它可能是 if/else 分支中的一堆返回,或者如果该方法抛出并捕获了异常,那也将终止该方法的执行
标签: java weak-references soft-references phantom-reference