一、前言

之前在使用JDK默认的垃圾回收器时遇到一些问题,于是对该问题进行了具体实验与分析。详情请参考Java默认垃圾回收器Parallel Scavenge导致Full GC增加。

通过之前的分析我们知道了默认JDK1.7和JDK1.8的垃圾回收器是Parallel Scavenge。且它会默认启用参数UseAdaptiveSizePolicy,即开启堆大小自适应策略。这样会导致随着时间的运行PS垃圾回收器的Survivor Space变得越来越小,通知是TT变成1。这会最终导致Full GC的次数增加(相对其他GC)。

针对这个问题,我们只需要通过显示参数-XX:-UseAdaptiveSizePolicy来关闭堆大小自适应策略即可。但是应用重启运行一段时间之后,我发现Young  GC优点频繁。于是我编对该应用进行了简单的线上调优。接下来,我们就和大家一起回顾这个调优过程。

二、具体调优过程

1、默认存在的问题

开始调优之前,我们首先来看下默认的Young GC情况。

通过GC监控图我们可以看到,平均10秒就有一到两次Young GC。这个Young GC频率相对来说确实比较频繁。因为该应用的请求量也并不大。而且可以看到Young GC次数波动性比较大。

我们想要调优首先就会考虑到查看当前堆的使用情况。于是我们打印出了当前堆的使用情况(如下图)。

通过堆的使用情况我们可以看到新时代已经快被用完了。但是老年代的剩余空间很多。于是我们可以得知,不断频繁Young GC是因为新时代的空间先对太小,很容易就被占满了。而老年代有很多剩余空间,于是我们自然而然的可以想到,将老年代的空间缩小,新生代的空间扩大。

2、第一次调优情况

通过上面的推论,我们知道这里调优需要调整新生代和老年代的比例,由于之前是使用的默认值2,即NewRatio=2。现在我们将NewRatio改为1,此时新生代和老年代的比例为1:1,即新生代和老年代的大小都为1024M。修改完配置后我们重启应用,并允许一段时间。然后我们观察到Young GC的情况如下:

通过上图我们可以看到Young GC的情况稍微有点好转了。但是似乎还是不是很理想,没有看到比较完美的曲线(完美曲线代表Young GC比较稳定)。于是我们再次打印出堆的使用情况,如下图:

通过上图的堆的使用情况,我们可以看到新时代的空间还是不怎么够用,但是老年代的空间还是剩余比较多。于是我们还可以继续跳转新时代老年代的空间比例。

3、最后一次调优情况

通过上述分析,我们需要再次跳转新时代老年代的比例。但是NewRatio已经被我们调到了最低为1了。于是我们需要放弃这个参数,而改使用-Xmn来直接指定新时代的大小。于是我们制定Xmn=1620M。然后重启应用允许一段时间之后继续观察其Young GC曲线。

通过Young GC曲线,我们可以看到Young GC已经基本保持在20秒1次GC的情况,且比较稳定。于是也就基本达到我们的调优要求。此时我们再次看看堆的使用情况。老年代已经到了69%了,因此如果再调小老年代可能会导致Full GC加剧。于是我们的调优都到此为止吧。

三、调优总结

整体来说这次线上调优其实比较简单,就是通过不断的尝试找到新时代和老年代的一个相对平衡的大小比例。让Young GC比较稳定,且不是那么频繁,同时让Full GC不会太高。所以本次调优重点不在使用了多么复杂的技术,而是在于调优的一个过程。以及遇到类似问题不是简单的通过增加整体堆大小的方式来解决,而是在有限的堆空间内让Young GC和Full GC达到一个平衡。

我想有很多同学都会问两个问题:1、为什么不直接调大整体堆的大小;2、为什么要用PS这个存在Full GC问题的垃圾回收器。

首先第一个问题,上面我也提到过了,调优的目的是对空间的合理利用,在有限的堆空间内让Young GC和Full GC或者是停顿时间达到一个相对平衡。而不能遇到问题就通过新增堆大小的方式来解决。

至于第二个问题,这里使用PS,是因为该应用本身就使用的PS垃圾回收器。基于同一个垃圾处理器来操作,更能体现调优带来的效果。如果换成CMS,也许就不是很好对比了,因为CMS下基本不存在Full GC。

四、惯例

如果你对本文有任何疑问或者高见,欢迎添加公众号共同交流探讨(添加公众号可以获得”Java高级架构“上10G的视频和图文资料哦)。

