从线上找了台机器分析下JVM各维度的运行情况,看能否所有优化。

内存维度

使用jmap查看堆内存使用情况。

jmap -heap <pid>

从上面的信息可以看出,GC方式为CMS+ParNew,同时支持TLAB,堆配置方面,Xmx为512M,其中新生代为166MB,老年代为346MB。比例大概为3:7。

非堆内存方面,存储常量的MetaspaceSize占256.0MB,CompressedClassSpaceSize 压缩指针最多占1GB左右。

继续使用ps aux查看进程内存占用:

USERPID%CPU%MEMVSZ(KB)RSS(KB)TTYSTATSTARTTIMECOMMAND
root61080.9123484536967940?Sl8月22401:04java

可以看出实际占用内存大约在1GB左右(一般我们看RSS占用)。

GC维度

jstat查看gc情况

jstat -gc <pid>

S0CS1CS0US1UECEUOCOUMCMUCCSCCCSUYGCYGCTFGCFGCTGCT
17024.017024.01326.90.0136320.039525.0353920.0167901.5155520.0145749.419328.017633.612458152.45260.573153.025

jinfo -gc 各详细参数说明如下:

  • S0C :第一个Survior的大小,S0 Capacity
  • S1C:第二个Survior的大小
  • S0U:第一个Survior已经使用的大小
  • S1U:第二个Survior已经使用的大小
  • EC : eden区的大小
  • EU: eden区已经使用的大小
  • OC:老年代的大小
  • OU:老年代使用的大小
  • MC:元空间大小
  • MU:元空间已经使用的大小
  • CCSC:压缩类空间大小
  • CCSU:压缩类空间使用大小
  • YGC:YGC次数
  • TGCT:YGC垃圾回收消耗的时间
  • FGC:Full GC回收次数
  • FGCT:Ful GC回收消耗的时间
  • GCT:GC总耗时

以上存储单位为kb,时间单位为s。

从上面信息看出,Survior大约使用了1MB,Eden使用了大约39MB,Old Gen使用了大约167MB,Metaspace 使用了大约145MB。

GC维度上,FullGC触发6次,总耗时0.573s,YGC触发12458次,耗时152s。

线程维度

jstack -l 查看当前线程运行状态。

可以用于查看是否存在死锁问题。

VM配置维度

jinfo pid 查看配置

发表评论

邮箱地址不会被公开。 必填项已用*标注