门户网站建设管理典型经验,网站工作室网站,长沙网页设计培训服务好长沙大计校区,网站建设与规划周志总结文章目录 一、简介二、工作原理三、Young Collection 跨代引用四、大对象问题 一、简介
1、适用场景
同时注重吞吐量#xff08;Throughput#xff09;和低延迟#xff08;Low latency#xff09;#xff0c;默认的暂停目标是 200 ms超大堆内存#xff0c;会将堆划分为… 文章目录 一、简介二、工作原理三、Young Collection 跨代引用四、大对象问题 一、简介
1、适用场景
同时注重吞吐量Throughput和低延迟Low latency默认的暂停目标是 200 ms超大堆内存会将堆划分为多个大小相等的 Region对JVM空间进行了重新个规划整体上是标记整理算法两个区域之间是复制算法JDK9 时默认启用G1
2、相关参数
-XX:UseG1GC 开启G1
-XX:G1HeapRegionSizesize 设置region的大小一般默认为1248m
-XX:MaxGCPauseMillistime 设置单次STW最长时间单位毫秒二、工作原理
1、大致流程图
分为三个循环阶段
年轻代的垃圾收集年轻代的垃圾收集 并发标记混合收集 2、Young Collection这个阶段会发生STW 新创建的对象会存入Eden区域 当Eden逐渐增多后会发生一次Minor GC并将存活的对象存入S 区Survivor 当多次Minor GC之后S区对象的年龄达到一定阈值默认15岁则晋升到老年代并将其他存活的对象复制到另外一个S区。 3、Young Collection CM在 Young GC 时会进行 GC Root 的初始标记初始标记会STW并且只会发生在Young GC中。老年代占用堆空间比例达到阈值时-XX:InitiatingHeapOccupancyPercent默认45%进行并发标记不会 STW 4、Mixed Collection 会对 E、S、O 进行全面垃圾回收类似之前的Ful GC但是这里不能称之为Full GC。最终标记Remark会 STW拷贝存活Evacuation会 STW-XX:MaxGCPauseMillisms 当老年代占用的比例达到阈值时会触发Mixed Collection 过程如下 先进行年轻代的Minor GC然后对老年代进行垃圾收集因为存在MaxGCPauseMillis这个参数的限制所以每次的回收STW时间不能超过它就决定了每次的回收量有限。 这时候G1会优先回收O区垃圾较多的Region这就是G1名称的由来原因。 并将O区存活的对象拷贝到另外一个O区。 三、Young Collection 跨代引用
新生代回收的跨代引用老年代引用新生代问题 问题是这样的 由于O区对象非常多新生代对象被O区引用那么在判断GC Root时就要遍历整个O区这样就非常影响性能。 所以这里为了优化性能引入了卡表技术与Remembered Set 当老年代引用了新生代对象时这个老年代对象存放的区域就被标记为脏卡区域。 从而在遍历GC Root时直接去脏卡区域查找节省了大量时间。 那么有人会问此处为什么不用队列存放所有O区跨代引用的对象了 我想一方面队列也是对象另外这样违背GC Root的定义。 四、大对象问题
我想对算法方案比较擅长的同学应该会有这样一个问题。 G1将JVM空间划分为Region区域那么如果一个巨型对象来了如何存放 这Region是不是就类似前面的内存碎片了
定义一个对象大于 region 的一半时称之为巨型对象 巨型对象的存储 如何回收 G1 不会对巨型对象进行拷贝并且回收时被优先考虑 一般情况下不会把巨型对象放在内存中很久的。