今天看JVM群里有人发了一个GC情况,让人帮忙看优化的,于是我也凑热闹发了出来想让群里的大神们指导优化一下,以下是优化过程记录.

一开始我贴了下面的两张图

jstat看GC记录
jstat -gcutil pid 1000 20

jcmd看VM参数(第一次使用这个命令)
jcmd pid VM.flags

可以看到YGC了8W多次,FGC有1100+,相比较另一个发出来求教的,我这个更糟糕,他的是运行了3天左右 FGC370次

然后飞神让我看下运行时间
ps -p pid -o etime

我的也是跑了3天左右,感觉优化空间非常的大

又让我拉了JVM配置
jinfo -flags pid(没权限,没执行成功)
ps aux | grep pid

发现我的JVM完全没做过优化,据我自己的印象,就改过PermSize,因为这个OOM过,所以调大了一点。

然后飞神给了我一份他之前用过的配置
JAVA_OPTS="-Xms2g -Xmx2g -Xmn512m -XX:MaxPermSize=256m  -server -Xss256k -XX:PermSize=128M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data/log/gclog/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/log/jvmdump/jvm.bin -XX:+UseConcMarkSweepGC -XX:+UseParNewGC  -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:+TieredCompilation  -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC

并嘱咐了一句loggc和dumpPath提前mkdir

因为已经是周五晚上了,我没有权限直接修改这个配置,所以准备下周一再配上去看效果。

万万没想到,回家路上,笨神出来说话了,要我看下存活实例

jmap -histo:live pid

由于没有开启GC日志,于是笨神让我开着jstat(飞神提到jstat -gccause pid可以跟踪gc情况),然后在另一个窗口执行jmap -histo:live

刚开始没明白,后来才知道原来这个命令可以触发Full GC

可以看到执行了Full GC以后Old区从90%降到了79%,FGC效果很差,说明活对象太多了。

回过头去看jmap实例,发现AtomicInteger这个类对象特别的多,竟然有300多万个实例,已经是top2了。

翻看代码没有发现有使用这个类的地方,初步怀疑是依赖的jar包使用的,笨神建议dump用MAT分析一下。

dump命令导出文件
jmap -dump:format=b,file=pid.dump pid

检查了一下项目代码后,发现了问题,项目代码就不贴了

项目中有一个统计API调用次数的类使用了AtomicInteger,在这个类里针对每个用户都会生成大概六七十个AtomicInteger实例,每次上报过数据之后只是简单的把值设置为0,导致负责统计的实例一直持有这些AtomicInteger,而且随着新用户的不断增加,这些实例数量还会持续增长,最终会导致内存溢出。

修改完这个BUG,重新上线后,跑了一段时间查看gc情况

可以看到比之前好一些了 但是FGC的次数还是比较多,照这情况下去一天的FGC估计会有200+,这当然是不可接受的(前面说的另一个人370次FGC,飞神说如果是跑了半年的话还可以接受)。

看了飞神推荐的阿里毕玄大师的文章为什么不建议

于是准备先不上CMS GC,就简单的把Xms,Xmn和GC日志配置了一下

-Xms2048m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=128m -Xss256k -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data/project/delivery_v9/code/logs/gc.log -XX:GCLogFileSize=50m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/project/delivery_v9/tomcat/jvmdump/jvm.dump

运行了一天左右看下对比结果

未配置

已配置

可以看到配置完以后对GC影响还是挺大的(不管是YGC还是FGC),当然这也是必然的,毕竟没有配置的机器初始内存比较小,在不断扩容的过程中会频繁的GC,而且这个时候其实没配置的那台机器内存还没有扩充到上限,在资源充足的情况下,这种动态扩容显然是完全没有必要的。

配置完的机器虽然GC时间和次数已经降了很多了,但是还是没达到期望的结果,考虑到这个程序短时间的活对象是比较多的,可以通过调整年轻代和老年代的内存占比来减少因为年轻代内存不足导致晋升到老年代的对象。

现在已经离开这个项目了,所以后面就没有再继续优化了,以后再有这方面的实践重新写文章记录。

