串行收集器

  串行收集器(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. MongoDB - MongoDB CRUD Operations, Query Documents, Query for Null or Missing Fields

    Different query operators in MongoDB treat null values differently. The examples on this page use th ...

  2. Network File System

    Network File System 2014-12-31 #system 接着上一篇博客Distributed Systems 分布式系统来扯淡,之前的博客一再在写文件系统,这次继续,只不过是分布 ...

  3. Logitech K810 + Ubuntu

    The Logitech K810 is a nice keyboard, but it does not work with Ubuntu out of the box. Still contrar ...

  4. 十二步创建你的第一个JavaScript库

    是否曾对Mootools的魔力感到惊奇?是否有想知道Dojo如何做到那样的?是否对jQuery感到好奇?在这个教程中,我们将了解它们背后的东西并且动手创建一个超级简单的你最喜欢的库. 我们其乎每天都在 ...

  5. 20155117王震宇 2006-2007-2 《Java程序设计》第5周学习总结

    教材学习内容总结 try & catch java中的错误会被打包成对象,可以尝试(try)捕捉(catch)代表错误的对象后做一些处理.如果发生错误,会跳到catch的区块并执行. 异常结构 ...

  6. NYOJ 1022 合纵连横 (并查集)

    题目链接 描述 乱世天下,诸侯割据.每个诸侯王都有一片自己的领土.但是不是所有的诸侯王都是安分守己的,实力强大的诸侯国会设法吞并那些实力弱的,让自己的领土面积不断扩大.而实力弱的诸侯王为了不让自己的领 ...

  7. matlab求逆运算:左除( \ )和右除( / ),inv,pinv

    矩阵求逆可以使用左除(\)和右除(/),inv,pinv 首先了解需要求逆的矩阵A是否为奇异方阵 inv 若A为非奇异方阵,则存在逆矩阵,可利用inv求逆: inv(A) pinv 若需要求逆的矩阵A ...

  8. filezilla显示隐藏文件

    我们在习惯使用flashfxp等工具,但是随着主机商限制较多,这些老的FTP工具不怎么好用了,比如主机商会推荐使用到Filezilla等工具.但是比如息壤主机,我们在管理linux环境下htacess ...

  9. Construct Binary Tree from Inorder and Postorder Traversal (&&Preorder and Inorder Traversal )——数据结构和算法的基本问题

    Given inorder and postorder traversal of a tree, construct the binary tree. Note: You may assume tha ...

  10. MVC – 7.Razor 语法

    7.1 Razor视图引擎语法 Razor通过理解标记的结构来实现代码和标记之间的顺畅切换. @核心转换字符,用来 标记-代码 的转换字符串. 语境A: @{ string rootName=&quo ...