1 通过sar -q -f /var/log/sa/sa16 命令来查看某天的机器load记录
2 netstat -n |grep ':80 ' -c 来查看当前HTTP请求数,数量大概在300,属于正常范围。
3 netstat -n |grep ':8009 ' -c 来查看JBoss正在处理Http请求进程,数量大概在20,也属于正常范围。
通过kill -3 pid dump JBoss中的进程,来查看JBoss中正在跑的进程。
Heap PSYoungGen total 486272K, used 193722K [0x95a50000, 0xb4e50000, 0xb4e50000) eden space 460992K, 40% used [0x95a50000,0xa0ef2b38,0xb1c80000) from space 25280K, 34% used [0xb1c80000,0xb250bf28,0xb3530000) to space 24960K, 0% used [0xb35f0000,0xb35f0000,0xb4e50000) PSOldGen total 1060864K, used 865633K [0x54e50000, 0x95a50000, 0x95a50000) object space 1060864K, 81% used [0x54e50000,0x89ba8570,0x95a50000) PSPermGen total 98304K, used 72718K [0x44e50000, 0x4ae50000, 0x54e50000) object space 98304K, 73% used [0x44e50000,0x49553918,0x4ae50000)
发现PSOldGen,PSPermGen 使用不正常,可能是内存溢出。
常规手段搞不定,只好请出Jvm分析利器,首先先来看看内存里到底放了什么东西。通过命令: /opt/taobao/java/bin/jmap -histo PID 来查询内存中的对象数量:
num #instances #bytes class name ---------------------------------------------- 1: 11504468 184071488 java.lang.Integer 2: 1812475 165608576 [C 3: 515961 149531208 [B 4: 338909 88256392 [Ljava.lang.Object; 5: 2061748 49481952 java.lang.String
很显然 java.lang.Integer 数量是异常,赶紧dump整块内存下来分析到哪个类耗费这么多java.lang.Integer。
/opt/taobao/java/bin/jmap -dump:format=b,file=jvm.core PID dump内存镜像。
通过Memory Analysis分析镜像文件拿到内存溢出报告。