Memory leaks 当循环引用的访问路径中断时,Java垃圾收集器如何处理循环引用?

Memory leaks 当循环引用的访问路径中断时,Java垃圾收集器如何处理循环引用?,memory-leaks,garbage-collection,heap-memory,Memory Leaks,Garbage Collection,Heap Memory,我只是想有人向我解释一下,当这些内存块的引用计数大于0但实际上无法访问时,GC是如何发现这些内存块(如红色区域所示)是垃圾的? 有一组“根对象”被认为是始终可访问的:例如线程引用、静态变量、类引用。如果无法通过这些根对象的引用链接访问某些对象,则认为该对象可用于GC,即使存在对该对象的一些引用。GC算法的详细信息在Java中取决于实现,因此它取决于您的VM。但是大多数虚拟机不使用引用计数。官方的虚拟机甚至有几种可配置的算法。所以很难对此进行概括。垃圾收集器基于Java内存模型工作。在java中,

我只是想有人向我解释一下,当这些内存块的引用计数大于0但实际上无法访问时,GC是如何发现这些内存块(如红色区域所示)是垃圾的?
有一组“根对象”被认为是始终可访问的:例如线程引用、静态变量、类引用。如果无法通过这些根对象的引用链接访问某些对象,则认为该对象可用于GC,即使存在对该对象的一些引用。

GC算法的详细信息在Java中取决于实现,因此它取决于您的VM。但是大多数虚拟机不使用引用计数。官方的虚拟机甚至有几种可配置的算法。所以很难对此进行概括。

垃圾收集器基于Java内存模型工作。在java中,可用的应用程序内存分为两部分:堆和堆栈。对象存储在堆内存中,可通过两种方式访问:-

1) 对象可以具有存储在堆栈内存中的引用变量。在这种情况下,可以使用对象的引用变量直接访问对象

2) 对象可以包含在任何其他对象中,并且在堆栈内存中不会有任何引用。在这种情况下,只能使用该容器对象访问该对象。所以,若容器对象是垃圾收集的,那个么这个对象必须符合垃圾收集的条件

在执行GarbageCollection时,GarbageCollector检查对象是否可以通过堆栈中的任何可用引用直接或间接访问,如果是,则它不会收集该对象,否则它会收集该对象