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