8

嗨考虑我有三个数组变量a[dynamic], b[dynamic], c[dynamic]。它们可以是任何大小现在我想销毁变量说 a。我确定我不会再使用该变量了。欢迎任何想法和建议。

4

3 回答 3

20

您可以向垃圾收集器指示可以通过分配一个数组来释放null它:

    int[] a = new int[someSize];
    int[] b = new int[someSize];
    ....
    // I no longer need 'a'
    a = null;
    // ... but I can still use 'b'

不过有几点需要注意:

  • 这不会释放空间。相反,它使数组有资格被垃圾收集器释放。GC 可能很长一段时间都无法释放它。

  • 事实上,数组只有在不可访问时才有资格进行垃圾回收。如果您已将数组的引用分配给另一个(仍然存在的)变量或可访问对象,则 GC 不会回收它。

  • 在现实生活中的 Java 应用程序中这样做几乎没有任何意义。通常的做法是简单地允许变量在正常的计算过程中超出范围1null如果变量不会长时间超出范围并且它指的是大型数组/对象或网络,您只会显式地显示一个变量(或对象字段或数组元素)。

  • System.gc()在分配null... 或 ever 2之后尝试通过调用来强制 GC 运行是非常不可取的。如果电话有任何影响,它可能会很昂贵。最好让 JVM 在最佳时间安排一次 GC。


1 - 任何合理的 JVM 实现都会知道当方法退出时局部变量会超出范围。JVM 是否以更精细的粒度跟踪范围是特定于实现的,而且(老实说)我不知道JVM 在实践中如何处理这个问题。

请注意,只要GC 不删除可访问(即非垃圾)对象,几乎任何东西在技术上都符合 JLS 要求。这包括一个使用 Epsilon no-op GC 的 JVM,它从不收集垃圾并在 JVM 空间不足时终止它。

2 - 唯一合法的原因是:1)测试 GC 相关功能的行为;例如终结器、引用队列处理器等,或 2) 在实时应用程序中避免有害的 GC 暂停;例如,在实时游戏中更改“级别”时运行 GC。

于 2012-05-10T15:08:25.677 回答
2

Stephen C 已经回答了您的问题,但对于非原始类型,您还想确保如果您不需要数组中的所有对象都标记为 null,这将确保您没有内存泄漏。

就像是:

for(Object obj : myObjectArray){
  obj = null;
}

然后使您的数组引用为空

myObjectArray = null;
于 2012-05-10T15:20:58.937 回答
0

从 arrayList 中删除所有元素

arrayList.removeAll(arrayList);

于 2017-09-15T13:11:43.237 回答