jmap内存分析
查找对象数,内存占用 -histo
在遇到jvm内存泄漏问题(java heap space),如果需要借助工具分析内存,可以使用jmap。
测试代码:
public class HeapStats {
public static void main(String[] args) {
List<TestCase> cases = new ArrayList<TestCase>();
while(true){
cases.add(new TestCase());
}
}
}
class TestCase {
private List<String> li;
}
查找java进程号pid
tasklist /SVC|findstr java
java.exe 31516 暂缺
java.exe 20148 暂缺
java.exe 31748 暂缺
jmap -histo 31748 > histro1.txt
num #instances #bytes class name
----------------------------------------------
1: 74080662 1185290592 demo.test.TestCase
2: 492 347853264 [Ljava.lang.Object;
3: 6333 867320 <methodKlass>
4: 6333 802360 <constMethodKlass>
5: 10313 602688 <symbolKlass>
6: 447 508280 <constantPoolKlass>
7: 2820 412120 [C
8: 416 352896 <constantPoolCacheKlass>
9: 447 324776 <instanceKlassKlass>
10: 560 109184 [B
11: 2842 90944 java.lang.String
12: 531 55224 java.lang.Class
13: 680 45072 [S
14: 690 42840 [[I
15: 55 32120 <objArrayKlassKlass>
在实际生产环境,会复杂很多,可以每隔一段时间用jmap产生一个dump文件,然后进行对比,如果某个对象占用的空间过大,就需要仔细分析了。
产生dump文件线下分析 -dump
jmap -dump:live,format=b,file=output.hprof pid
使用jhat可以查看
jhat output.hprof
之后可以使用浏览器在页面观察dump情况。
遇到问题
- 当执行时遇到 拒绝访问,需要以管理员打开cmd,然后执行命令。