取消引用数组中的对象以进行Java垃圾收集

时间:2013-02-09 16:47:36

标签: java arrays garbage-collection dereference

我已经对java垃圾收集器做了一些研究,并了解不再引用的对象将/应该由垃圾收集器处理。就对象数组而言,我知道将新对象分配给数组中的某个位置并不能正确释放先前分配的对象。

  1. 我想知道如何从x位置的数组中删除并正确释放对象,并将新对象分配给x位置的同一个数组。
  2. 我还想知道如何正确释放数组本身。

4 个答案:

答案 0 :(得分:9)

将数组中的对象设置为null或其他对象使其符合垃圾回收的条件,假设没有对存储在任何地方的同一对象的引用。

所以,如果你有

Object[] array = new Object[5];
Object object = new Object() // 1 reference
array[3] = object; // 2 references
array[1] = object; // 3 references


object = null; // 2 references
array[1] = null; // 1 references
array[3] = new Object(); // 0 references -> eligible for garbage collection

array = null; // now even the array is eligible for garbage collection
// all the objects stored are eligible too at this point if they're not
// referenced anywhere else

垃圾收集很少会回收当地人的记忆,所以垃圾收集主要发生在函数范围之外。

答案 1 :(得分:1)

在java中,您无需显式释放对象,无论它们是来自数组的引用,还是简单的字段或变量。一旦对象不能从根集强烈到达,垃圾收集迟早会解除分配。尝试帮助GC完成工作通常是不合理的。有关详细信息,请阅读此article

答案 2 :(得分:0)

垃圾收集器在不再引用时会自动收集所有对象。你不必为此而烦恼。仍然如果你想要你可以为数组和下一次运行GC分配null,它分配给数组的内存将被释放。要明确地运行GC,您可以执行

    java.lang.Runtime.getRuntime().gc();

答案 3 :(得分:0)

对象分配应在关闭或打开时通过使对象归零来进行。 JUnit测试对对象执行assertGC以确保所有对象都被垃圾回收。如果项目有引用,Java不会对项目进行垃圾回收。我强烈建议进行JUnit测试。