jvm垃圾回收卡表

现代JVM,堆空间通常被划分为新生代和老年代。由于新生代的垃圾收集通常很频繁,如果老年代对象引用了新生代的对象,那么,需要跟踪从老年代到新生代的所有引用,从而避免每次YGC时扫描整个老年代,减少开销。

对于HotSpot JVM,使用了卡标记(Card Marking)技术来解决老年代到新生代的引用问题。具体是,使用卡表(Card Table)和写屏障(Write Barrier)来进行标记并加快对GC Roots的扫描。

卡表(Card Table)
Card Table通常将堆空间划分为一系列2次幂大小的卡页(Card Page)。
Card Table,用于标记卡页的状态,每个卡表项对应一个卡页。
HotSpot JVM的卡页(Card Page)大小为512字节,卡表(Card Table)被实现为一个简单的字节数组,即卡表的每个标记项为1个字节。
当对一个对象引用进行写操作时(对象引用改变),写屏障逻辑将会标记对象所在的卡页为dirty。
当发生yanggc的时候,老年代只需要扫描卡表中的脏页。

卡表也用于cms回收二阶段。并发标记阶段会把发生变化的对象所在的Card标识为Dirty,这样后续阶段就只需要扫描这些Dirty Card的对象,从而避免扫描整个老年代。

-XX:+UseCondCardMark:在执行写屏障之前,先简单的做一下判断。如果卡页已被标识过,则不再进行标识。

https://www.cnblogs.com/hongd...

你可能感兴趣的:(java)