串行收集器

  串行收集器(Serial),是一个相对比较老的回收器,但是它的效率在回收器中相对较好,并且比较稳定。他在进行垃圾回收的过程中,使得应用暂时被挂起,然后启用单条线程去做垃圾回收,所以在进行垃圾回收的过程中,可能会产生比较长的时间的停顿,可能对程序造成一定的影响。

  • 串行收集器相关参数
参数 作用
-XX:+UseSerialGC 开启串行收集器,新生代,老年代都会使用串行回收,而新生代会使用复制算法进行回收,而老年代则使用标记压缩算法进行回收

  串行收集器运行流程入下:在GC时应用线程暂停,串行GC进行垃圾回收,回收结束之后,应用继续运行。

  我们看下面例子:

  这我的的代码所进行的几次GC信息,在第一次和第五次GC有进行新生代的GC,和老年代的GC,而其他的GC只进行了新生代的GC。

并行收集器

  • ParNew 收集器
    ParNew并行收集器,是一个新生代的收集器,使用parNew之后,新生代进行GC时就会并行,GC算法依旧是复制算法,但是老年代依旧会使用串行的方式进行回收。多线程垃圾回收,并不一定效率会高,如果是单核cpu,有可能性能还要比串行收集器差,但是它在多核的情况下性能会比较好,当然也要合理的配置线程的数量。
    使用 -XX:+UseParNewGC 参数可以开启 ParNew 新生代收集器
    我们在开启 ParNew 收集器之后,在打印 GC 日志时,会在新生代处有标记,如下:

ParNew收集器参数:

参数 作用
-XX:+UseParNewGC 开启 ParNew 收集器,新生代使用并行收集,老年代使用串行收集
-XX:ParallelGCThreads 限制并行收集的线程数量
  • Parallel 收集器
    Parallel 收集器类似于 ParNew 收集器,新生代依旧使用复制算法,老年代还是使用标记压缩法,但是他是新生代和老年代垃圾回收的并行化收集器。
    我们在开启Parallel收集器之后日志会有以下的变化:

Parallel 收集器参数:

参数 作用
-XX:+UseParallelGC 使用 Parallel 收集器,新生代并行,老年代串行
-XX:+UseParallelOldGC 使用 Parallel 收集器,新生代并行,老年代并行
-XX:MaxGCPauseMills 设置GC的最大停顿时间,单位为毫秒,GC会尽量保证回收时间不超过设定值
-XX:GCTimeRatio 设置垃圾收集时间的占比,默认为99,最大允许1%的时间做GC

  其中-XX:MaxGCPauseMills和-XX:GCTimeRatio两个参数相互矛盾,要想GC停顿的时间短,那么GC的次数就会增多,所占用整体的时间就会增加,但是如果GC次数过多,就会影响到系统的吞吐量(单位时间内CPU所分配给应用的时间越多,系统的吞吐量就越大),所以到底想要那部分的增强,就需要在实际业务场景下看系统需要哪方面增强。

  最后附上一张并行收集器的GC 进行回收时的图,以便于理解:

CMS 收集器

CMS(Concurrent Mark-Sweep)收集器,是一个老年代收集器,它使用的GC算法为标记清除法,但是他是一个并发的收集器,它与应用程序可以并发执行。它是一个以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合,目标是尽量减少应用的暂停时间,减少full gc发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清除年老代。
CMS收集器因为时并发收集器,所以它的运行过程是比较复杂的,可以分为一下几个步骤:

  • 初始标记(单线程,通过根结点标记对象,速度快,但是会产生全局停顿)
  • 并发标记(和应用并发进行,标记所有对象,区分是否被引用)
  • 重新标记(在前面标记过程中存在并发操作,所以还会产生垃圾,此时会进行修正标记,但是也是会产生全局停顿)
  • 并发清除(根据标记结果,清理对象,和应用程序并发进行)

  并发标记时使用时的一些参数:

参数 作用
-XX:+UseConcMarkSweepGC 开启使用cms收集器
-XX:CMSInitiatingOccupancyFraction 设置触发GC的阀值
-XX:+UseCMSCompactAtFullCollection full GC之后进行一次压缩整理,压缩整理时独占的,会引起停顿
-XX:+CMSFullGCsBeforeCompaction 设置进行几次Full GC后进行一次碎片整理
-XX:ParallelCMSThreads 设置CMS的线程数量,一般设置可用CUP的数量

CMS收集器的特点:

  • 尽可能降低停顿
  • 会影响整个系统的吞吐量和性能
  • 清除不彻底(因为在清除过程中,应用程序还在运行,还会产生新的垃圾)
  • 不可以在空间快满时清除(因为和系统应用并发执行,如果内存空间预留不够,则会引起concurrent mode failure如果出现错误,则会启用串行收集器应用挂起进行串行回收。)
  • 在标记清除之后会产生内存碎片(不连续的内存空间),还需要进行压缩整理,否则无法分配占用空间大的对象。

  下面为GC在使用CMS收集器时打出的日志:

CMS为什么不使用标记压缩算法呢?因为CMS收集器在收集过程中时并发的,而标记压缩在压缩整理过程会将内存位置进行移动,那么此时的应用程序就会出现问题,所以在CMS中使用标记清除法,只会去清除未被使用的对象。

-------------------- END ---------------------

最后附上作者的微信公众号地址和博客地址

