1 jstat命令
JVM内存不够用、内存溢出可以通过监控JVM Heap信息来分析
1.1 jstat -gcutil
FGC26次,用时871ms,平均33.5ms一次,Full GC会暂停用户响应,也就是不处理用户请求,等待full gc完成后响应用户的请求,这个等待时间过大就会影响用户体验,所以Full gc是JVM调优的重点。
如何判定Full gc多长时间一次是否合理呢?
[root@bg2 ~]# jstat -gcutil 9477
# S0:年青代中第一个survivor(幸存区)已使用的占当前容量百分比
# S1:年青代中第二个survivor(幸存区)已使用的占当前容量百分比
# E:年青代中Eden已使用的占当前容量占比
# O:old代已使用的占当前容量占比
# P:perm代已使用的占当前容量占比
# YGC:JVM启动到采用时年青代中的gc次数
# YGCT:JVM启动到采用时年青代中gc使用时间s
# FGC:JVM启动到采用时old代(全gc)gc次数
# FGCT:JVM启动到采用时old代(全gc)gc所用的时间s
# GCT:JVM启动到采用时gc用的总时间(s)
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 15.43 69.39 60.59 97.92 94.60 59507 266.120 26 0.871 266.990
1.2 jstat -gccapacity
有些跟上面的一样,这里直接附照片
[root@bg2 ~]# jstat -gccapacity 9477
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
131072.0 131072.0 131072.0 13056.0 13056.0 104960.0 917504.0 917504.0 917504.0 917504.0 0.0 1120256.0 79876.0 0.0 1048576.0 8548.0 59537 26
2 jps命令
使用jps命令可以查看java的进程。jps可以列举出远程的java进程信息,需要安全授权。
在%JAVA_HOME%/bin存储的jstatd.all.policy
,内容如下:
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
}
然后再远程机器上启动命令进行注册
jstatd -J-Djava.security.policy=jstatd.all.policy
否则会提示
[root@bg3 ~]# jps 10.128.2.185
RMI Registry not available at 10.128.2.185:1099
Connection refused to host: 10.128.2.185; nested exception is:
java.net.ConnectException: Connection refused (Connection refused)
3 jmap
分析程序内存占用实际上是分析堆Heap内存,堆快照使用jmap获取,典型获取方式,heap.hprof 采用Jvisualvm来查看,这个JDK自带。
jmap -dump:format=b,file:\tmp\heap.hprof [pid]
4 jvisualvm