我有这段代码
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
}
我使用内存创建数组的次数,我可以有效地使用内存吗?我不需要以前的阵列,我只需要当前的阵列。
我不想使用任何额外的内存来存储以前的数组?我的代码内存是否有效?
答案 0 :(得分:8)
只要A
,B
和C
超出范围,这些就有资格进行垃圾回收。在您的示例中,它表示for
语句的末尾。
现在,如果这些变量没有被任何其他变量引用,那么您可以在使用它们后立即对它们进行垃圾收集,而不必等待for
语句的结束,方法是将它们设置为{{1} };
null
这并不意味着它现在会释放内存,但至少这些对象在下一个GC集合中将被视为未使用。
编辑
最近的JVM版本在运行时(JIT)执行多个优化
您可以在Oracle网站上找到有关Just-In-Time Compilation and Optimization的一些解释
您也可以在同一页面some examples of JRockit optimizations runtime找到。
因此,根据使用的JVM版本,对 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;
的赋值可能没用,因为只要这些对象在其范围内不再使用,JVM可能会认为这些对象超出了范围,因此null
声明的结尾。
The Stephen's answer足够接近的问题表明了这一点 不幸的是,我没有找到任何有关此特定优化的具体信息。