jvm调优-内存泄漏导致cpu飙升
jvm调优-内存泄漏导致cpu飙升
- 运行一个样例代码
- 问题现象
- 定位步骤
- 离线分析方法
- 第三方工具arthas
- dashboard命令查看arthas的相关内存信息
- jad反编译线上类
运行一个样例代码
java -Xms200M -Xmx200M -XX:+PrintGC com.xxx.xxx
问题现象
通过gc日志和top命令可看到,程序在频繁ygc,并且每次回收的内存越来越少;cpu和系统内存也在逐步上升。
定位步骤
1.使用top或者jps命令查看服务器运行java进程状况,找到pid
2.使用jinfo pid查看该进程运行的参数信息
3.使用jstat -gc pid 500命令,每500ms打印一次pid进程的内存使用情况
2.使用top -Hp 2043 查看2043进程里面的线程信息,也可以使用jdk自带的命令jstack 2043|more查看。
3.使用jmap -histo pid|head -20 命令查看堆内对象占用内存情况
在这里可以看到cardInfo对象一直在生成,且不能被回收,接下来在代码中查找哪里使用了cardInfo对象。
离线分析方法
1.使用jmap -dump:format=b,file=xxx.hprof pid命令导出二进制堆栈文件,该命令不建议在生产环境使用,因为该命令会造成堆暂停生成快照,影响业务进行,可以使用参数-XX:+HeapDumpOnOutOfMemoryError参数进行线上oom参数打印
2.使用图形化工具分析导出的堆栈文件,例如MAT,jvisualvm,推荐jvisualvm,在自带的jdk路径下
第三方工具arthas
在阿里官网搜索该工具,下载下来后,linux环境使用./as.sh启动,或者使用java -jar arthas-boot.jar进行启动
里面的[1]:2359是环境上的java进程,直接敲1回车,进行监测
dashboard命令查看arthas的相关内存信息
jad反编译线上类
挂上arthas之后,jad 类名,直接反编译出来该类内容