记一次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虚拟机中,数据类型可以分为两类:基本类型和引用类型. 基本类 ...
随机推荐
- Delphi对Word一些进阶操作
利用VBA 编程,可以使许多日常的任务自动完成,使用户的工作更有效率. 1.在启动时显示打开对话框 一般情况下启动Word,Word 会认为是创建一个新文档.如果只是想打开一个旧文档进行编辑,在Wor ...
- ios UISearchDisplayController 实现 UITableView 搜索功能
UISearchDisplayController 是苹果专为 UITableView 搜索封装的一个类. 里面内置了一个 UITableView 用于显示搜索的结果.它可以和一个需要搜索功能的 co ...
- git笔记四
git log --graph --oneline 中的--oneline相当于 --pretty=oneline但是可以显示更短小的id git reset --hard HEAD^ git res ...
- 【Lua】CJSON的安装
Lua CJSON 是 Lua 语言提供高性能的 JSON 解析器和编码器,其性能比纯 Lua 库要高 10 到 20 倍.Lua CJSON 完全支持 UTF-8 ,无需依赖其他非 Lua/LuaJ ...
- a[i]==i[a]==*(i+a)==*(a+i)
在C语言中,如果我们要访问一个数组的某个下标对应的元素,通常的写法是a[i].但从汇编的角度看,写成i[a]一点问题都没有. 下面通过代码给出证明. o foo1.c int main(int arg ...
- ddddddeeeessssssttttrrrrrrooooooyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
我遥远的 POI 计划啊 https://loj.ac/problems/search?keyword=POI2011 atcoder 一套 动态 DP SAM 随便看 XSY 的题 UOJ Roun ...
- Netezza External Tables --How to use local files in external table
FROM: http://tennysusantobi.blogspot.com/2012/08/netezza-external-tables.html Netezza External Table ...
- [android] 界面切换的简单动画
1. 新建个位移动画的xml文件 Activity中开启动画 使用AnimationUtils类加载动画资源文件 left_to_right.xml <?xml version="1. ...
- 一:HttpClient知识整理
一:httpclient 简介 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支 ...
- 如何删除eclipse中已经保存的svn密码
一.打开eclipse--->点击Window--->点击Perference,打开eclipse配置,输入svn,然后点击svn,找到下方svn接口,查看下svn是什么类型的接口,如果是 ...