暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

JVM 垃圾收集器

Java有货 2020-01-06
121

JVM学习目录
1.JVM 概念简介
2.JVM 运行时内存
3.JVM算法简介
4.JVM 垃圾收集器
5.JVM 调优实战

一、Serial收集器

Serial收集器是最基本、发展历史最悠久的收集器,曾经(在JDK 1.3.1之前)是虚拟机 新生代收集的唯一选择。大家看名字就会知道,这个收集器是一个单线程的收集器,但它 的“单线程”的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作, 更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。“Stop The World”这个名字也许听起来很酷,但这项工作实际上是由虚拟机在后台自动发起和自动 完成的,在用户不可见的情况下把用户正常工作的线程全部停掉,这对很多应用来说都是难 以接受的。读者不妨试想一下,要是你的计算机每运行一个小时就会暂停响应5分钟,你会 有什么样的心情?下图示意了Serial/Serial Old收集器的运行过程。

二、ParNew收集器

ParNew收集器其实就是Serial收集器的多线程版本,除了使用多条线程进行垃圾收集之 外,其余行为包括Serial收集器可用的所有控制参数(例如:-XX:SurvivorRatio、-XX:PretenureSizeThreshold、-XX:HandlePromotionFailure等)、收集算法、Stop The World、对 象分配规则、回收策略等都与Serial收集器完全一样,在实现上,这两种收集器也共用了相 当多的代码。ParNew收集器的工作过程如图所示。

三、Parallel Scavenge收集器

Parallel Scavenge收集器的特点是它的关注点与其他收集器不同,CMS等收集器的关注点 是尽可能地缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到 一个可控制的吞吐量(Throughput)。所谓吞吐量就是CPU用于运行用户代码的时间与CPU总 消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚 拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。

四、Serial Old收集器

Serial Old是Serial收集器的老年代版本,它同样是一个单线程收集器,使用“标记-整 理”算法。这个收集器的主要意义也是在于给Client模式下的虚拟机使用。如果在Server模式 下,那么它主要还有两大用途:一种用途是在JDK 1.5以及之前的版本中与Parallel Scavenge 收集器搭配使用[1],另一种用途就是作为CMS收集器的后备预案,在并发收集发生Concurrent Mode Failure时使用。这两点都将在后面的内容中详细讲解。Serial Old收集器的工作过程如 图3-8所示。

五、Parallel Old收集器

Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。这个收集器是在JDK 1.6中才开始提供的,在此之前,新生代的Parallel Scavenge收集器一直 处于比较尴尬的状态。原因是,如果新生代选择了Parallel Scavenge收集器,老年代除了 Serial Old(PS MarkSweep)收集器外别无选择(还记得上面说过Parallel Scavenge收集器无 法与CMS收集器配合工作吗?)。由于老年代Serial Old收集器在服务端应用性能上的“拖 累”,使用了Parallel Scavenge收集器也未必能在整体应用上获得吞吐量最大化的效果,由于 单线程的老年代收集中无法充分利用服务器多CPU的处理能力,在老年代很大而且硬件比较 高级的环境中,这种组合的吞吐量甚至还不一定有ParNew加CMS的组合“给力”。

直到Parallel Old收集器出现后,“吞吐量优先”收集器终于有了比较名副其实的应用组 合,在注重吞吐量以及CPU资源敏感的场合,都可以优先考虑Parallel Scavenge加Parallel Old 收集器。Parallel Old收集器的工作过程如图所示。

六、CMS收集器

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集 器。目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其重 视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常 符合这类应用的需求。

从名字(包含“Mark Sweep”)上就可以看出,CMS收集器是基于“标记—清除”算法实现 的,它的运作过程相对于前面几种收集器来说更复杂一些,整个过程分为4个步骤,包括:

初始标记(CMS initial mark)

并发标记(CMS concurrent mark)

重新标记(CMS remark)

并发清除(CMS concurrent sweep)
由于整个过程中耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起 工作,所以,从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。通过下图可以比较清楚地看到CMS收集器的运作步骤中并发和需要停顿的时间。

七、G1收集器

G1(Garbage-First)收集器是当今收集器技术发展的最前沿成果之一,早在JDK 1.7刚刚 确立项目目标,Sun公司给出的JDK 1.7 RoadMap里面,它就被视为JDK 1.7中HotSpot虚拟机 的一个重要进化特征。从JDK 6u14中开始就有Early Access版本的G1收集器供开发人员实 验、试用,由此开始G1收集器的“Experimental”状态持续了数年时间,直至JDK 7u4,Sun公 司才认为它达到足够成熟的商用程度,移除了“Experimental”的标识。

G1是一款面向服务端应用的垃圾收集器。HotSpot开发团队赋予它的使命是(在比较长 期的)未来可以替换掉JDK 1.5中发布的CMS收集器。与其他GC收集器相比,G1具备如下特 点。

并行与并发

分代收集

空间整合

可预测的停顿
本文参考《深入理解Java虚拟第二版》

今天的分享就到这里,希望对大家有所帮助

小编寄语

小编创建了一个关于Java学习讨论的微信群!想进去的可以联系小编!同时也欢迎大家点赞与转发!

小编微信:372787553

备注为进群,通过后小编会邀请您进群!


Ja


va














文章转载自Java有货,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论