可达"/>
java怎么声明对象强可达
慕森王
这里有点猜测。即使堆栈上的局部变量中有对象的引用,即使存在主动调用堆栈上该对象的实例方法!要求对象是达不到..即使它在堆栈上,如果后续代码没有接触到该引用,它也可能是不可访问的。看见另一个答案例如,当引用对象的局部变量仍在作用域时,如何对象进行GC‘编辑。下面是一个示例,说明如何在实例方法调用处于活动状态时最终确定对象:class FinalizeThis {
protected void finalize() {
System.out.println("finalized!");
}
void loop() {
System.out.println("loop() called");
for (int i = 0; i
if (i % 1_000_000 == 0)
System.gc();
}
System.out.println("loop() returns");
}
public static void main(String[] args) {
new FinalizeThis().loop();
}}而loop()方法是活动的,任何代码都不可能使用引用FinalizeThis对象,所以它是不可触及的。因此,它可以最后确定和GC‘。在JDK 8 GA上,这将打印以下内容:loop() called
finalized!loop() returns每次。可能会发生类似的事情MimeBodyPart..它是否存储在局部变量中?(看起来是这样的,因为代码似乎遵循一种惯例,即字段以m_(前缀)更新在评论中,“任择议定书”建议作以下修改: public static void main(String[] args) {
FinalizeThis finalizeThis = new FinalizeThis();
finalizeThis.loop();
}对于这一变化,他没有观察到最后定稿,我也没有观察到。然而,如果做了进一步的更改: public static void main(String[] args) {
FinalizeThis finalizeThis = new FinalizeThis();
for (int i = 0; i
Thread.yield();
finalizeThis.loop();
}最后定稿再次发生。我怀疑原因是如果没有循环,main()方法是解释的,而不是编译的。对于可达性分析,解释器可能不太积极。在收益率循环就位后,main()方法被编译,JIT编译器检测到finalizeThis已变得不可及,而loop()方法正在执行。触发此行为的另一种方法是使用-Xcomp选项,它强制在执行之前对方法进行JIT编译。我不会以这种方式运行整个应用程序-JIT-编译所有东西都会非常缓慢,占用大量的空间-但是它对于在小型测试程序中清除这种情况很有用,而不是修补循环。
更多推荐
java怎么声明对象强可达
发布评论