jmap
打印出pid的内存所有对象的使用情况(产生了哪些对象和数量),可以把内容输出到.bin文件,用MAT分析
参数
参数 | 解释 |
---|---|
-dump:[live,]format=b,file=\ | 以二进制输出heap内容到文件,live:只输出活的对象 |
-finalizerinfo | 正在等待回收的对象 |
-heap | 打印heap概要信息 |
-histo[:live] | 打印每个class的实例数,内存占用,全限定名,内部类有*,live:活的对象 |
-permstat | 打印classload和jvm永久代,内部String的数量和占用内存数也会被打印出来 |
-F | 强迫线程没有响应的情况下打印,live失效 |
示例
jmap -dump:format=b,file=test.bin pid
和eclipse memory analysis tool(MAT)配合使用
1,模拟一个内存泄漏
2,使jmap命令
3,打开MAT -> File -> Open Heap Dump 进行Leak 内存泄漏分析
(当dump文件比较大的时候需要设置MAT目录下的ini文件 -Xmx默认内存调大)
可疑的大对象饼图,其中可以看到有一个对象占用了1.5G内存,进入下面的details:
看到大量的String对象导致了内存泄漏
jstack
打印出pid的ID或者Core文件或者远程调试服务的java堆栈信息。如果java程序崩溃生成core文件,jstack可以获得core文件的java stack和core stack信息,知道java是如何崩溃和在哪里崩溃的,jstack可以查看正在运行的程序的stack,在程序处于hung状态很有用。
参数
参数 | 解释 |
---|---|
-l | 打印关于锁的附加信息 |
-m | 打印java和native c++的栈信息 |
jstat
监控jvm,对堆的情况实时监控,包括:
- 类的加载和写在情况
- 查看young,old,perm的容量和使用情况
- 查看young,old,perm的垃圾收集情况
- 查看新生代中Eden和survior的容量分配
重要参数
参数 | 解释 |
---|---|
class | 类加载 |
compiler | 即时编译器情况 |
gc | 垃圾收集情况 |
gccause | 垃圾收集的原因和情况 |
gcutil | 垃圾收集情况 |
示例:
#获取20次 每次隔2秒
jstat -gc pid 2000 20
#远程获取
jstat -gcutil 40496@remote.domain 1000
结果解释:
S0C | S1C | S0U | S1U | EC | EU | OC | OU | PC | PU | YGC | YGCT | FGC | FGCT | GCT |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Survior Capacity | Survior Used | Eden | Old | Perm | Young | YoungGCTime | FullGC |
jinfo
或者jvm的本身的信息
jinfo pid
jvisualvm
可视化分析工具,可以分析jmap dump出的文件