2016-11-08 15 views
-4

只是想知道,如果当你设置是否有资格进行垃圾回收的Java中的所有内容都为null?

obj1 = null; 

的对象符合GC,是不是也不错,一切都与一个空值在技术上也有资格?

我特别想了解一下数组,说如果你有类似

[obj1, obj2, null, obj3, null, obj 4, obj5] 

GC运行,并可以删除空对象,因此这些元素为空?

+3

对象不能为空,对象*引用*可以。 GC不会删除变量或数组索引。它只能清理无法访问的对象。 – shmosel

+1

@shmosel ...反过来,只有对象可以被垃圾收集,而不是引用。 – biziclop

+1

'obj1'前面提到的实例*可能*在'obj1 = null'后可用于GC;但许多其他参考文献仍然可能指向该实例,从而阻止它。 –

回答

1

不存在“null对象”,null是存在于空引用中最接近的东西。关键定义在Java语言规范中,4.3.1. Objects

对象是一个类实例或一个数组。

引用值(通常只是引用)是指向这些对象的指针,以及指向没有对象的特殊空引用。

obj1 = null;将参考变量obj1更改为空。如果它以前提到一个对象,它不再这样做。

可能有其他引用指向该对象的引用,以便该对象保持可达状态,并且垃圾收集器将使其保持独立。如果obj1是该对象的最后一个引用,则不再可访问该对象,并有资格进行最终确定。

+0

好的,谢谢。我可以问,是否它的对象也持有引用,类实例/数组可以有一个空字符串等?对不起,我有点困惑。 – mucashinto

+0

@mucashinto是的,对象字段既可以是基本类型,比如“int”,也可以是它们自身的引用,它们可以是null或者指向某个对象的指针。 –

6

垃圾收集收集对象,它不收集对象的引用。垃圾收集零的想法是没有意义的。当一个对象不再有任何指向它的引用时,GC会在最简单的层次上进行操作,并在那个时候释放内存。它并不关心有多少引用指向null,它只关心一个对象有多少个传入引用。

不,GC不会从阵列中删除空值。这不是它所做的。除此之外,数组中的空值是完全有效的,删除它会破坏很多程序。

+0

谢谢Gabe。 – mucashinto