6

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

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

4 回答 4

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

垃圾回收很少会回收本地人的内存,所以垃圾回收大多已经在函数范围之外发生了。

于 2013-02-09T16:54:03.660 回答
1

在 java 中,您不需要显式释放对象,无论它们是来自数组的引用,还是简单的字段或变量。一旦对象不是从根集强可达的,垃圾回收迟早会释放它。并且尝试帮助 GC 完成其工作通常是不合理的。阅读这篇文章了解更多详情。

于 2013-02-09T16:55:17.543 回答
0

好吧,当不再引用所有对象时,垃圾收集器将自动收集它们。你不必为此烦恼。不过,如果您愿意,您可以将 null 分配给数组,并且在下次运行 GC 时,分配给数组的内存将自行释放。对于显式运行 GC,您可以执行

    java.lang.Runtime.getRuntime().gc();
于 2013-02-09T16:53:44.443 回答
0

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

于 2013-05-29T19:58:22.767 回答