一些文章指出,OpenJDK/Oracle1.6/1.7/1.8JVM默认使用以下卡片标记逻辑。(http://psy-lob-saw.blogspot.hk/2014/10/the-jvm-write-barrier-card-marking.html),但在维基Tracing garbage collection中,它声称三色算法也有很好的性能。
我很困惑,有没有jvm使用三色标记算法?也就是说,与卡片打标算法相比,三色打标的优势在哪里?
发布于 2018-10-04 14:13:46
我认为卡片标记算法和三色算法用于不同的目的:卡片标记用于跟踪从终生一代到年轻一代的引用。三色算法用于从根集合中找出哪些对象是可达的。三色算法使用由卡片标记算法识别的对象集作为GC根。
发布于 2016-05-05 02:39:08
卡片标记不是针对单个对象的,而是一次针对多组对象的。基本上,它是为了跟踪区域间的引用。如果你在区域A,B,C中有内存,A中的所有对象都是自包含的,B中的所有对象都是自包含的,C中的所有对象都是自包含的,那么你没有标记任何卡片。因此,当涉及到垃圾收集A时,您不需要考虑B或C中的任何对象来了解A中的对象是否可达-因此,您可以在本地清除它们。
因此,卡片标记所做的是优化执行垃圾收集时需要扫描的内存量。
当B中的对象引用A中的对象时,卡片表将被标记,以指示存在跨区域引用。因此,当垃圾收集A时,它还需要遍历B(或者更准确地说,B的子集已经被卡片标记为引用区域外的对象),以确定B中的对象是否仍然活着。因此,它将增量GC的问题从“所有对象”转移到“A和B中的所有对象”。在这种情况下,C根本不会被处理。
这些标记技术适用于对象集;它们不处理单个对象保留。因此,与卡片标记一样,对象也有标记标志(在每个实例的标记字中),其中包含对象是否已被标记/扫描/无论GC算法是什么。此标志中的各个位用于此目的,包括指示对象是否已被标记的特殊情况位,以及mark word implementation中特定于CMS收集器的位。然而,这些细节在不同的版本中可能会有所不同,并且会因使用的GC类型而有所不同。
在任何情况下,这里的要点是,卡片标记用于表示区域外的对象集,并且标记实例的方式使用一种特定于正在使用的GC的不同技术。这不是非此即彼的情况。
https://stackoverflow.com/questions/37000111
复制相似问题