2

我知道对象引用或对象句柄本身具有大小,并且大小取决于 JVM。我只是想知道它被明确设置为空后会发生什么。假设我们有一个变量Object o = new Object(),然后我们设置o = null. 会被垃圾回收吗?

4

3 回答 3

4

在您的示例中:

Object o = new Object()
o = null;

假设o是一个字段或一个局部变量/参数。在前一种情况下,它在其他(外部)对象中占用 4/8 个字节。当外部对象被垃圾收集时,这些字节将被垃圾收集。

如果o是参数/局部变量,则不需要垃圾收集,JVM 将“回收”堆栈并简单地重用/擦除该空间。

于 2012-04-19T21:15:00.953 回答
1

引用不是对象,它们不受 GC 的影响,除了包含它们的对象。它们存在于词法作用域中,并且具有相同的生命周期。

于 2012-04-19T22:22:29.030 回答
1

当存在任何类型的引用时,不会对任何对象进行垃圾收集。如果指向一个对象的所有引用都设置为 null 或指向其他对象,则该对象可能会被垃圾回收,但它将不再是“这些引用所引用的对象”。

请注意,Java 有一个名为 的类WeakReference,该类旨在保存对对象的引用,而不会阻止它被垃圾收集。如果当系统执行垃圾收集时,存在任何作为 a 的目标的对象WeakReference,但否则有资格进行垃圾收集,则系统将使WeakReference. 那时,如果WeakReference在它失效之前没有人询问它的目标,那么将不再有对该对象的任何引用,因此它将有资格被收集。

于 2012-04-19T23:33:16.967 回答