删除变量内存

时间:2012-05-10 15:03:44

标签: java memory memory-management

您好我认为我有三个a[dynamic], b[dynamic], c[dynamic]的数组变量。它们可以是任何大小,现在我想破坏变量说a。我相信我不会再使用变量了。任何想法和建议都受到欢迎。

3 个答案:

答案 0 :(得分:19)

您可以通过为其分配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应用程序中,很少有任何意义。通常的做法是在计算的正常过程中简单地允许变量超出范围 1 。如果变量不会长时间超出范围并且它引用大型数组/对象或网络,那么您只需显式null变量(或对象字段或数组元素)。 p>

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


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

请注意,几乎任何事情都技术上符合JLS要求....前提是GC不会删除可到达的(即非垃圾)对象,其中包含一个假设的JVM,没有任何垃圾收集!

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

答案 1 :(得分:2)

Stephen C回答了你的问题,但是对于非原始类型,如果你不需要它,你还要确保数组中的所有对象都标记为null,这样可以确保你没有内存泄漏。

类似的东西:

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

然后使您的数组引用为null

myObjectArray = null;

答案 2 :(得分:0)

从arrayList中删除所有元素

arrayList.removeAll(arrayList);