jvm 在方法中本地创建的对象的垃圾收集

ubbxdtey  于 2022-11-07  发布在  其他
关注(0)|答案(2)|浏览(144)

我认为,如果一个对象是在一个方法中本地创建的,并且从来没有泄漏到外部,那么一旦该方法执行完成,该对象就有资格进行垃圾回收。
但是我很困惑,因为我读到有4个GC根-其中一个是线程对象,所以我很困惑,只有当创建方法本地对象的线程完成并且该线程的GC根被删除时,方法本地对象才有资格进行垃圾回收吗?
另外,如果有人能解释一下方法局部对象是如何链接到堆的堆栈区域的。
请注意,我读过关于方法局部对象的GC的文章,但是没有得到明确和详细的答案,所以我提出了这个问题。

kpbpu008

kpbpu0081#

把线程调用栈看作是栈帧节点的双向链表。每个节点引用给定方法的所有局部变量,而这些局部变量又引用任何活动对象。线程的GC根本质上是链表的头节点,垃圾回收跟踪仍然链接的节点,从而找到所有活动对象。当方法返回时,链表的尾节点被删除,因此GC无法再发现它。
实际上,调用堆栈不是以这种方式实现的,但行为基本上是相同的。

wwtsj6pe

wwtsj6pe2#

方法局部对象一旦停止使用,就可以进行垃圾回收,无论该方法是否已完成。
方法实际上与垃圾收集几乎没有任何关系。

相关问题