Java内存分析方法
常用的java进程内存分析工具有
1、JDK自带的 jvisualvm.exe(查看内存、线程、GC等情况)
2、JDK自带的 jconsole命令(查看内存、线程、CPU等曲线图)
3、jprofiler(收费,分析 hprof 文件很好用)
4、https://heaphero.io/heap-index.jsp (在线分析网站,分析 hprof 文件很好用,可查看大对象,内存泄漏等情况)
5、阿里巴巴开源的 arthas 工具(命令交互,查看内存、方法参数和返回值以及异常等),命令help可查看用法
除了以上几款工具,还可以使用jvm自带的命令如 jmap、jstack等,编写成一个脚本定时执行
每隔一段时间 dump内存快照, 打印jvm内存使用率,线程栈,对象大小等信息,脚本如下(java-analyse.bat 、java-analyse.sh)
java-analyse.bat(Windows)
1 :: author@old-pub 2022-07-25 2 :: Java进程内存分析脚本 3 ::========================== 4 chcp 65001 5 @title java-analyse 6 @echo off 7 setlocal enabledelayedexpansion 8 9 set /p pid=请输入JAVA进程号(PID): 10 set /p interval=请输入分析间隔时间,建议300(单位:秒): 11 set /a var=0 12 set dir=java-analyse-pid%pid% 13 md %dir% 14 15 echo. 16 echo =============================================================================== 17 echo 正在持续分析中,分析结果请查看目录 [java-analyse-pid] 18 echo =============================================================================== 19 echo. 20 21 :start 22 23 set /a var = %var% + 1 24 jstack %pid%>>%dir%\jstack-%var%.txt 25 jmap -heap %pid%>>%dir%\heap-%var%.txt 26 jmap -histo %pid%>>%dir%\histo-%var%.txt 27 jmap -dump:format=b,live,file=%dir%\dump-%var%.hprof %pid% 28 29 timeout /T %interval% /NOBREAK 30 31 goto start 32 33 pause
java-analyse.sh(Linux)
1 # author@old-pub 2022-07-25 2 # Java进程内存分析脚本 3 #========================== 4 5 read -p "请输入JAVA进程号(PID):" pid 6 read -p "请输入分析间隔时间,建议300(单位:秒):" interval 7 8 dir=java-analyse-pid$pid 9 mkdir -p $dir 10 11 echo =============================================================================== 12 echo 正在持续分析中,分析结果请查看目录 [java-analyse-pid] 13 echo =============================================================================== 14 15 var=0 16 start() 17 { 18 ((var++)) 19 jstack $pid>$dir/jstack-$var.txt 20 jmap -heap $pid>$dir/heap-$var.txt 21 jmap -histo $pid>$dir/histo-$var.txt 22 jmap -dump:format=b,live,file=$dir/dump-$var.hprof $pid 23 24 #等待一段时间重复执行 25 sleep $interval 26 start 27 } 28 29 start