如何在Java中释放内存

Nar*_*odi -1 java

我有这段代码

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
}
Run Code Online (Sandbox Code Playgroud)

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

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

dav*_*xxx 8

一旦A,BC超出范围,这些有资格被垃圾收集.在您的示例中,它表示在for语句的末尾.

现在,如果这些变量没有被任何其他变量引用,那么您可以在使用它们之后立即对它们进行垃圾收集,而无需等待for语句结束,将它们设置为null;

 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;
Run Code Online (Sandbox Code Playgroud)

这并不意味着它现在将释放内存,但至少这些对象在下一个GC集合中将被视为未使用.

编辑

最近的JVM版本在运行时(JIT)执行多个优化.
您可以在Oracle网站上找到有关即时编译和优化的一些解释.
您还可以在同一页面上找到JRockit优化运行时的一些示例.

因此,根据使用的JVM版本,赋值null可能是无用的,因为只要在对象范围内不再使用这些对象,JVM就可以将对象视为超出范围,因此在for语句结束之前.

斯蒂芬对一个足够接近的问题的回答表明了这一点.
不幸的是,我没有找到关于这个特定优化的任何具体信息.

  • 无需为null分配引用.当它们超出范围并且垃圾收集器需要时,它们将被垃圾收集.这是不可预测的. (3认同)
  • @Federico Peralta Schaffner当然,如果范围的末尾在执行代码中"远",则对象将保持为引用,并且可能不会在不需要这些对象时收集.这是OP用例. (2认同)