我只是希望有人向我解释一下GC如何发现那些内存块(如红色区域所示)是垃圾,当它们的引用数量大于0但它们几乎无法访问时?
答案 0 :(得分:12)
有一组被认为始终可访问的“根对象”:例如,线程引用,静态变量,类引用。如果通过这些根对象的引用链接无法访问某个对象,则认为它可用于GC,即使存在对该对象的一些引用。
答案 1 :(得分:3)
GarbageCollector基于Java Memory Model工作。在java中可用的应用程序内存分为两部分:Heap和Stack。对象存储在堆内存中,可通过两种方式访问: -
1)对象可以具有存储在堆栈存储器中的引用变量。在这种情况下,可以使用它的引用变量直接访问对象。
2)对象可以包含在任何其他对象中,并且在堆栈内存中不会有任何引用。在这种情况下,只能使用该容器对象访问此对象。因此,如果容器对象被垃圾收集,则此对象必须符合垃圾回收的条件。
在执行GarbageCollection时,GarbageCollector检查对象是否可以通过堆栈中可用的任何引用直接或间接访问,如果它是,那么它将不会收集此对象,否则它会收集它。
答案 2 :(得分:0)
GC算法的细节是依赖于Java的实现,因此它取决于您的VM。但大多数虚拟机不使用引用计数。官方VM甚至还有几种可配置的算法。因此很难概括这一点。