1,内存高
思路:jmap -heap 27403,查看进程堆概要信息
(1)把内存镜像导出,使用命令,如 jmap -dump:format=b,file=<导出目录+文件名> <进程号> ,如 jmap -dump:format=b,file=27403.dump 27403
(2)使用内存分析工具,下载地址,http://www.eclipse.org/mat/
(3)具体分析方法,如下:
打开软件后,File-->Open Heap Dump...,打开刚才导出的镜像文件,选择Leak Suspects Report,Finish,进入分析页面
Histogram:列表展示出内存中的对象数目和占用内存大小
Dominator Tree:列表展示出程序中每个线程中的对象数目和占用内存大小
Top Consumers:图表展示出每个线程的对象数目和占用内存大小
Top Components:图表展示出内存中的对象数目和占用内存大小
Leak Suspects:这个是最常用的,会自动检测分析内存异常的原因
右键对象-->show objects by class可以查看对象的具体情况
by incomming reference:显示引用该对象/线程的其他对象
by outgoing reference:显示当前对象/线程引用的其他对象
点击Leak Suspects,程序会分析出可能存在内存问题的地方,继续点击Detail可以看到具体有哪些对象和线程,接下来就要根据具体情况具体分析了
2,CPU高
思路:
(1)查看进程对应的线程情况,命令如 top -H -p PID ,找到问题线程,记录线程号;
(2)使用科学计算器,将十进制的线程号转成十六进制,比如493620-->78834;
(3)拿到了可能出问题的进程号和线程号,接下来使用jvm内置的命令来导出Java的堆栈信息,命令如 jstack -l <进程号> > <导出目录+文件名> ;
(4)打开导出的堆栈信息,并全文搜索刚刚拿到的十六进制的线程号,就可以找到出问题的代码具体位置了;
3,GC情况查看
(1)命令说明
命令格式:jstat [Options] vmid [interval] [count], 如 jstat -gc 30996 3000 或使用命令:jstat -gcutil 30996 3000
即:每3秒一次显示进程号为30996的java进程的GC情况;
(2)结果说明
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC:Old代的容量 (字节)
OU:Old代目前已使用空间 (字节)
PC:Perm(持久代)的容量 (字节)
PU:Perm(持久代)目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
NGCMN:年轻代(young)中初始化(最小)的大小 (字节)
NGCMX:年轻代(young)的最大容量 (字节)
NGC:年轻代(young)中当前的容量 (字节)
OGCMN:old代中初始化(最小)的大小 (字节)
OGCMX:old代的最大容量 (字节)
OGC:old代当前新生成的容量 (字节)
PGCMN:perm代中初始化(最小)的大小 (字节)
PGCMX:perm代的最大容量 (字节)
PGC:perm代当前新生成的容量 (字节)
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)
S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)
ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)
TT: 持有次数限制
MTT : 最大持有次数限制