GC参数
串行收集器
串行收集器(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参数的更多相关文章
- Java虚拟机详解05----垃圾收集器及GC参数
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- 深入浅出 JVM GC(4)常用 GC 参数介绍
# 前言 从前面的3篇文章中,我们分析了5个垃圾收集器,还有一些 GC 的算法,那么,在 GC 调优中,我们肯定会先判断哪里出现的问题,然后再根据出现的问题进行调优,而调优的手段就是 JVM 提供给我 ...
- JVM学习十:JVM之垃圾收集器及GC参数
接近两个月左右没有写博客,主要是因为小孩过来后,回家比较忙,现在小孩端午送回家了,开始继续之前的JVM学习之路,前面学习了GC的算法和种类,那么本章则是基于算法来产生实际的用途,即垃圾收集器. 一.堆 ...
- jvm系列(六):Java服务GC参数调优案例
本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响. 这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题. ...
- JVM内核-原理、诊断与优化学习笔记(五):GC参数
文章目录 堆的回顾 串行收集器 并行收集器 ParNew(par-并行的缩写,new-新生代,所以只是新生代并行) Parallel收集器 参数设置 -XX:MaxGCPauseMills -XX:G ...
- 深入JVM内核--GC参数
堆 GC参数 - 串行收集器 最古老,最稳定 效率高 可能会产生较长的停顿 -XX:+UseSerialGC 新生代.老年代使用串行回收 新生代复制算法 老年代标记-压缩 0.844: [GC 0.8 ...
- JVM调优:GC 参数
2019独角兽企业重金招聘Python工程师标准>>> JVM调优:GC 参数 博客分类: java jvm 参考: <Memory Management in the Jav ...
- JVM学习三:JVM之垃圾收集器及GC参数
一.堆的回顾 新生代中的98%对象都是"朝生夕死"的,所以并不需要按照1:1的比例来划分内存空间,而是将内存分为一块比较大的Eden空间和两块较小的Survivor空间,每次使用E ...
- 深入JVM-垃圾收集器常用的GC参数
1.与串行回收器相关的参数 -XX:+UseSerialGC:在新生代和老年代使用串行收集器 -XX:SurvivorRatio:设置eden区大小和survivor区大小的比例 -XX:Preten ...
- JVM学习之GC参数设置
1: heap size a: -Xmx 指定jvm的最大heap大小,如:-Xmx2g b: -Xms 指定jvm的最小heap大小,如:-Xms1g c: -Xmn 指定jvm中New Gener ...
随机推荐
- html css 如何将表头固定
position属性取值为fixed时,则元素的位置将不受滚动条的影响,而是直接依据窗口定位,这就是将表头固定的最直接方法,网上其他途径感觉都是在走弯路.但是与此同时必须解决两个问题.第一:表体将随之 ...
- 【BZOJ2882】【字符串的最小表示】工艺
题目描述 小敏和小燕是一对好朋友. 他们正在玩一种神奇的游戏,叫Minecraft. 他们现在要做一个由方块构成的长条工艺品.但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工艺品最左边的方 ...
- 【洛谷 P2216】 [HAOI2007]理想的正方形(二维ST表)
题目链接 做出二维\(ST\)表,然后\(O(n^2)\)扫一遍就好了. #include <cstdio> #include <cstring> #include <a ...
- js-打地鼠游戏开发
[生成画布] 第1课[随机生成地鼠] 第2课[定时生成地鼠] 第3课[打地鼠完结篇] 第4课 优酷在线播放地址 http://list.youku.com/albumlist/show?id=2939 ...
- spring boot 自定义属性覆盖application文件属性
参考 Spring boot源码分析-ApplicationListener应用环境: https://blog.csdn.net/jamet/article/details/78042486 加载a ...
- python3.4.3安装allure2记录
一.安装:cmd执行命令pip install allure-pytest 二.下载allure2:2.7.0版本 https://dl.bintray.com/qameta/generic/io/q ...
- selenium启动chrome模拟器模拟手机
一.如果chrome选项里边有这个模拟设备(比如iPhone 6 Plus): 1.先启动Selenium Grid, 比如命令:java -jar selenium-server-standalon ...
- centos上git搭建
1 git的安装需要一些包: yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-Ex ...
- BootStrap的table表格,栅格系统,form表单的样式
BootStrap BootStrap的简介 1. 什么是Bootstrap 由两个前端设计师开发的一个前端的框架(Html,css,js) 简化了程序员写css的代码 2. 为什么使用B ...
- BeanUtils封装对象时一直提示ClassNotFoundException:org.apache.commons.beanutils.BeanUtils
导包明明正确了,依赖包也全都导对了,还是出错. 困扰了3天. 后来看到这篇博文,https://blog.csdn.net/yanshaoshuai/article/details/81624890 ...