标签:you 基本 jvm 垃圾回收 引用关系 内存 数据 rri 垃圾收集
Region 区域化垃圾收集器:最大好处是化整为零,避免全内存扫描,只需要按照区域来进行扫描即可
在进行Young GC的时候,Young区的对象可能还存在Old区的引用, 这就是跨代引用的问题。为了解决Young GC的时候,扫描整个老年代,G1引入了Card Table
和Remember Set
的概念,基本思想就是用空间换时间,这两个数据结构是专门用来处理Old区到Young区的引用。Young区到Old区的引用则不需要单独处理,因为Young区中的对象本身变化比较大,没必要浪费空间去记录下来
Region
被分成了多个Card
,其中绿色部分的Card
表示该Card
中有对象引用了其他Card
中的对象,这种引用关系用蓝色实线表示。RSet
其实是一个HashTable,Key是Region的起始地址,Value是Card Table
(字节数组),字节数组下标表示Card
的空间地址,当该地址空间被引用的时候会被标记为dirty_card
(Young GC 示意)
-XX:MaxGCPauseMillis
,用来指定一个G1收集过程目标停顿时间,默认值200ms,当然这只是一个期望值。G1的强大之处在于他有一个停顿预测模型(Pause Prediction Model),他会有选择的挑选部分Region,去尽量满足停顿时间。Mixed GC的触发也是由一些参数控制,比如XX:InitiatingHeapOccupancyPercent
表示老年代占整个堆大小的百分比,默认值是45%,达到该阈值就会触发一次Mixed GCMixed GC主要可以分为两个阶段:
1、全局并发标记(global concurrent marking)
(Mixed GC 全局并发标记过程)
2、拷贝存活对象(Evacuation)
Evacuation阶段是全暂停的。它负责把一部分region里的活对象拷贝到空region里去(并行拷贝),然后回收原本的region的空间。Evacuation阶段可以自由选择任意多个region来独立收集构成收集集合(collection set,简称CSet),CSet集合中Region的选定依赖于上文中提到的停顿预测模型,该阶段并不evacuate所有有活对象的region,只选择收益高的少量region来evacuate,这种暂停的开销就可以(在一定范围内)可控
(Mixed GC 示意)
G1的垃圾回收过程是和应用程序并发执行的,当Mixed GC的速度赶不上应用程序申请内存的速度的时候,Mixed G1就会降级到Full GC,使用的是Serial GC。Full GC会导致长时间的STW,应该要尽量避免。
导致G1 Full GC的原因可能有两个:
标签:you 基本 jvm 垃圾回收 引用关系 内存 数据 rri 垃圾收集
原文地址:https://www.cnblogs.com/ding-dang/p/13176181.html