【问题标题】:Why ArrayList.clear() method doesn't free memory?为什么 ArrayList.clear() 方法不释放内存?
【发布时间】:2016-02-23 02:05:19
【问题描述】:

我正在研究 ArrayList.clear() 并发现它没有释放内存,而是使该列表为空。 当你可以手动告诉编译器不再需要这个特定的 ArrayList 时,你为什么要等待 GC 来释放内存(它可以在 clear 方法本身中完成)。!!

你为什么要不必要地给 GC 额外的头痛。

我知道 System.gc() 会影响应用程序的性能,因为它会为整个应用程序运行垃圾收集。

如果我的服务器内存有限且列表大小太大,有什么办法可以收集这个特定的 ArrayList 垃圾而不是等待 GC 来救援。

编辑:- 出现这个问题是因为我已经初始化了一个 ArrayList(500000) 并且假设我的对象大小大约是 1000 字节,因为一些预初始化的变量但是由于形成第一个对象本身的一些异常,我需要从该函数返回并释放该内存我已分配给该 ArrayList。我希望我的应用程序消耗尽可能低的内存。 GC是我最后的选择。

【问题讨论】:

  • Java 中的内存由系统为您管理...如果内存不足,它将首先尝试通过垃圾回收来回收所有内存。通过取消引用对象(使其成为null),您告诉gc 可以回收取消引用的对象使用的内存。
  • 是java内存模型。所有内存都由垃圾收集器释放。还;如果数组列表中的项目在其他地方使用,你希望它们被释放吗?数组本身也可以在其他地方使用(尽管您可能必须使用反射来获取它)
  • 垃圾收集器是Java中释放内存的唯一方法。但坦率地说,它是如此之快,你不应该在意。

标签: java optimization arraylist memory-leaks garbage-collection


【解决方案1】:

你为什么要等待 GC 来释放内存(它可以在 clear 方法本身中完成)

不,它不能。 ArrayList 确实不会再引用对象了,但是 clear() 方法不知道它们是否还在其他地方被引用,所以这就是垃圾收集器的工作。

【讨论】:

    【解决方案2】:

    你为什么要等待 GC 来释放内存(它可以 已经在明确的方法中完成了)

    上面那句话有个很大的误区:Java中所有内存都是GC释放的,没有办法手动释放堆上对象占用的内存。

    但是要回答为什么clear() 会清空所有元素而不是丢弃旧的支持数组的问题,简单的答案是“因为它是这样写的”。

    稍长一点的答案是,您通常在用新元素重新填充列表之前使用clear(),因此丢弃旧数组并分配一个新数组(然后可能需要重新分配几次才能达到相同的size 作为早期的后备数组)被认为太浪费了。

    另一方面,如果您想永久删除 ArrayList,则无需调用 clear(),只需取消对列表本身的任何引用即可。

    【讨论】:

      猜你喜欢
      • 2011-01-04
      • 2013-01-12
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多