线上问题排查常用命令

通过sar -q -f /var/log/sa/sa16 命令来查看某天的机器load记录

netstat -n |grep ':80 ' -c 来查看当前HTTP请求数,数量大概在300,属于正常范围。

netstat -n |grep ':8009 ' -c 来查看JBoss正在处理Http请求进程,数量大概在20,也属于正常范围。

分析JBoss正在干什么

通过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分析镜像文件拿到内存溢出报告

猜你喜欢

转载自hill007299.iteye.com/blog/1723994