java - GC 如何在范围中间工作

标签 java garbage-collection

我有这样的代码:

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/

相关文章:

java - 系统类和 println() 方法

java - 获取存储过程的小数输出参数时的 JDBC 异常

java - 所有排列的高效计算

c# - 是否可以 Hook GC 收集的对象?

java - 为什么java没有确定性析构函数?

java - Sun JVM 能否毫无问题地处理巨大的堆大小?如何处理?

node.js - NodeJS V8 没有进行正确的垃圾收集

java - 如何在python或java中准确计算该文件的页数?

java - OWL中的CRUD操作

java - Hadoop:堆空间和gc问题