概述
某天系统响应变慢需要分析原因,也许我们马上会想起java core分析三板斧,top、pid等等定位到线程使用jstack命令输出线程堆栈。那么如果是内存回收不掉的情况呢?也许你的系统已配置-XX HeapDumOnMemoryError,
-XX HeapDumpPath=XXX,但是一旦如果你没设置而且系统并没内存溢出,只是响应慢,回收不理想呢?这时候用什么命令呢?当然这个可以现查现用,但如果是在面试呢?也许你知道但是不记得了,但这个简单问题很可能直接会让面试官认为你没做过或者不知道,所以简单整理一下。
总结
一、jmap命令解析与使用
jmap -heap [pid] 查询内存使用情况
[root@fengniaoweb ~]# jmap -heap 2865
Attaching to process ID 2865, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.211-b12
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 268435456 (256.0MB)
NewSize = 42991616 (41.0MB)
MaxNewSize = 89128960 (85.0MB)
OldSize = 87031808 (83.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 88080384 (84.0MB)
used = 86317448 (82.31873321533203MB)
free = 1762936 (1.6812667846679688MB)
97.99849192301433% used
From Space:
capacity = 524288 (0.5MB)
used = 32768 (0.03125MB)
free = 491520 (0.46875MB)
6.25% used
To Space:
capacity = 524288 (0.5MB)
used = 0 (0.0MB)
free = 524288 (0.5MB)
0.0% used
PS Old Generation
capacity = 179306496 (171.0MB)
used = 74843440 (71.37626647949219MB)
free = 104463056 (99.62373352050781MB)
41.74050671315332% used
26363 interned Strings occupying 3142776 bytes.
要注意的是在使用CMS GC 情况下,jmap -heap的执行有可能会导致JAVA 进程挂起
jmap -histo [pid] 查看JVM堆中对象详细占用情况
// 限于篇幅仅粘贴示例
3007: 1 16 [Lorg.aspectj.weaver.ast.Var;
3008: 1 16 [Lorg.aspectj.weaver.patterns.AnnotationTypePattern;
3009: 1 16 [Lorg.aspectj.weaver.patterns.BindingPatte