在Java开发中,经常遇到CPU和内存占用率很高的情况,这个时候需要初步分析原因,先简单说一下经常使用的分析过程:
- 先说一下CPU过高 (如:java进程id为:30420)
- top -H -p 30420 命令得到 30420进程 占用CPU较高的线程id
- 再使用 printf "%x"n" 134126 把线程的id 转 16进制
- jstack 134066| grep 20bee 命令可以得到 线程的名称
2. 内存占用率高
- 利用JVM提供的jmap命令,把heap导出 jmap -dump:live,format=b,file=dump05171233.hprof 134066 使用jmap的命令把heap的内容 ,全部打出来
- 把生成的文件.hprof 下载到本地,进行分析,建议大家尽量不要在生产上面,使用上面的命令,该命令对性能有影响的,并且 会触发垃圾回收
- 下载前先使用gzip 命令压缩 一下hprof文件
- 使用MemoryAnalyzer.exe 工具进行分析
- 注意修改MemoryAnalyzer.ini 的-Xmx8000m 参数,因为hprof一般会比较大