在循环之后释放Java for循环内部的内存吗?

时间:2014-04-16 03:17:21

标签: java memory

for(int i = 0; i < len i++) {
    List<Integer> a =  new ArrayList<Integer>();
    a.add(1)
    a.add(2)
}

有人告诉我,在此循环完成后,将释放与a关联的内存。在循环期间,是仅为一个列表或len * listmemory分配的内存?

我的意思是在内存中使用了多少字节,比如8 * len或只是说8?

在我的项目中,列表非常庞大,所以我想知道,如果我把声明放在for循环之外,那么内存使用的用量是否比这小得多?

1 个答案:

答案 0 :(得分:2)

您似乎正在分配len个列表。通常,您将声明放在循环之外。另外,你已经删除了类型说明符(它会给你一个警告,你不应该忽略它们) -

List<Integer> a = new ArrayList<>(); // Or ArrayList<Integer> in Java before 1.7

for(int i=0; i < len; i++) { // <-- Missing semi-colon after len.
  // List<Integer> a =  new ArrayList(); // <-- define outside the loop.
  a.add(1); // <-- Missing semi-colon.
}

最后,当列表a无法再访问时,它将有资格进行垃圾回收。在Java中,您没有明确管理内存。

编辑)在循环中创建的每个List实例中有多少元素无关紧要,当引用无法访问时,它就有资格进行垃圾回收。什么时候(甚至是)垃圾收集会发生无保证

内存使用情况取决于实现(但我认为默认ArrayList大小为10)。每个Integer都是一个包含4字节整数和一些开销的包装器......也许是40位?因此,大约len * 10 * 4个字节 - 当然垃圾收集可以在循环期间的任何时刻运行。