4-垃圾收集器
2021-04-17 18:24:28 0 举报
AI智能生成
垃圾收集器
作者其他创作
大纲/内容
垃圾收集算法
1、标记-复制算法:内存空间划分为两半,当一块内存空间用完;就将存活的对象复制到另一半。<br>
2、标记-清除算法:先标记、后清除。<br> 缺点:<br><ul><li> <font color="#c41230">效率问题</font> (如果需要标记的对象太多,效率不高)</li><li> <font color="#c41230">空间问题</font>(标记清除后会产生大量不连续的碎片)</li></ul>
3、标记-整理算法:先标记,存活对象移到一端,在清理。<br>
垃圾收集器
1、串行:Serial收集器(-XX:+UseSerialGC -XX:+UseSerialOldGC)
2、并行:Parallel Scavenge收集器(-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代))
<ul><li><span style="font-size: inherit;"><font color="#c41230">JDK1.8默认</font></span></li></ul>
<ul><li><b><font color="#c41230">Parallel Scavenge收集器关注点是吞吐量(高效率的利用CPU)</font></b></li></ul>
<ul><li><font color="#c41230">应用于复杂的科学计算、例如:结算、报表</font></li></ul>
<font color="#c41230">3、CMS(4~8G内存)</font>
<ul><li><span style="font-size: inherit;">CMS(<font color="#c41230">Concurrent Mark Sweep</font>)收集器是一种以获取最短回收停顿时间为目标的收集器。(<font color="#c41230">用户体验</font>)</span></li></ul>
<ul><li>搭配:ParNew使用</li></ul>
<ul><li>优缺点</li></ul>
优点:并发收集、停顿低<br>
缺点
1、抢占CPU资源
2、无法处理浮动垃圾,只能等下次GC处理。 (三色标记中的,白色标记)<br>
3、<font color="#c41230">使用了标记-清除算法,会造成大量空间碎片 </font> <br>
<ul><li> -XX:+UseCMSCompactAtFullCollection:FullGC之后做压缩整理(减少碎片)</li></ul>
<ul><li>-XX:CMSFullGCsBeforeCompaction:多少次FullGC之后压缩一次,默认是0,代表每次FullGC后都会压缩一 次</li></ul>
<span style="font-size: inherit;">4、<font color="#c41230">并发失败(concurrent mode failure)</font>、前一次没执行完,又执行。</span><br>
出现后使用,<font color="#c41230">serial old垃圾收集器</font>来回收,效率低下<br>
解决策略
<ul><li><span style="font-size: inherit;">-XX:CMSInitiatingOccupancyFraction: 当老年代使用达到该比例时会触发FullGC(默认是<font color="#c41230"><b>92</b></font>,这是百分比)</span></li></ul>
<ul><li>-XX:+UseCMSInitiatingOccupancyOnly:只使用设定的回收阈值(-XX:CMSInitiatingOccupancyFraction设 定的值),如果不指定,JVM仅在第一次使用设定值,后续则会自动调整</li></ul>
<ul><li>-XX:+CMSScavengeBeforeRemark:<font color="#c41230">在CMS GC前启动一次minor gc,</font>目的在于减少老年代对年轻代的引 用,降低CMS GC的标记阶段时的开销,一般CMS的GC耗时 80%都在标记阶段</li></ul>
<ul><li>其他设置参数</li></ul>
-XX:+CMSParallellnitialMarkEnabled:表示在<font color="#c41230">初始标记</font>的时候多线程执行,缩短STW
-XX:+CMSParallelRemarkEnabled:在<font color="#c41230">重新标记</font>的时候多线程执行,缩短STW
<ul><li>三色标记</li></ul>
<ul><li>记忆集与卡表:解决跨代引用问题</li></ul>
4、G1(8G以上)
<ul><li>组成</li></ul>
<ul><li>过程</li></ul>
<ul><li><font color="#c41230"><b>停顿时间(核心),默认200ms:</b></font></li></ul>
筛选回收阶段首先对<font color="#c41230">各个Region的回收价值和成本进行排序</font>,根据用户所期 望的GC停顿时间(<font color="#c41230">可以用JVM参数 -XX:MaxGCPauseMillis指定</font>)来制定回收计划
<ul><li>垃圾收集分类</li></ul>
1、YoungGC:根据停顿时间触发,当计算出回收时间接近<font color="#c41230">停顿时间</font>,既触发。
2、MixedGC(非Full GC):<font color="#c41230">老年代的堆占有率达到参数(-XX:InitiatingHeapOccupancyPercent)设定的值则触发</font>,回收所有的 Young和部分Old(根据期望的GC停顿时间确定old区垃圾收集的优先顺序)以及大对象区<br>
3、Full GC:<font color="#c41230">停止系统程序</font>,然后采用<font color="#c41230">单线程进行标记、清理和压缩整理</font>,好空闲出来一批Region来供下一次MixedGC使用,这 个过程是非常耗时的。(Shenandoah优化成多线程收集了)
<ul><li>常见参数:</li></ul>
<span style="font-size: inherit;">1、-XX:InitiatingHeapOccupancyPercent:<font color="#c41230">老年代占用空间达到整堆内存阈值(默认45%)</font>,则执行新生代和老年代的混合 收集(MixedGC),</span><br>
2、-XX:G1MixedGCLiveThresholdPercent(<font color="#c41230">默认85%</font>) region中的<font color="#c41230">存活对象低于这个值时才会回收该region</font>,如果超过这 个值,存活对象过多,回收的的意义不大。
3、-XX:G1MixedGCCountTarget:<font color="#c41230">在一次回收过程中指定做几次筛选回收(默认8次)</font>,在最后一个筛选回收阶段可以回收一 会,然后<font color="#c41230">暂停回收,恢复系统运行,一会再开始回收</font>,这样可以让系统不至于单次停顿时间过长。
<ul><li><span style="font-size: inherit;"><font color="#c41230">使用场景(例:Kafka)</font></span></li></ul>
1. 50%以上的堆被存活对象占用<br> 2. 对象分配和晋升的速度变化非常大 <br>3. 垃圾回收时间特别长,超过1秒<br> 4. 8GB以上的堆内存(建议值) <br>5. 停顿时间是500ms以内<br>
5、ZGC
可回收堆内存T级别
0 条评论
下一页