我知道对象引用或对象句柄本身有一个大小,并且大小取决于JVM。我只是想知道在显式设置为null后会发生什么。假设我们有变量Object o = new Object()
,之后我们设置o = null
。它会被垃圾收集吗?
答案 0 :(得分:4)
在你的例子中:
Object o = new Object()
o = null;
假设o
是字段或局部变量/参数。在前一种情况下,它在一些其他(外部)对象中占用4/8字节。当外部对象被垃圾收集时,这些字节将被垃圾收集。
如果o
是参数/局部变量,则不需要垃圾回收,JVM将“回收”堆栈并简单地重用/擦除该空间。
答案 1 :(得分:1)
引用不是对象,除了包含它们的对象之外,它们不受GC的约束。他们生活在词汇范围内,他们的生命周期相同。
答案 2 :(得分:1)
当对象存在任何类型的引用时,不会对其进行垃圾回收。如果指向对象的所有引用都设置为null或者指向其他对象,则该对象可能被垃圾收集,但它将不再是“这些引用引用的对象”。
请注意,Java有一个名为WeakReference
的类,它用于保存对象的引用,而不会阻止它被垃圾回收。如果系统执行垃圾收集时,存在任何作为WeakReference
目标的对象,但否则有资格进行垃圾收集,系统将使{{1}无效}}。此时,如果在WeakReference
无效之前没有人询问WeakReference
目标,那么将不再对该对象进行任何引用,因此它将有资格进行收集。