首页 > 编程知识 正文

jvm常用的垃圾收集算法,jvm垃圾收集器选择

时间:2023-05-03 11:41:31 阅读:189668 作者:1170

3358 www.Sina.com/http://www.Sina.com /这两个名词都是同时编程中的概念,在讲述垃圾收集器的上下文中可以解释如下。

并行(Parallel )是指多个垃圾回收线程并行运行,但此时用户线程仍处于等待状态。

所谓同时,是指用户线程和垃圾回收的线程同时执行,并非同时,有时也交替执行。 用户程序继续执行,垃圾回收在另一个CPU上执行。

相关概念迷路的眼睛世代GC(Minor GC ) :指迷路的眼睛世代发生的垃圾收集动作。 由于大多数Java对象都具有朝生夕灭的特性,所以minorgc非常频繁,一般回收速度也很快。

老一代GC(Major GC/fullgc ) :指发生在老一代的GC,出现Major GC,总是至少伴随一次Minor GC (但不是绝对的),直接映射到并行扫描收集器的收集策略Major GC的速度一般比Minor GC慢10倍以上的。

并发和并行吞吐量等于CPU用于执行用户代码的时间和CPU的总消耗时间之比

吞吐量=用户代码执行时间/(用户代码执行时间垃圾回收时间)。

虚拟机共运行100分钟,其中垃圾收集需要1分钟,吞吐量为%。

由于Minor GC 和 Full GC虚拟机规范没有具体说明垃圾收集器的实现方式,因此每个制造商的垃圾收集器可能完全不同,但要将JDK1.7或更高版本的Hotspot虚拟机上面对Java虚拟机的描述也基于JDK1.7版本。 在Hotspot中,虚拟机的收集器主要包括:

可知垃圾收集器按对象的世代分类,用双箭头连接的垃圾收集器表示两者可以联合使用。 存在迷路的垃圾收集器有Serial、ParNew、Parallel Scavenge、G1,属于老年代的垃圾收集器有CMS、Serial Old、Parallel Old、G1。 其中的G1是既能回收迷路的眼睛对象,也能回收旧年对象的垃圾收集器。 但是,所有的垃圾收集器都没有常用的垃圾收集器。 在各种场景中,每个垃圾收集器都有各自的优点。

吞吐量Serial收集器是最基本、发展历史最悠久的收集器。 这是单线程垃圾收集器。 这意味着在进行垃圾回收时,必须暂停其他线程,即上述“Stop the world”。 这个过程会在用户看不见的情况下停止用户的所有正常线程,听起来可能有点冷酷,但这很难接受。 Serial、Serial Old收集器的工作图像如下。

虽然有以上不能接受的地方,但串行收集器有优点。 简单高效,对于限定各个CPU的环境来说,Serial收集器没有线程交互的开销,所以通过专心进行垃圾回收自然可以获得较高的手机效率。 迄今为止,HotSpot垃圾收集器

3358www.Sina.com/ParNew收集器是串行收集器的多线程版本,parnew收集器的操作图像如下:

Serial收集器性能因素除外的重要原因是,除了串行收集器之外,目前只有它可以与CMS收集器配合使用。

但是,在单CPU环境中,ParNew收集器的效果绝对不会优于Serial收集器。 此外,不能100%保证超线程技术实现的两个CPU环境都能超过串行收集器。 但是,随着可以使用的CPU数量的增加,对于GC时系统资源的有效利用还是有益的。

33558 www.Sina.com/parallel scavenge收集器是迷路眼睛的垃圾回收器,使用复制算法,也是并行多线程收集器。 虽然与ParNew收集器相比有很多相似之处,但Parallel Scavenge收集器关注的是可控的Serial收集器依然是Client模式下的默认的迷路的眼睛代垃圾收集器。。 吞吐量越大,垃圾回收的时间越短,用户代码就越能充分利用CPU资源,尽快完成程序的运算任务。

Parallel Scavenge收集器使用两个参数控制吞吐量。

XX:MaxGCPauseMillis控制最大的垃圾收集停止时间

XX:GCRatio直接设置吞吐量的大小。

直观上,最大垃圾收集停止时间越短吞吐量越大,但ParNew收集器例如,原10每秒收集一次,每次停止100毫秒,现在变成每5秒收集一次,每次70 暂停时间下降的同时,吞吐量也下降了。

此外,并行

cavenge收集器还可以设置参数-XX:+UseAdaptiveSizePocily来动态调整停顿时间或者最大的吞吐量,这种方式称为GC自适应调节策略,这点是ParNew收集器所没有的。

Serial Old收集器

Serial Old收集器是Serial收集器的老年代版本,也是一个单线程收集器,采用“标记-整理算法”进行回收。其运行过程与Serial收集器一样。

