JVM调优之流程梳理

1 篇文章 0 订阅


本文不适合于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    -- 年轻代空间中2Survivor空间与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日志打印位置和文件名(

当长大以后,多希望自己还只是个孩子,给颗糖就笑,摔倒了就哭。不用伪装到面目全非,不用压抑自己的心情。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值