我有这段代码
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)
我使用内存创建数组多少次,我能有效地使用内存吗?我不需要以前的数组,我只需要当前的数组.
我不想使用任何额外的内存来存储以前的数组?我的代码内存有效吗?
一旦A
,B
并C
超出范围,这些有资格被垃圾收集.在您的示例中,它表示在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
语句结束之前.
斯蒂芬对一个足够接近的问题的回答表明了这一点.
不幸的是,我没有找到关于这个特定优化的任何具体信息.