jvm调优-内存泄漏导致cpu飙升

jvm调优-内存泄漏导致cpu飙升

    • 运行一个样例代码
    • 问题现象
    • 定位步骤
    • 离线分析方法
    • 第三方工具arthas
    • dashboard命令查看arthas的相关内存信息
    • jad反编译线上类

运行一个样例代码

java -Xms200M -Xmx200M -XX:+PrintGC com.xxx.xxx

jvm调优-内存泄漏导致cpu飙升_第1张图片

问题现象

通过gc日志和top命令可看到,程序在频繁ygc,并且每次回收的内存越来越少;cpu和系统内存也在逐步上升。
jvm调优-内存泄漏导致cpu飙升_第2张图片

定位步骤

1.使用top或者jps命令查看服务器运行java进程状况,找到pid
2.使用jinfo pid查看该进程运行的参数信息
jvm调优-内存泄漏导致cpu飙升_第3张图片
3.使用jstat -gc pid 500命令,每500ms打印一次pid进程的内存使用情况
jvm调优-内存泄漏导致cpu飙升_第4张图片

2.使用top -Hp 2043 查看2043进程里面的线程信息,也可以使用jdk自带的命令jstack 2043|more查看。
jvm调优-内存泄漏导致cpu飙升_第5张图片
jvm调优-内存泄漏导致cpu飙升_第6张图片
3.使用jmap -histo pid|head -20 命令查看堆内对象占用内存情况
jvm调优-内存泄漏导致cpu飙升_第7张图片
在这里可以看到cardInfo对象一直在生成,且不能被回收,接下来在代码中查找哪里使用了cardInfo对象。

离线分析方法

1.使用jmap -dump:format=b,file=xxx.hprof pid命令导出二进制堆栈文件,该命令不建议在生产环境使用,因为该命令会造成堆暂停生成快照,影响业务进行,可以使用参数-XX:+HeapDumpOnOutOfMemoryError参数进行线上oom参数打印
jvm调优-内存泄漏导致cpu飙升_第8张图片
2.使用图形化工具分析导出的堆栈文件,例如MAT,jvisualvm,推荐jvisualvm,在自带的jdk路径下

第三方工具arthas

在阿里官网搜索该工具,下载下来后,linux环境使用./as.sh启动,或者使用java -jar arthas-boot.jar进行启动
jvm调优-内存泄漏导致cpu飙升_第9张图片
里面的[1]:2359是环境上的java进程,直接敲1回车,进行监测

dashboard命令查看arthas的相关内存信息

jvm调优-内存泄漏导致cpu飙升_第10张图片

jad反编译线上类

挂上arthas之后,jad 类名,直接反编译出来该类内容

你可能感兴趣的:(java,jvm,java,linux)