最近项目里面使用到了多线程,有时候多线程会存在挂掉的情况,趁机好好学习总结一下JVM调优的方法。
jstat使用:
#jstat -help|-options
#jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
Options — 选项,我们一般使用 -gcutil 查看gc情况
t,h — t是显示Timestamp时间间隔列,h是显示标题,-h3每三行显示标题
vmid — VM的进程号,即当前运行的java进程号
interval– 间隔时间,单位为秒或者毫秒
count — 打印次数,如果缺省则打印无数次
参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次。假设需要每1000毫秒查询一次进程2288垃圾收集状况,一共查询5次命令行如下:
#jstat -gc 2288 1000 5
如果是远程虚拟机:lvmid格式是: [protocol:][//] lvmid [@hostname[:port]/servername]
选项option代表这用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集和运行期编译状况,具体选项及作用如下:
class (类加载器): jstat -class pid:显示加载class的数量,及所占空间等信息。
compiler (JIT): jstat -compiler pid:显示VM实时编译的数量等信息。
gc (GC堆状态): jstat -gc pid:可以显示gc的信息,查看gc的次数及时间。其中最后五项分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
gccapacity (各区大小): jstat -gccapacity pid:可以显示VM内存中三代(young,old,perm)对象的使用和占用大小。如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。
gccause (最近一次GC统计和原因): jstat -gccause pid:最近一次GC的cause。
gcmetacapacity (元数据区的容量): jstat -gcmetacapacity pid:元数据空间统计
gcnew (新区统计): jstat -gcnew pid:new对象的信息。
gcnewcapacity (新区大小): jstat -gcnewcapacity pid:new对象的信息及其占用量。
gcold (老区统计): jstat -gcold pid:old对象的信息。
gcoldcapacity (老区大小): jstat -gcoldcapacity pid:old对象的信息及其占用量。
gcpermcapacity (永久区大小): jstat -gcpermcapacity pid: perm对象的信息及其占用量(1.8已移除).
gcutil (GC统计汇总): jstat -util pid:统计gc信息统计。
printcompilation (HotSpot编译统计): jstat -printcompilation pid:当前VM执行的信息。
在 JDK 1.7 及以往的 JDK 版本中,Java 类信息、常量池、静态变量都存储在 Perm(永久代)里。类的元数据和静态变量在类加载的时候分配到 Perm,当类被卸载的时候垃圾收集器从 Perm 处理掉类的元数据和静态变量。当然常量池的东西也会在 Perm 垃圾收集的时候进行处理。
JDK 1.8 的对 JVM 架构的改造将类元数据放到本地内存中,另外,将常量池和静态变量放到 Java 堆里。HotSopt VM 将会为类的元数据明确分配和释放本地内存。在这种架构下,类元信息就突破了原来 -XX:MaxPermSize 的限制,现在可以使用更多的本地内存。这样就从一定程度上解决了原来在运行时生成大量类的造成经常 Full GC 问题,如运行时使用反射、代理等。
参数详解:
jstat -gc 2244 1000 5
各列意义:
S0C:年轻代中第一个存活区的大小
S1C:年轻代中第二个存活区的大小
S0U:年轻代中第一个存活区已使用的空间 (KB)
S1U:年轻代中第二个存活区已使用的空间 (KB)
EC: Edem区大小
EU: 年轻代中Edem区已使用的空间 (KB)
OC: 老年代大小
OU: 老年代已使用的空间 (KB)
PC: 持久代大小
PU: 持久代已使用的空间 (KB)
YGC: 从应用程序启动到采样时young gc的次数
YGCT: 从应用程序启动到采样时young gc的所用的时间(s)
FGC: 从应用程序启动到采样时full gc的次数
FGCT: 从应用程序启动到采样时full gc的所用的时间
GCT: 从应用程序启动到采样时整个gc所用的时间
如果young gc所用的时间比较长,如超过几秒,则young gc不正常。
jstat -gcutil 2244 1000 5
各列意义:
S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
E — Heap上的 Eden space 区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
GCT 是YGCT 和FGCT的时间总和。
jstat -class 2244
各列意义:
Loaded 装载的类的数量
Bytes 装载类所占用的字节数
Unloaded 卸载类的数量
Bytes 卸载类的字节数
Time 装载和卸载类所花费的时间
jstat -compiler 2244
各列意义:
Compiled 编译任务执行数量
Failed 编译任务执行失败数量
Invalid 编译任务执行失效数量
Time 编译任务消耗时间
FailedType 最后一个编译失败任务的类型
FailedMethod 最后一个编译失败任务所在的类及方法
jstat -gccapacity 2244
各列意义:
NGCMN 年轻代(young)中初始化(最小)的大小(KB)
NGCMX 年轻代(young)的最大容量 (KB)
NGC 年轻代(young)中当前的容量 (KB)
S0C 年轻代中第一个survivor(幸存区)的容量 (KB)
S1C 年轻代中第二个survivor(幸存区)的容量 (KB)
EC 年轻代中Eden(伊甸园)的容量 (KB)
OGCMN old代中初始化(最小)的大小 (KB)
OGCMX old代的最大容量(KB)
OGC old代当前新生成的容量 (KB)
OC Old代的容量 (KB)
PGCMN perm代中初始化(最小)的大小 (KB)
PGCMX perm代的最大容量 (KB)
PGC perm代当前新生成的容量 (KB)
PC Perm(持久代)的容量 (KB)
YGC 从应用程序启动到采样时年轻代中gc次数
FGC 从应用程序启动到采样时old代(全gc)gc次数
jstat -gcnew 2244
各列意义:
S0C 年轻代中第一个survivor(幸存区)的容量 (KB)
S1C 年轻代中第二个survivor(幸存区)的容量 (KB)
S0U 年轻代中第一个survivor(幸存区)目前已使用空间 (KB)
S1U 年轻代中第二个survivor(幸存区)目前已使用空间 (KB)
TT 持有次数限制 MTT 最大持有次数限制
EC 年轻代中Eden(伊甸园)的容量 (KB)
EU 年轻代中Eden(伊甸园)目前已使用空间 (KB)
YGC 从应用程序启动到采样时年轻代中gc次数
YGCT 从应用程序启动到采样时年轻代中gc所用时间(s)
jstat -gcnewcapacity 2244
各列意义:
NGCMN 年轻代(young)中初始化(最小)的大小(KB)
NGCMX 年轻代(young)的最大容量 (KB)
NGC 年轻代(young)中当前的容量 (KB)
S0CMX 年轻代中第一个survivor(幸存区)的最大容量 (KB)
S0C 年轻代中第一个survivor(幸存区)的容量 (KB)
S1CMX 年轻代中第二个survivor(幸存区)的最大容量 (KB)
S1C 年轻代中第二个survivor(幸存区)的容量 (KB)
ECMX 年轻代中Eden(伊甸园)的最大容量 (KB)
EC 年轻代中Eden(伊甸园)的容量 (KB)
YGC 从应用程序启动到采样时年轻代中gc次数
FGC 从应用程序启动到采样时old代(全gc)gc次数
jstat -gcold 2244
各列意义:
PC Perm(持久代)的容量 (KB)
PU Perm(持久代)目前已使用空间 (KB)
OC Old代的容量 (KB)
OU Old代目前已使用空间 (KB)
YGC 从应用程序启动到采样时年轻代中gc次数
FGC 从应用程序启动到采样时old代(全gc)gc次数
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT从应用程序启动到采样时gc用的总时间(s)
jstat -gcoldcapacity 2244
各列意义:
OGCMN old代中初始化(最小)的大小 (KB)
OGCMX old代的最大容量(KB)
OGC old代当前新生成的容量 (KB)
OC Old代的容量 (KB)
YGC 从应用程序启动到采样时年轻代中gc次数
FGC 从应用程序启动到采样时old代(全gc)gc次数
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT 从应用程序启动到采样时gc用的总时间(s)
jstat -gcmetacapacity 2244
各列意义:
MCMN 元数据初始化(最小)的大小 (KB)
MCMX 元数据初始化(最大)的大小 (KB)
MC 元数据使用大小 (KB)
CCSMN 元数据
CCSMX 元数据
CCSC 元数据
YGC 从应用程序启动到采样时年轻代中gc次数
FGC 从应用程序启动到采样时old代(全gc)gc次数
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT 从应用程序启动到采样时gc用的总时间(s)
jstat -printcompilation 2244
各列意义:
Compiled 编译任务的数目
Size 方法生成的字节码的大小
Type 编译类型
Method 类名和方法名用来标识编译的方法。