JVM调优流程梳理
本文不适合于JVM调优小白,小白可能看的比较迷糊,且本文提供的仅仅是调优的思路,是我本人在公司调优时使用的心得体会,跟着思路走,百分百调优成功
1,查看程序 cpu 使用情况(目的:查看cpu占用较高的资源)`
//查看所有进程 cpu使用情况
top
//查看java项目进程号 pid
jps -l
//查看指定程序cpu使用情况
top -Hp pid
2,查程序老年代内存使用和FullGC次数(目的:看垃圾回收频率)
//查看 O:老年代内存; M:元数据内存; YGC:youngGC次数; FGC:FullGC次数; 使用情况
jstat -gccasue <pid> <time> <count>
//例:pid为11309的项目每500ms一次,显示30次
jstat -gccause 11309 500 30
3,若FullGC次数过高,检查程序异常(排查回收次数较高的原因)
//查看是否可能出现的死循环与死锁
jstack <pid>
4,借助工具查看内存和 FullGC 使用(此处为第三方工具)
jconsole
或
jvisualvm
5,获取JVM的dump文件的两种方式(快照文件内容输出排查)
- 方法一:检查是否产生 .hprof 文件
//JVM启动时增加参数配置
#出现 OOME 时生成堆 dump:
-XX:+HeapDumpOnOutOfMemoryError
#生成堆文件地址:
-XX:HeapDumpPath=/home/java/jvmlogs/
- 方法二(常用的手动导出方法,不推荐):发现程序异常前通过执行指令,直接生成当前JVM的dump文件,11309:进程号
jmap -dump:file=文件名.dump [pid]
//示例
jmap -dump:format=b,file=serviceDump.dat 11309
由于第一种方式是一种事后方式,需要等待当前JVM出现问题后才能生成dmp文件,实时性不高,第二种方式在执行时,JVM是暂停服务的,所以对线上的运行会产生影响。所以建议方法一。
-
分析内存泄漏快照 dump文件
使用MAT工具分析:Memory Analyzer Tool
-
定位代码位置,若程序代码无异常则进行优化、进行JVM 调优
调优前提:- 文件:限制文件大小,异步方式
- 网络IO:限流
- 大对象:对JVM绝对是一个噩梦,大对象直接进入老年代
- 避免使用大对象
- 尽量减少大对象的生存时间
调优(此处需要耐心,多次调试,充分利用内存资源)
调优:(过程较为漫长,多次调试,充分利用内存资源,目的尽量减少 FullGC 的次数)
-server
-XX:Xmn500m
-XX:Xms1500m
-XX:Xmx1500m
-XX:PermSize=256m
-XX:MaxPermSize=256m
-XX:SurvivorRatio=1
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSCompactAtFullCollection
-XX:+CMSFullGCsBeforeCompaction=5
-XX:+HeapDumpOnOutOfMemoryError
-XX:+DisableExplicitGC
-Xloggc:/home/java/project_one/gc.log
- 参数详解
-server -- Server_jvm的初始空间会大一些,默认使用的是并行垃圾回收器,启动慢,运行快(64位操作系统只有 -Server)
-XX:Xmn500m -- 年轻代的空间大小,剩下的是年老代的空间。(
-XX:Xms1500m -- 堆内存最小空间大小。(新生代,老年代)
-XX:Xmx1500m -- 堆内存最大空间大小(新生代,老年代)
-XX:PermSize=256m -- 元数据最小空间大小(jdk1.7)
-XX:MaxPermSize=256m -- 元数据最大空间大小(jdk1.7)
-XX:SurvivorRatio=1 -- 年轻代空间中2个Survivor空间与Eden空间的大小比例。(此处为1:1:1)
-XX:+UseConcMarkSweepGC -- 使用CMS垃圾收集器(CMS)
-XX:CMSInitiatingOccupancyFraction=70 -- 设置CMS空间大小为70%(默认为68%)
-XX:+UseCMSCompactAtFullCollection -- 使用CMS产生大量内存碎片 设置GC每执行完一次,进行一次整理()
-XX:+CMSFullGCsBeforeCompaction=5 -- FullGC每执行5次,进行一次集中整理()
-XX:+HeapDumpOnOutOfMemoryError -- 出现内存泄漏时,生成dump文件快照 文件名以 .hprof 结尾
-XX:+DisableExplicitGC -- 禁止显示的调用 System.gc() 方法
-Xloggc:/home/java/project_one/gc.log -- 设置gc日志打印位置和文件名(
当长大以后,多希望自己还只是个孩子,给颗糖就笑,摔倒了就哭。不用伪装到面目全非,不用压抑自己的心情。