Parallel Scavenge垃圾回收器线上调优实战相关推荐

  1. Parallel Scavenge垃圾回收器

    Parallel与Parallel Old垃圾回收器(学习笔记) 简介 全称为Parallel Scavenge收集器. HotSpot中,除了ParNew收集器是基于并行回收以外,Parallel ...

  2. Parallel Scavenge和Parallel Old垃圾回收器组合

    8.5.2. Parallel Scavenge和Parallel Old垃圾回收器组合 1)工作地点 Parallel Scavenge垃圾回收器工作在年轻代,而Parallel Old工作在老年代 ...

  3. hive不在同一台机 hue_环境篇:呕心沥血@CDH线上调优

    环境篇:呕心沥血@CDH线上调优 为什么出这篇文章? 近期有很多公司开始引入大数据,由于各方资源有限,并不能合理分配服务器资源,和服务器选型,小叶这里将工作中的总结出来,给新入行的小伙伴带个方向,不敢 ...

  4. 清华毕业大牛教你涨薪5K的JVM调优骚操作是什么!如何在简历写上熟悉(精通)JVM调优,有过线上调优经验!

    就在前天的时候,马士兵老师讲了一节公开课,分享了涨薪5K的JVM调优骚操作是什么!如何在简历写上熟悉(精通)JVM调优,有过线上调优经验! 主要包含的内容如下: 1. 为什么一个百万级TPS系统会频繁 ...

  5. JVM垃圾回收器和调优

    回顾 什么是GC? 找到垃圾,并且回收,让这块内存重新可用. Java的GC算法是根搜索算法,可以作为GCRoot的对象有 线程栈变量 静态变量 常量池 JNI指针 回收的算法有: 标记清除 标记整理 ...

  6. 转载一条G1垃圾回收器的调优经验

    感觉写的不错,G1在未来两三年肯定慢慢占据主流,多学习学习: 开源搜索引擎Solr是一款非常优秀的搜素引擎,只要一些简单的配置就能进行使用,大大减少了开发时间. 在我工作的环境中,整站的商品搜索业务都 ...

  7. elasticsearch线上调优[ Data too large]

    项目场景: 最近es的线上经常出现一个内存的异常的问题,我解决了各种的途径都无效.最后再方案一种解决最终办法,方案二能解决部分问题. 问题描述:[[parent] Data too large, da ...

  8. java 线上调优_阿里余额宝团队Java4面:G1+二叉树+线上调优+MQ+Redis

    最近不少人都在找工作,很多人开始抱怨,工作难找,不少人后台问我怎么办,讲真,我也无能为力,年前我就说了,今年节后工作竞争一定比较激烈的. 面试只是对个人技术及应变能力的一次考验.只有解决了一个问题,你 ...

  9. 史上最经典垃圾回收器(CMS,G1)详解、适用场景及特点、使用命令

    文章目录 垃圾收集器介绍总结 各个垃圾收集器之间的关系 垃圾收集器使用命令及默认值 详解各个垃圾收集器 Serial ParNew Parallel Scavenge Serial Old Paral ...

  10. jdk8默认垃圾回收器_JVM系列之经典垃圾回收器(上篇)

    封面图 1.前言 随着 JDK 的不断更新,垃圾回收器的效率也越来越高.每一次 JDK 的更新,必然会包含有垃圾回收器的更新,截止目前,在最新的 JDK14 版本中,最新的垃圾回收器为 ZGC. 从垃 ...

最新文章

  1. 少侠!如何写一手好 SQL ?
  2. JavaScript执行环境及作用域(一)——执行环境栈和作用域链机制
  3. linux 共享内存_盘点那些linux 后台开发类常见问题及知识点
  4. python学习笔记 - StringIO以及BytesIO
  5. Mybatis中的collection、association来处理结果映射
  6. 天下会 - 搜索实战系列之视频
  7. Java摇骰子比大小_还在摇骰子比大小?这几款火热的KTV喝酒游戏你值得收藏
  8. mysql5.7.6允许远程_mysql5.7 设置远程访问
  9. 存储如何做远程服务器数据备份_如何选择存储用的服务器?
  10. 作团队感悟(4)----分享的心态
  11. 原生 JS 撸一个轮播图(支持拖拽切屏)
  12. 基于物联网的智能门锁应用系统设计方案
  13. ThunderSoft Apple Music Converter Mac(drm限制解除工具)
  14. JAVA数组首位末位互换_堆和堆傻傻分不清?一文告诉你 Java 集合中「堆」的最佳打开方式...
  15. mysql查询最近7天的数据,没有数据自动补0
  16. kaldi 的安装和thchs30语音识别测试
  17. pg事务篇(二)—— 事务ID回卷与事务冻结(freeze)
  18. Vue3+ElementPlus网页端聊天|vue3.0仿微信/QQ界面实例
  19. 要点初见:从旅行青蛙开始的OpenCV3模板匹配功能探索
  20. 关于root 联想ZUK z2 遇到的一系列问题

热门文章

  1. 产品经理的修炼之道--读后感
  2. 《经济学通识》十二、谈环保
  3. java 查询微信支付订单
  4. 扑克牌游戏“快算24”算法
  5. 怎么判断日出时间早晚_怎样知道当地每天几点日出?
  6. Handing Incomplete Heterogeneous Data using VAEs
  7. 他“砍”了拼多多一刀!!!
  8. 三维气象数据可视化系统介绍
  9. JAVA操作共享文件夹文件、下载、读取(windows、Linux通用)
  10. 微信公众号Token验证 signature验证