记一次JVM调优之旅(斗争full gc)
俗话说技多不压身,当年苦读《深入理解JVM》还专门整理了笔记,现在就用上了~
笔记 http://www.cnblogs.com/syjkfind/p/3901774.html
【症状】 用户操作数据导出时总会发生卡顿,后台占内存的定时任务发生时也会。JVM参数就不贴了,比较普通且相对合理。
【思路】
查gc日志是发生了full gc,tomcat日志零零散散有很多exception。
另外凭着对代码的了解,触发时同时刻的日志显示正在执行较大数据量的查询而且装载进JVM,方法调用和临时变量也很多。
【分析】
1.minor gc很频繁,但时间短所以问题不大,触发原因基本都是申请空间失败。
2.偶尔有System.gc(),时间大概1分钟。代码中没有显式调用,基本确定是监控程序RMI访问触发的。可以加参数禁用 -XX:+DisableExplicitGC 。
3.时常有promotion failed,即在minor gc时年轻代的存活区空间不足而进入老年代,老年代又空间不足而触发full gc。时间大概3分钟。解决思路一种是增大存活区,一种则相反是去掉存活区增大老年代。相关参数一般有:
-XX:SurvivorRatio=32 存活区除以伊甸区的比率,存活区有from和to两个,所以这里的意思是单个存活区占年轻代的1/34;
-XX:OldSize=60M 老年代大小;
-XX:MaxTenuringThreshold=15 即多少次minor gc后存活的年轻代对象会晋升老年代。
4.经常有concurrent mode failure,即CMS执行过程中老年代空间不足,这时会变成Serial Old收集器导致更长时间的停顿。时间大概5分钟。其中引发这一问题的情况可能是浮动垃圾太多、可能是CMS收集器本身也占用堆空间、也可能是老年代太多碎片,但都是CMS收集器的特性导致的。相关配置一般有:
-XX:CMSInitiatingOccupancyFraction=80 即老年代满80%时触发CMS(full gc),调高则full gc相对减少,调低则full gc处理得比较快;
-XX:UseCMSCompactAtFullCollection 或 -XX:CMSFullGCsBeforeCompaction=5 即full gc前或后做碎片整理。
5.另有个有趣的文章,过多过长的exception会导致promotion failed
http://www.th7.cn/Program/java/201511/685711.shtml
可能挺符合我们的场景的,没有运维权限,下次可以考虑找运维dump个分析一下对象。
以前为了追踪错误关闭了“快抛” -XX:-OmitStackTraceInFastThrow 即反复出现的exception不会用一个静态的没堆栈信息的实例去代替,这个要权衡一下了。
【解决】
创建很多对象占了年轻代?大对象导致占满老年代?浮动垃圾(CMS时继续在产生临时对象)或老年代碎片?
调优多少是可以改善的,但似乎代码本身更有问题,恐怕分配再多的内存都不够吃。比如没有应用较完善的一级缓存二级缓存,比如经常粗暴地把上万条记录加载进来,还没做分页,还有藏的比较深的做了切面触发异步服务把异步服务队列占满了。初期享受了框架的便利而考虑设计的少,而现在则要开始还技术债务了~
所幸的是在有限的时间里,我们有简单粗暴有效的方法缓解这些问题:加服务器,把大任务剥离出来~
而中长期的考虑来看,在不改变现有框架的前提下,整改exception、整改业务代码做分页、封装数据库分页查询框架、改造数据库层二级缓存(集群范围内缓存)会是比较有效的措施。
更长远的肯定就是回归Spring系主流框架,再者进军服务化了。。。但那个几乎要把业务代码重新写一遍,是后话了。
回归主题如果是调优来解决问题,最好是dump了做更深入的分析。主观上看来启用快抛、gc后碎片整理、增大存活区应该是比较有针对性的调整,而CMSInitiatingOccupancyFraction取值和CMS各阶段细致的配置则需要更量化的分析。
记一次JVM调优之旅(斗争full gc)的更多相关文章
- java内存管理之垃圾回收及JVM调优
GC(garbage Collector 垃圾收集器)作用:a.内存的动态分配:b.垃圾回收注:Java所承诺的自动内存管理主要是针对对象内存的回收和对象内存的分配. 一.垃圾标记 程序计数器.Jav ...
- JVM调优浅谈
1.数据类型 java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本 ...
- JVM调优总结 + jstat 分析(转)
[转] JVM调优总结 + jstat 分析 JVM调优总结 + jstat 分析 jstat -gccause pid 1 每格1毫秒输出结果jstat -gccause pid 2000 每格2秒 ...
- 深入理解JAVA虚拟机(内存模型+GC算法+JVM调优)
目录 1.Java虚拟机内存模型 1.1 程序计数器 1.2 Java虚拟机栈 局部变量 1.3 本地方法栈 1.4 Java堆 1.5 方法区(永久区.元空间) 附图 2.JVM内存分配参数 2.1 ...
- JVM调优浅谈(转)
1.数据类型 java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本 ...
- jvm 调优(2)垃圾回收算法
可以从不同的的角度去划分垃圾回收算法: 按照基本回收策略分 引用计数(Reference Counting): 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数. ...
- 面试总问的jvm调优到底是要干什么?
1. 压力测试的理解,xxx的性能10w/s,对你有意义么? 没有那家卖瓜的会说自己家的不甜,同样,没有哪个开源项目愿意告诉你在对它条件最苛刻的时候压力情况是多少,一般官网号称给你看的性能指标都是在最 ...
- 一文带你深入了解JVM性能调优以及对JVM调优的全面总结
目录 JVM调优 概念 基本垃圾回收算法 垃圾回收面临的问题 分代垃圾回收详述1 分代垃圾回收详述2 典型配置举例1 典型配置举例2 新一代的垃圾回收算法 调优方法 反思 一.JVM调优的一些概念 数 ...
- JVM调优小结
JVM调优浅谈 https://www.cnblogs.com/andy-zhou/p/5327288.html 1.数据类型 java虚拟机中,数据类型可以分为两类:基本类型和引用类型. 基本类 ...
随机推荐
- vuex到底是什么?
vuex到底是什么? 使用vue也有一段时间了,但是对vue的理解似乎还是停留在初始状态,究其原因,不得不说是自己没有深入进去,理解本质,导致开发效率低,永远停留在表面, 更坏的结果就是refresh ...
- Centos7修改主机名称、DNS、网卡信息
1 hostnamectl set-hostname wangshuyi 2 vi /etc/hostname 3 vi /etc/resolv.conf 4 vi /etc/sysconfig/ne ...
- android viewpager 拿到当前显示的 fragment 的实例
一个 ViewPager 通过 FragmentPagerAdapter 绑定了 3 个 fragment 可以通过 Fragment fragment = getSupportFragmentMan ...
- JavaSE_XMind总结
1 JDBC知识点总结
- swift与OC混编之调用函数
在桥接头文件里#import oc的.h文件,整个swift工程都能使用该oc文件,在.h里暴露的方法都能被该工程使用 //oc文件 TestOC.h #import @interface TestO ...
- 周记2——ios的日期格式bug
转眼又到了周末,转眼又要上班,转眼...大概这就是一眼万年的意思吧. 这周继续IM(即时聊天),项目用的是LayIM移动端改装的,仅仅“借用”了一个聊天窗口.由于是内嵌App的页面,自然少不了Andr ...
- 项目管理系列--从零开始Code Review[转]
从零开始Code Review 这篇帖子不是通篇介绍Code Review的方法论, 而是前大段记录了我们团队怎么从没有这个习惯到每天都进行review的过程, 后小段给出了我的一些建议. 希望能对诸 ...
- 在Android下通过ExifInterface类操作图片的Exif信息
什么是Exif 先来了解什么是Exif.Exif是一种图像文件格式,它的数据存储于JPEG格式是完全相同的,实际上Exif格式就是JPEG格式头插入了 数码照片的信息,包括拍摄的光圈.快门.平衡白.I ...
- nltk模块
1. nltk简介 http://www.nltk.org 2. nltk能做什么? 2.1 搜索文本 单词搜索 相似词搜索 相似关键词识别 词汇分布图 生成文本 from nltk.book imp ...
- Javaee的Dao层的抽取
有时候我们在实现不同功能的时候回看到很多的Dao层的增加.修改.删除.查找都很相似,修改我们将他们提取BaseDao 一.提取前 1. 提取前的LinkDao层: public interface L ...