俗话说技多不压身,当年苦读《深入理解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)的更多相关文章

  1. java内存管理之垃圾回收及JVM调优

    GC(garbage Collector 垃圾收集器)作用:a.内存的动态分配:b.垃圾回收注:Java所承诺的自动内存管理主要是针对对象内存的回收和对象内存的分配. 一.垃圾标记 程序计数器.Jav ...

  2. JVM调优浅谈

    1.数据类型 java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本 ...

  3. JVM调优总结 + jstat 分析(转)

    [转] JVM调优总结 + jstat 分析 JVM调优总结 + jstat 分析 jstat -gccause pid 1 每格1毫秒输出结果jstat -gccause pid 2000 每格2秒 ...

  4. 深入理解JAVA虚拟机(内存模型+GC算法+JVM调优)

    目录 1.Java虚拟机内存模型 1.1 程序计数器 1.2 Java虚拟机栈 局部变量 1.3 本地方法栈 1.4 Java堆 1.5 方法区(永久区.元空间) 附图 2.JVM内存分配参数 2.1 ...

  5. JVM调优浅谈(转)

    1.数据类型 java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:它代表的值就是数值本身,而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本 ...

  6. jvm 调优(2)垃圾回收算法

    可以从不同的的角度去划分垃圾回收算法: 按照基本回收策略分 引用计数(Reference Counting): 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数. ...

  7. 面试总问的jvm调优到底是要干什么?

    1. 压力测试的理解,xxx的性能10w/s,对你有意义么? 没有那家卖瓜的会说自己家的不甜,同样,没有哪个开源项目愿意告诉你在对它条件最苛刻的时候压力情况是多少,一般官网号称给你看的性能指标都是在最 ...

  8. 一文带你深入了解JVM性能调优以及对JVM调优的全面总结

    目录 JVM调优 概念 基本垃圾回收算法 垃圾回收面临的问题 分代垃圾回收详述1 分代垃圾回收详述2 典型配置举例1 典型配置举例2 新一代的垃圾回收算法 调优方法 反思 一.JVM调优的一些概念 数 ...

  9. JVM调优小结

    JVM调优浅谈 https://www.cnblogs.com/andy-zhou/p/5327288.html   1.数据类型 java虚拟机中,数据类型可以分为两类:基本类型和引用类型. 基本类 ...

随机推荐

  1. poj 3750 小孩报数问题

    小孩报数问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11527   Accepted: 5293 Descripti ...

  2. Parsing Failure in config.xml: java.lang.IllegalArgumentException: In production mode, it's not allowed to set a clear text value to the property

    Step1). in your "setDomainEnv.sh" script set the "PRODUCTION_MODE=false" or use ...

  3. Delphi下OpenGL2d绘图(01)-初始化

    一.前言: Delphi默认支持OpenGl,可以uses OpenGL单元进行引用,便可以使用OpenGL的函数.OpenGl是跨平台的,而且Windows很早就支持并集成在系统中,存在于syste ...

  4. [转]让ASP.NET Web API支持$format参数的方法

    本文转自:http://www.cnblogs.com/liuzhendong/p/4228592.html 在不使用OData的情况下,也可以让ASP.NET Web API支持$format参数, ...

  5. Swift构造器链

    IDE:Xcode Version7.3.1 指定构造器: 1>名字为init的方法前没有前缀(子类重写时有override除外), 2>一个类中至少有一个指定构造器,其必须初始化类中的所 ...

  6. 使用Having子句

    Having 子句与where子句的功能类似,都是对行进行筛选.但是,where搜索条件是在分组操作之前对记录进行筛选,然后再由group BY 对筛选后符合条件的行进行分组:而Having搜索条件则 ...

  7. Java复习第二天

    Day04 1.switch语句的格式?针对格式的解释?以及注意事项? (1)格式: switch(表达式) { case 值1: 语句体1; break; case 值2: 语句体2; break; ...

  8. C#基础 (一)

    值类型和引用类型 堆和栈 栈存放的数据: (1)某些类型变量的值(2)程序当前的执行环境(3)传递给方法的参数 堆是存放对象的地方 对象类型有两种: 值类型和引用类型,他们的存储方式不同值类型: 只需 ...

  9. 第1天:jQuery效果

    1.jQuery 语法 jQuery 语法是为 HTML 元素的选取编制的,可以对元素执行某些操作. 基础语法是:$(selector).action() 美元符号定义 jQuery 选择符(sele ...

  10. js密码强度校验

    function AuthPasswd(string) { if(!string){ jQuery("#low").removeClass("org"); }) ...