垃圾回收器
2021-09-03 11:20:26 8 举报
java十大垃圾回收器汇总总结
作者其他创作
大纲/内容
Parallel Old
Serial收集器的老年代版本算法:标记整理适用范围:老年代
CMS
Serial
Java 11引入垃圾回收器控制内存分配,但是不执行任何垃圾回收工作。一旦java的堆被耗尽,jvm就直接关闭。设计的目的是提供一个完全消极的GC实现,分配有限的内存分配,最大限度降低消费内存占用量和内存吞吐时的延迟时间
java12引入在延迟可控的情况下获得尽可能高的吞吐量是一款面向服务端应用的垃圾收集器主要针对配备多核CPU及大容量内存的机器详见笔记
老版垃圾收集器特点: 年轻代、老年代是独立且连续的内存块; 年轻代收集使用单eden、双survivor进行复制算法; 老年代收集必须扫描整个老年代区域; 都是以尽可能少而块地执行GC为设计原则。
Shenandoah
详细过程:1)初始标记(CMS initial mark) 仅仅只是标记出GCRoots能直接关联到的对象2)并发标记(CMS concurrent mark) 从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程3)重新标记(CMS remark) 为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录4)并发清除(CMS concurrent sweep) 清理删除掉标记阶段判断的已经死亡的对象,释放内存空间。由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发的由于最耗费时间的并发标记与并发清除阶段都不需要暂停工作,所以整体的回收是低停顿的在CMS回收过程中,还应该确保应用程序用户线程有足够的内存可用,内存不足时会临时使用Serial 0ld收集器进行清理
G1(Garbage First)重新定义了堆空间,打破了原有的分代模型,将堆划分为一个个区域。这么做的目的是在进行收集时不必在全堆范围内进行,这是它最显著的特点。区域划分的好处就是带来了停顿时间可预测的收集模型:用户可以指定收集操作在多长时间内完成,即 G1 提供了接近实时的收集特性 G1分区:Eden regions(年轻代-Eden区)Survivor regions(年轻代-Survivor区)Old regions(老年代)Humongous regions(巨型对象区域)Free resgions(未分配区域,也会叫做可用分区),分区不固定属于哪个分代,可能随时变化通过上图可以看出,分区可以有效利用内存空间,因为收集整体是使用“标记-整理”,Region之间基于“复制”算法,GC后会将存活对象复制到可用分区(未分配的分区),所以不会产生空间碎片
ParNew
类似ParNew,强调可控的吞吐量吞吐量指垃圾收集的时间占总时间的百分比使用算法:复制回收垃圾收集器的有效工作时间变短,收集垃圾的效率并不一定提高,同时对应的也只能相对的调整我们的吞吐量
单线程串行GC,执行时进入STW状态,所有业务线程暂停算法:复制回收缺点:导致暂停,浪费内存优点:简单高效,单线程效率高适用范围:新生代应用:Client模式下默认的新生代收集器
独占式垃圾回收器(Stop the world):一旦运行,就停止应用程序中的所有用户线程,直到垃圾回收过程完全结束并发式垃圾回收器与应用程序线程交替工作,以尽可能减少应用程序的停顿时间。评估GC的性能指标 吞吐量:运行用户代码的时间占总运行时间的比例 暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间 占用内存 ”高吞吐量”和”低暂停时间”是一对相互竞争的目标(矛盾)。 因为如果选择以吞吐量优先,那么必然需要降低内存回收的执行频率,但是这样会导致GC需要更长的暂停时间来执行内存回收。 相反的,如果选择以低延迟优先为原则,那么为了降低每次执行内存回收时的暂停时间,也只能频繁地执行内存回收,但这又导致程序吞吐量的下降。现在标准:在最大吞吐量优先的情况下,降低停顿时间。
适合对吞吐量要求远远高于延迟要求的场景,并且在满足最差延时的情况下,并行收集器将提供最佳的吞吐量内存耗尽时运行
年轻代垃圾收集器
Parallel Scavenge收集器的老年代版本使用算法:标记整理
一种以获取最短回收停顿时间为目标的收集器使用算法:复制回收优点:并发收集,低延迟缺点:产生大量空间碎片,并发阶段会降低吞吐JDK14中删除
并发标记清除组合
G1(Garbage First)
JDK8移除
特别适合堆内存不高、单核甚至双核CPU的场合内存耗尽时运行
老年代垃圾收集器
java 7引入在延迟可控的情况下获得尽可能高的吞吐量是一款面向服务端应用的垃圾收集器主要针对配备多核CPU及大容量内存的机器
Serial收集器的多线程并行版本,针对CMS增强优点:在多CPU时,比Serial效率高。缺点:收集过程暂停所有应用程序线程,单CPU时比Serial效率差。使用算法:复制回收适用范围:新生代应用:运行在Server模式下的虚拟机中首选的新生代收集器
ZGC
串行收集器组合
查看默认的垃圾收集器:-xx:+PrintCommandLineFlags使用Serial收集器:-XX:+UseSerialGC使用ParNew收集器: -XX:+UseParNewGC使用Parallel Scavenge收集器 -XX:+UseParallelGC -XX:MaxGCPauseMillis 控制最大的垃圾收集时间 -XX:GCTimeRatio 直接设置吞吐量的大小使用CMS收集器 -XX:+UseConcMarkSweepGC使用Garbage First收集器 -XX:+UseG1G
垃圾收集器的使用组合
Epsilon
Java 11引入支持TB级内存容量,暂停时间低(<10ms),对整个程序吞吐量的影响小于15%
Serial Old
并行收集器组合
右图红色线条为已移除组合
CMS非常适合堆内存大、CPU核数多的服务器端应用,也是G1出现之前大型应用的首选收集器内存快耗尽时运行
JDK14弃用
Parallel Scavenge
0 条评论
下一页