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)
java 内存泄漏排查思路_第1张图片
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:\ccct\code>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优化的目标就是:尽可能让对象都在新生代里分配和回收,尽量别让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小,避免新生代频繁的进行垃圾回收

jstat命令解析

visualvm使用介绍

内存高问题排查

jvm命令介绍

你可能感兴趣的:(java,java,jvm,开发语言)