公众号:wuyouxin_gzh

Herrt灬凌夜:https://www.cnblogs.com/wuyx/

GC参数的更多相关文章

  1. Java虚拟机详解05----垃圾收集器及GC参数

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  2. 深入浅出 JVM GC(4)常用 GC 参数介绍

    # 前言 从前面的3篇文章中,我们分析了5个垃圾收集器,还有一些 GC 的算法,那么,在 GC 调优中,我们肯定会先判断哪里出现的问题,然后再根据出现的问题进行调优,而调优的手段就是 JVM 提供给我 ...

  3. JVM学习十:JVM之垃圾收集器及GC参数

    接近两个月左右没有写博客,主要是因为小孩过来后,回家比较忙,现在小孩端午送回家了,开始继续之前的JVM学习之路,前面学习了GC的算法和种类,那么本章则是基于算法来产生实际的用途,即垃圾收集器. 一.堆 ...

  4. jvm系列(六):Java服务GC参数调优案例

    本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响. 这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题. ...

  5. JVM内核-原理、诊断与优化学习笔记(五):GC参数

    文章目录 堆的回顾 串行收集器 并行收集器 ParNew(par-并行的缩写,new-新生代,所以只是新生代并行) Parallel收集器 参数设置 -XX:MaxGCPauseMills -XX:G ...

  6. 深入JVM内核--GC参数

    堆 GC参数 - 串行收集器 最古老,最稳定 效率高 可能会产生较长的停顿 -XX:+UseSerialGC 新生代.老年代使用串行回收 新生代复制算法 老年代标记-压缩 0.844: [GC 0.8 ...

  7. JVM调优:GC 参数

    2019独角兽企业重金招聘Python工程师标准>>> JVM调优:GC 参数 博客分类: java jvm 参考: <Memory Management in the Jav ...

  8. JVM学习三:JVM之垃圾收集器及GC参数

    一.堆的回顾 新生代中的98%对象都是"朝生夕死"的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块比较大的Eden空间和两块较小的Survivor空间,每次使用E ...

  9. 深入JVM-垃圾收集器常用的GC参数

    1.与串行回收器相关的参数 -XX:+UseSerialGC:在新生代和老年代使用串行收集器 -XX:SurvivorRatio:设置eden区大小和survivor区大小的比例 -XX:Preten ...

  10. JVM学习之GC参数设置

    1: heap size a: -Xmx 指定jvm的最大heap大小,如:-Xmx2g b: -Xms 指定jvm的最小heap大小,如:-Xms1g c: -Xmn 指定jvm中New Gener ...

随机推荐

  1. 【BZOJ】2154: Crash的数字表格 莫比乌斯反演

    [题意]给定n,m,求Σlcm(i,j),1<=i<=n,1<=j<=m,n,m<=10^7. [算法]数论(莫比乌斯反演) [题解] $$ans=\sum_{i\leq ...

  2. python学习笔记(十五)之集合

    集合:对应数学中的集合类型.集合中的元素是唯一,且无序的. 创建集合 方法一:使用{},注意python会自动删除重复元素 >>> number = {1,2,3,4,3,2,1} ...

  3. 推箱子 BFS

    [编程题] 推箱子 大家一定玩过“推箱子”这个经典的游戏.具体规则就是在一个N*M的地图上,有1个玩家.1个箱子.1个目的地以及若干障碍,其余是空地.玩家可以往上下左右4个方向移动,但是不能移动出地图 ...

  4. AngularJs几种服务区别

    下面说说这几种函数之间的区别: 函数 定义 适合场景 provider(name, Object OR constructor() ) 一个可配置的.有复杂逻辑的服务.如果你传递了一个对象,那么它应该 ...

  5. 【洛谷 P3965】 [TJOI2013]循环格(费用流)

    题目链接 回路限制经典题. 每个点拆成入点和出点,源点连每个点的出点,流量1,费用0,每个点出点连汇点,流量1,费用0,入点和出点之间没有边. 也就是说每个点必须靠其他点流来的流量来流入汇点,同时自己 ...

  6. docker 镜像导入和导出

    使用 docker commit 即可把这个容器变为一个镜像 docker commit 8d93082a9ce1 ubuntu:myubuntu 这时候 docker 容器会被创建为一个新的 Ubu ...

  7. DHCP简单配置

    DHCP是什么? DHCP动态主机地址管理协议(Dynamic Host Configuration Protocol)是一种基于UDP协议且仅限用于局域网内使用的网络协议,最主要的用途是为局域网内部 ...

  8. python RSA加密解密及模拟登录cnblog

    1.公开密钥加密 又称非对称加密,需要一对密钥,一个是私人密钥,另一个则是公开密钥.公钥加密的只能私钥解密,用于加密客户上传数据.私钥加密的数据,公钥可以解密,主要用于数字签名.详细介绍可参见维基百科 ...

  9. [ python ] 初始面向对象

    首先,通过之前学习的函数编写一个 人狗大战 的例子. 分析下这个需求,人 狗 大战  三个事情.角色:人.狗动作:狗咬人,人打狗 先创建人和狗两个角色: def person(name, hp, ag ...

  10. Linux上java环境变量配置

    1.java配置 配置环境变量在/etc/profile下增加 # set Java environment JAVA_HOME=/usr/share/jdk1.6.0_43 PATH=$JAVA_H ...