Serial Old收集器的主要意义也是在于给Client模式下的虚拟机使用。如果在Server模式下,那么它主要还有两大用途:一种用途是在JDK 1.5以及之前的版本中与Parallel Scavenge收集器搭配使用,另一种用途就是作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用。

Parallel Old收集器

Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法进行垃圾回收。其通常与Parallel Scavenge收集器配合使用,“吞吐量优先”收集器是这个组合的特点,在注重吞吐量和CPU资源敏感的场合,都可以使用这个组合。

CMS收集器

CMS收集器(Concurrent qjdhmg Sweep)的目标就是获取最短回收停顿时间。在注重服务器的响应速度,希望停顿时间最短,则CMS收集器是比较好的选择。

整个执行过程分为以下4个步骤:

初始标记并发标记重新标记并发清除

初始标记和重新标记这两个步骤仍然需要暂停Java执行线程,初始标记只是标记GC Roots能够关联到的对象,并发标记就是执行GC Roots Tracing的过程,而重新标记就是为了修正并发标记期间因用户程序执行而导致标记发生变动使得标记错误的记录。其执行过程如下:

由上图可知,整个过程中耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作,因此,总体上CMS收集器的内存回收过程是与用户线程一起并发执行的。

CMS的优点很明显:并发收集、低停顿。由于进行垃圾收集的时间主要耗在并发标记与并发清除这两个过程,虽然初始标记和重新标记仍然需要暂停用户线程,但是从总体上看,这部分占用的时间相比其他两个步骤很小,所以可以认为是低停顿的。

尽管如此,CMS收集器的缺点也是很明显的:

对CPU资源太敏感,这点可以这么理解,虽然在并发标记阶段用户线程没有暂停,但是由于收集器占用了一部分CPU资源,导致程序的响应速度变慢

CMS收集器无法处理浮动垃圾。所谓的“浮动垃圾”,就是在并发标记阶段,由于用户程序在运行,那么自然就会有新的垃圾产生,这部分垃圾被标记过后,CMS无法在当次集中处理它们(为什么?原因在于CMS是以获取最短停顿时间为目标的,自然不可能在一次垃圾处理过程中花费太多时间),只好在下一次GC的时候处理。这部分未处理的垃圾就称为“浮动垃圾”

由于CMS收集器是基于“标记-清除”算法的,前面说过这个算法会导致大量的空间碎片的产生,一旦空间碎片过多,大对象就没办法给其分配内存,那么即使内存还有剩余空间容纳这个大对象,但是却没有连续的足够大的空间放下这个对象,所以虚拟机就会触发一次Full GC(这个后面还会提到)这个问题的解决是通过控制参数-XX:+UseCMSCompactAtFullCollection,用于在CMS垃圾收集器顶不住要进行FullGC的时候开启空间碎片的合并整理过程。

G1收集器

G1(Garbage-First)收集器是现今收集器技术的最新成果之一,之前一直处于实验阶段,直到jdk7u4之后,才正式作为商用的收集器。

与前几个收集器相比,G1收集器有以下特点:

并行与并发分代收集(仍然保留了分代的概念)空间整合(整体上属于“标记-整理”算法,不会导致空间碎片)可预测的停顿(比CMS更先进的地方在于能让使用者明确指定一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒)

此外,G1收集器将Java堆划分为多个大小相等的Region(独立区域),迷路的眼睛代与老年代都是一部分Region的集合,G1的收集范围则是这一个个Region(化整为零)。

G1的工作过程如下:

初始标记(Initial qjdhmging)并发标记(Concurrent qjdhmging)最终标记(Final qjdhmging)筛选回收(Live Data Counting and Evacuation)

初始标记阶段仅仅只是标记一下GC Roots能够直接关联的对象,并且修改TAMS(Next Top at qjdhmg Start)的值,让下一阶段的用户程序并发运行的时候,能在正确可用的Region中创建对象,这个阶段需要暂停线程。并发标记阶段从GC Roots进行可达性分析,找出存活的对象,这个阶段食欲用户线程并发执行的。最终标记阶段则是修正在并发标记阶段因为用户程序的并发执行而导致标记产生变动的那一部分记录,这部分记录被保存在Remembered Set Logs中,最终标记阶段再把Logs中的记录合并到Remembered Set中,这个阶段是并行执行的,仍然需要暂停用户线程。最后在筛选阶段首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间制定回收计划。整个执行过程如下:

垃圾收集器常用参数总结

client/serrver端不同的GC方式:

Sun JDK HotSpot虚拟机GC组合方式:

参考
1、美满的水池,深入理解Java虚拟机:JVM高级特性与最佳实践,机械工业出版社

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。