首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有jvm使用三色标记算法来标记可达对象?

有没有jvm使用三色标记算法来标记可达对象?
EN

Stack Overflow用户
提问于 2016-05-03 17:12:59
回答 2查看 538关注 0票数 1

一些文章指出,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使用三色标记算法?也就是说,与卡片打标算法相比,三色打标的优势在哪里?

EN

回答 2

Stack Overflow用户

发布于 2018-10-04 14:13:46

我认为卡片标记算法和三色算法用于不同的目的:卡片标记用于跟踪从终生一代到年轻一代的引用。三色算法用于从根集合中找出哪些对象是可达的。三色算法使用由卡片标记算法识别的对象集作为GC根。

票数 2
EN

Stack Overflow用户

发布于 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的不同技术。这不是非此即彼的情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37000111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档