JVM优化过程全记录相关推荐

  1. 统计各个函数的耗时_分享一次CMS GC耗时狠高优化过程全记录

    1. 背景 多个业务线的应用出现LongGC告警 最近一段时间,经常收到CAT报出来的Long GC告警(配置为大于3秒的为Longgc). 2. 知识回顾 2.1 JVM堆内存划分 新生代(Youn ...

  2. 【SQL编程】Greenplum 实现树结构+自定义函数+避免函数重复调用+ function cannot execute on a QE slice 问题处理(优化过程全记录)

    1.需求说明 这是一个关于POI的应用,数据从水经微图下载而来,需要处理的是街道层级的数据,但是最终的POI信息要有省.市.县数据,所有需要用到行政区划表来补全数据. 2.编程实例 2.1 实现树结构 ...

  3. DL之Attention-ED:基于TF NMT利用带有Attention的 ED模型训练、测试(中英文平行语料库)实现将英文翻译为中文的LSTM翻译模型过程全记录

    DL之Attention-ED:基于TF NMT利用带有Attention的 ED模型训练(中英文平行语料库)实现将英文翻译为中文的LSTM翻译模型过程全记录 目录 测试输出结果 模型监控 训练过程全 ...

  4. NLP之WE之Skip-Gram:基于TF利用Skip-Gram模型实现词嵌入并进行可视化、过程全记录

    NLP之WE之Skip-Gram:基于TF利用Skip-Gram模型实现词嵌入并进行可视化 目录 输出结果 代码设计思路 代码运行过程全记录 输出结果 代码设计思路 代码运行过程全记录 3081 or ...

  5. ros2_object_analytics安装过程全记录

    ros2_object_analytics安装过程全记录 ros2_object_analytics安装过程全记录 问题总结 (1)OpenCV3.3依赖问题 (2)devel版本中librealse ...

  6. 64位Ubuntu 12.04下搭建嵌入式Qt(4.8.6)、QtCreator、qvfb过程全记录

    最新公司搞一个新项目,需要在Linux下进行UI界面设计.选来选去,最后选择采用Qt平台来做,于是要开始研究一下Qt. Qt作为业内最著名的UI开发工具之一,是一套完整的跨平台C++图形用户界面应用程 ...

  7. 在CentOS7上安装配置Corosync高可用集群过程全记录

    在CentOS7上安装配置Corosync高可用集群过程全记录 一.环境.拓朴及其他准备工作: 1-1:准备网络YUM源环境: All Nodes OS CentOS 7.3 x86_64: # wg ...

  8. AIX 关键系统文件被清空问题定位过程全记录

    问题描述 某日接到客户反馈,某系统备机重启后 telnet 无法登录,提示信息如下: telnet (testlpar1)telnetd: /bin/login: Cannot run a file ...

  9. Ubuntu16.04LTS+CUDA8.0+cuDNN5.1+Anaconda3(python3.6)+tensorflow_gpu-1.2.1安装过程全记录

    Ubuntu16.04LTS+CUDA8.0+cuDNN5.1+Anaconda3(python3.6)+tensorflow_gpu-1.2.1安装过程全记录 最近搭建了一台用于深度学习的服务器,其 ...

最新文章

  1. 【转载】JUnit各个注解的含义
  2. 通过FFT来计算螺旋线的匝数
  3. CocoaPods管理iOS的第三方类库
  4. spring5 配置log系统MAVEN
  5. OEL6.8安装虚拟带库模拟器
  6. github page hexo博客gitee_GitHub+hexo快速搭建个人博客
  7. EPSON EPL-6200 无法网络共享问题
  8. 你要练神功,就应该先自宫,对不?
  9. 发言倒计时器_北京会议发言计时器 会议发言提醒器 赛事发言倒计时器
  10. python excel图表 导出word模板_使用python将Excel数据填充Word模板并生成Word
  11. CCF论文会议 IEEE 如何查询某个会议期刊的所有文章
  12. php打开word文件怎么打开,docx文件怎样打开
  13. RFID医疗废物管理系统解决方案-RFID技术的医疗废弃物管理系统
  14. 智能新时代-不一样的人机交互体验
  15. QT5.9用自定义字体修改qlabel字体、大小以及颜色
  16. 虚幻4和Unity3D应该学哪个
  17. 前端技术搭建飞机大战小游戏(内含源码)
  18. Finished with error:Navicat 运行SQL文件 报错
  19. 视频网站中video标签中blob:http
  20. 事件参数$event

热门文章

  1. Dubbo服务引用过程
  2. mysql1.8找回密码_PHP+Mysql+jQuery找回密码
  3. 什么是分布式事务以及有哪些解决方案?
  4. python 用一个数组实现三个栈
  5. crash工具解析_Linux 后台开发常用调试工具
  6. ROS知识【15】:在eclipse创建ROS项目
  7. java类函数默认的保护级别_事件说明
  8. 哨兵机器人钢力士_还记得秒杀X战警的哨兵机器人吗?在漫威原著里,X战警更憋屈...
  9. C~K招亲_JAVA
  10. 数据结构实验之数组三:快速转置