我有这样的代码:
public void foo()
{
Object x = new LongObject();
doSomething(x);
//More Code
// x is never used again
// x = null helps GB??
Object x2 = new LongObject();
doSomething(x2);
}
我希望如果需要的话,由 x 分配的内存可以被 GC 释放。但我不知道是否有必要设置为 null,还是编译器这样做。
最佳答案
事实上,JIT 对引用进行 active 分析(在字节码级别存储为当前帧中的槽)。如果不再读取某个引用,则可以重用其槽,JIT 会知道这一点。当引用该对象的变量仍在词法作用域中时,该对象完全有可能被垃圾回收,只要编译器和 JIT 能够证明该变量永远不会再次被取消引用。
要点是:范围是语言的构造,并指定像x
这样的名称在文本中任何点的含义它发生的程序代码。 生命周期是对象的一个属性,JIT 和 GC 经常以不明显的方式管理它。
请记住,JIT 可以在运行时重新编译您的代码,并在查看执行时发生的情况时优化您的代码。除非您确实确信自己知道自己在做什么,否则不要试图比 JIT 更聪明。编写正确的代码并让 JIT 完成其工作,并且仅当您有证据表明 JIT 未充分完成其工作时才担心它。
关于java - GC 如何在范围中间工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47652357/