ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java垃圾收集器介绍

2020-01-11 11:01:59  阅读:296  来源: 互联网

标签:java 收集 收集器 XX 参数 垃圾 Serial


如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。java虚拟机规范中对应垃圾收集器应该如何实现并没有任何规定,因此不同的厂商,不同版本的虚拟机所提供的垃圾收集器可能会有很大差别,并且一般都会提供参数供用户根据自己的应用特点和要求组合各个年代所使用的收集器。

 

虚拟机的垃圾收集器

以上展示了虚拟机不同分代的收集器,如果两个收集器之间存在连线,就可以说明他们可以搭配使用。虚拟机所处的区域,则表示他们属于新生代收集器还是老年代收集器。

Serial收集器

Serial收集器是最基本、发展历史最悠久的收集器。大家看名字就会知道,这个收集器是一个单线程的收集器,但是它的单线程的意义并不仅仅说明他只用一个CPU或者一条线程去完成垃圾收集工作,更重要的是他在进行垃圾收集时,必须暂停其他所有的工作线程,直到他收集结束。也就是会引起“Stop The Word” STW,并且这项工作实际是由虚拟机在后台自动发起和自动完成的,在用户不可见的情况下把用户正常工作的线程全部停掉,这对很多应用来说都是不可以接受的。Serial/Serial Old收集器的运行过程如下:

 

Serial/Serial Old收集器运行示意图

ParNew 收集器

ParNew收集器其实就是Serial收集器的多线程版本,熟客使用多条线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参数(例如:-XX:SurivivorRatio、-XX:PertenureSizeThrehold、-XX:HandlePromotionFailuer等)、收集算法、STW、对象分配规则、回收策略等斗鱼Serial收集器完全一样。它的工作过程如下:

 

ParNew/Serial Old收集器运行示意图

Paralle Scavenge收集器

Paralle Scavenge收集器是一个新生代收集器,他也是使用复制算法的收集器,又是并行的多线程收集器。他的特点是它的关注点与其他收集器不同,Paralle Scavenge收集器的目标是达到一个可控制的吞吐量。所谓吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行代码时间/(运行用户代码时间 + 垃圾收集时间)。

Paralle Scavenge收集器提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间的-XX:MaxGCPauseMillis参数以及直接设置吞吐量大小的-XX:GCTimeRatio参数。

MaxGCPauseMillis参数允许的值是一个大于0的毫秒数,收集器将尽可能的保证内存回收花费的时间不超过特定值。不过大家不要认为如果把这个参数的值设置的稍小一点就能使得系统的垃圾收集速度变得更快,GC停顿时间缩短是以牺牲吞吐量和新生代空间来换取的:系统把新生代调小一些,收集300M新生代肯定比收集500M快,这也直接导致垃圾收集发生的更频繁,原来10秒收集一次,每次停顿100毫秒,现在变成5秒收集一次,每次停顿70毫秒,停顿时间的确下降,但吞吐量也在下降。

GCTimeRatio参数的值应当是一个大于0且小于100的整数,也就是垃圾收集时间占总时间的比率,相当于吞吐量的倒数。如果把测参数设置为19,那允许的最大GC时间就占总时间的5%(即1/(1+19))。

除了上面两个参数以外,Paralle Scavenge收集器还有一个参数-XX:UseAdaptiveSizePolicy值得关注。这是一个开关参数,当这个开关打开之后,就不需要手动指定新生代的大小(-Xmn)、Eden与Survivor区的比列(-XX:SurvivorRatio)、晋升老年代对象大小(-XX:PertenureSizeThreshold)等参数细节了,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量。

Parallel Old收集器

Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。执行过程如下图:

 

Parallel Scavenge/Old收集器运行示意图
原文链接:https://www.jianshu.com/p/f67de53c45f9 如有侵权请联系作者删除

附上垃圾回收算法,请查看java垃圾回收算法
 

小萧山 发布了10 篇原创文章 · 获赞 0 · 访问量 4398 私信 关注

标签:java,收集,收集器,XX,参数,垃圾,Serial
来源: https://blog.csdn.net/xiaohuihui501/article/details/103934296

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有