JVM_05垃圾收集器
2022-09-07 14:08:49 0 举报
AI智能生成
JVM_05垃圾收集器
作者其他创作
大纲/内容
垃圾回收标记算法
标记-复制算法
将内存分为大小相同的的两块,每次使用其中的一块,当一块内存使用完之后,将存活的对象复制到领一块去,<br>然后把使用的空前一次清理掉<br>
内存回收都是对内存区间的一半进行回收
问题
浪费空间,只能用半的内存
年轻代会使用
标记-清除算法
“标记”和“清除”
标记::标记存活的对象,,清除::统一回收所有未被标记的对象
标记::标记出所有需要回收的对象,清除::在标记完成后统一回收所有被标记的对象
问题
效率问题,如果需要标记的对象太多,效率不高
空间问题,标记清楚会产生大量不连续的碎片
老年代会使用
标记-整理算法
标记过程与垃标记-清除算法一样,然后的步骤不是直接对垃圾对象进行回收,而是让存活的对象向一断移动,<br>(整理,清除完后空间会相对规整,不会大量不连续的碎片)<br>
老年代会使用
分代收集理论
根据不同代(年轻代,老年代)的特点选择不同的垃圾收集算法
垃圾收集器
Stop The World带来的不良用户体验,所以在后续的垃圾收集器设计中停顿时间在不断缩短(仍然还有停顿,寻找最优秀的垃圾收集器的过程仍然在继续)。
Serial收集器<br>
Serial(串行)收集器
单线程收集器
它只会使用一条垃圾收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( "Stop The World" ),直到它收集结束。<br>
新生代采用复制算法,老年代采用标记-整理算法。
配置方法:-XX:+UseSerialGC -XX:+UseSerialOldGC
简单而高效(与其他收集器的单线程相比)。Serial收集器由于没有线程交互的开销,自然可以获得很高的单线程收集效率。(适合场景(单核的系统,这种系统即使用并发也没有意义,所以适合用Serial收集器))<br>
Serial Old收集器是Serial收集器的老年代版本<br>
Parallel Scavenge收集器<br>
Serial收集器的多线程版本<br>
新生代采用复制算法,老年代采用标记-整理算法。
配置方法
-XX:+UseParallelGC(年轻代),-XX:+UseParallelOldGC(老年代)
-XX:ParallelGCThreads
指定收集线程数,但是一般不推荐修改
默认的收集线程数跟cpu核数相同
Parallel Old收集器是Parallel Scavenge收集器的老年代版本<br>
JDK8默认的新生代和老年代收集器
ParNew收集器<br>
ParNew收集器其实跟Parallel收集器很类似,区别主要在于它可以和CMS收集器配合使用。<br>
新生代采用复制算法,老年代采用标记-整理算法。
配置方法:-XX:+UseParNewGC
CMS收集器<br>
特点
获取最短回收停顿时间为目标<br>
非常符合在注重用户体验的应用上使用
并发收集、低停顿<br>
应用于老年代,并且使用标记清楚算法
步骤
初始标记<br>
暂停所有的其他线程STW,并记录下gc root 直接引用的对象,速度很快<br>
并发标记<br>
从GC Roots的直接关联对象开始遍历整个对象图的过程, 这个过程耗时较长但是不需要停顿用户线程
过程不用停顿其他的用户线程,提高用户体验<br>
因为用户程序继续运行,可能会有导致已经标记过的对象状态发生改变。
重新标记<br>
三色标记<br>
修复并发标记阶段中因为用户线程继续运行而导致标记变动的的部分记录<br>
会STW
并发清理<br>
开启用户线程,同时GC 线程开始对未标记的区域做清扫,如果这个阶段新增对象会标记为黑色不作任何处理
并发重置<br>
重置本次GC过程中的标记数据
缺点
对CPU资源敏感(会和服务抢资源)<br>
无法处理浮动垃圾<br>
浮动垃圾:在并发标记和并发清理阶段又产生垃圾
因为gc 线程和用户线程一起执行就会产生互动垃圾
只能等待下次gc才能清理
标记-清除算法会导致收集结束时会有大量空间碎片产生<br>
concurrent mode failure<br>
在并发标记和并发清理阶段会出现,一边回收,系统一边运行
也许没回收完就再次触发full gc,就会产生此情况
此时会进入stop the world,用serial old垃圾收集器来回收
核心参数
-X 与 -XX区别X 越多 将来的版本可能约不支持,越不稳定
-XX:+UseConcMarkSweepGC:启用cms
-XX:ConcGCThreads:并发的GC线程数
-XX:+UseCMSCompactAtFullCollection:FullGC之后做压缩整理(减少碎片)
-XX:CMSFullGCsBeforeCompaction:多少次FullGC之后压缩一次,默认是0,代表每次FullGC后都会压缩一次
可以避免concurrent mode failure
-XX:+UseCMSInitiatingOccupancyOnly:只使用设定的回收阈值(-XX:CMSInitiatingOccupancyFraction设定的值),如果不指定,JVM仅在第一次使用设定值,后续则会自动调整
-XX:+CMSScavengeBeforeRemark:在CMS GC前启动一次minor gc,目的在于减少老年代对年轻代的引用,降低CMS GC的标记阶段时的开销,一般CMS的GC耗时 80%都在标记阶段
减少跨代的引用
-XX:+CMSParallellnitialMarkEnabled:表示在初始标记的时候多线程执行,缩短STW
-XX:+CMSParallelRemarkEnabled:在重新标记的时候多线程执行,缩短STW;
G1
ZGC(做了解)
0 条评论
下一页