java 内存泄漏排查思路
一、jps
jps -l 查看运行进程pid
root:/data/java# jps -l 1 bxkc-wechat.jar 26799 sun.tools.jps.Jps
jps -lv jps -lv | grep pid 常用的参数: -q:只显示pid,不显示class名称,jar文件名和传递给main 方法的参数 -m:输出传递给main 方法的参数,在嵌入式jvm上可能是null -l:输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名 -v: 输出传递给JVM的参数
二、jinfo
jinfo -flags pid
root:/data/java# jinfo -flags 1 Attaching to process ID 1, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.345-b01 Non-default VM flags: -XX:CICompilerCount=2 -XX:CompressedClassSpaceSize=260046848 -XX:InitialHeapSize=3221225472 -XX:MaxHeapSize=5368709120 -XX:MaxMetaspaceSize=268435456 -XX:MaxNewSize=1789394944 -XX:MetaspaceSize=268435456 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=1073741824 -XX:OldSize=2147483648 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseAdaptiveSizePolicy -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC Command line: -Xms3g -Xmx5g -XX:+PrintGCDateStamps -XX:+UseAdaptiveSizePolicy -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Xloggc:/data/logs/wechat/gc-%t.log
三、jmap
查看年轻区年老区占用内存 jmap heap pid
Concurrent Mark-Sweep GC :CMS回收器 Mark Sweep Compact GC: 串行GC(Serial GC) Parallel GC with 2 thread(s): 并行GC(ParNew
导出dmp文件 jmap -dump:format=b,file=/data/logs/wechat/jvm.dmp 1
四、top
top -p pid
top -Hp pid
五、jstat
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下: jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]
jstat 是JDK中提供的一个命令行工具,主要用来打印JVM 性能数据相关的统计数据,主要包含以下几个方面: 垃圾回收(GC)方面数据 编译(Compilation)相关数据 类加载信息(Class Loader) jstat -gc -t pid 10000 10 参数解释:
-gc :打印相关的统计参数 -t: 在每行日志之前加上JVM的启动时间 11256 : 目标Java进程的ID 10000: jstat命令执行间隔时间(milliseconds),10000表示每10s打印一行日志 10: jstat命令的执行次数,(和上面的时间间隔一起,表示jstat会每10s执行1次,总共执行10次).
命令输出详解
time : JVM启动时间(单位为秒) S0C :年轻代中S0区的容量 (字节) S1C :年轻代中S1区的容量 (字节) S0U :年轻代中S0区目前已使用空间 (字节) S1U :年轻代中S1区目前已使用空间 (字节) EC :年轻代中Eden区的容量 (字节) EU :年轻代中Eden区目前已使用空间 (字节) OC :老年代的容量 (字节) OU :老年代目前已使用空间 (字节) YGC :从应用程序启动到采样时年轻代中GC次数 YGCT :从应用程序启动到采样时年轻代中GC所用时间(s) FGC :从应用程序启动到采样时老年代(全GC)GC次数 FGCT :从应用程序启动到采样时老年代(全GC)GC所用时间(s) GCT:从应用程序启动到采样时GC用的总时间(s)
jstat -class pid
D:ccctcode>jstat -class 10152 Loaded Bytes Unloaded Bytes Time 3544 6656.2 0 0.0 1.37
说明:
-
Loaded:加载class的数量 Bytes:所占用空间大小 Unloaded:未加载数量 Bytes:未加载占用空间 Time:时间
线程数 jstack pid |grep tid|wc -l
六、free
查看内存、缓存区、使用和闲置 free -h
七、cat
内存使用情况 cat /proc/pid/status
八、df
查看磁盘情况 df -h
文件目录占用资源情况 du -h --max-depth=1
总结
JVM优化的目标就是:尽可能让对象都在新生代里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小,避免新生代频繁的进行垃圾回收