【问题标题】:How to free memory in Java [duplicate]如何在 Java 中释放内存 [重复]
【发布时间】:2017-04-15 13:31:27
【问题描述】:

我有这个 sn-p 的代码

A = new int[100];
B = new int[100];
C = boolean[100];

for(int i=1;i<=10000000;i++)
{
     A = new int[100];
     B = new int[100];
     C = boolean[100];

     // Do Something

     // Now i don't need A,B,C Array
}

我使用内存创建数组多少次,我可以有效地使用内存吗?我不需要以前的数组,我只需要当前的。

我不想使用任何额外的内存来存储以前的数组?我的代码记忆效率高吗?

【问题讨论】:

  • 我假设这段代码是方法的一部分?如果是这样,只要您的代码离开该方法,ABC 就会超出范围。然后垃圾收集器会处理它,所以你很好。当然,您始终可以将它们显式设置为null
  • 查看java 垃圾收集器 以了解对象的管理方式。原始类型变量超出范围时会被删除。
  • 请遵循命名约定。

标签: java


【解决方案1】:

一旦ABC 超出范围,它们就有资格被垃圾回收。在您的示例中,这意味着在 for 语句的末尾。

现在,如果这些变量没有被任何其他变量引用,您可以通过将它们设置为 null 来使它们在使用后立即被垃圾回收,而无需等待 for 语句的结束;

 A = new int[100];
 B = new int[100];
 C = boolean[100];

// processing where these are required
...
// processing where these are not required
 A = null;
 B = null;
 C = null;

这并不意味着它会立即释放内存,但至少这些对象将在下一次 GC 收集中被视为未使用。

编辑

最近的 JVM 版本在运行时 (JIT) 执行多项优化。
您可以在 Oracle 网站上找到一些关于 Just-In-Time Compilation and Optimization 的解释。
您也可以在同一页面上找到some examples of JRockit optimizations runtime

因此,根据使用的 JVM 版本,分配给 null 可能是无用的,因为一旦这些对象不再在其范围内使用,JVM 可能会认为这些对象超出范围,所以在结束之前for 声明。

The Stephen's answer 一个足够接近的问题建议它。
不幸的是,我还没有找到任何关于这个特定优化的具体信息。

【讨论】:

  • 无需将引用分配给 null。当它们超出范围并且垃圾收集器需要时,它们将被垃圾收集。这是不可预测的。
  • @Federico Peralta Schaffner 当然,但是如果在执行的代码中范围的末尾是“远”,则对象将保持引用状态并且可能不会被收集,而这些对象不是必需的。这是 OP 用例。
  • @Federico Peralta Schaffner “只要 A、B 和 C 超出范围,它们就有资格被垃圾收集。在您的示例中,这意味着在 for 语句的末尾。”是我回答的第一句话。
  • @Federico Peralta Schaffner 感谢您提供这个有趣的链接。似乎某些 JVM 版本在对象不再使用时可能会认为它“不可访问”。
  • Brian Goetz,大部分 API 的作者和公认的 Java 大师,写过试图通过使引用无效来“帮助”GC 的徒劳和危害。在某些特定情况下您需要这样做,否则这是一个坏主意。 @davidxxx 如果作用域的结束距离足够远而对 GC 产生不利影响,那么它就是写得不好的代码。无论如何,GC 不应该删除不需要的对象。关键是在最小必要范围内声明引用并管理对象生命周期。 Nulling 引用对于懒惰的程序员来说是一种技巧,他们没有仔细考虑。
猜你喜欢
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多