hello云胜

技术与生活

0%

jvm命令

jps

打印当前服务器上的java进程

1
2
3
4
$ jps
10963 redis-1.0.0.jar
11326 Jps

jinfo

打印java进程的信息

1
2
3
4
5
6
7
$ jinfo -flags 10963
Attaching to process ID 10963, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.151-b12
Non-default VM flags: -XX:CICompilerCount=12 -XX:InitialHeapSize=1054867456 -XX:MaxHeapSize=16846422016 -XX:MaxNewSize=5615124480 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=351272960 -XX:OldSize=703594496 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
Command line:

可以看到jvm的配置信息。

我在启动这个jar时并没有指定Xms和Xmx。所以都是默认值。

我的服务器是64G内存,所以默认的Xms是1G,Xmx是16G。即服务器内存的1/64和1/4。

jstat

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量

注:本实例启动jvm时,没有指定任何JVM参数

class

输出类加载相关信息

1
2
3
$ jstat -class 19295
Loaded Bytes Unloaded Bytes Time
16603 31015.9 147 221.0 18.84

一共加载了16603个类,大小31K。卸载了147个类。装载和卸载总耗时18秒

gc命令

打印堆相关信息

1
2
3
$ jstat -gc 19295
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
5632.0 5632.0 4445.3 0.0 1688064.0 1456406.7 388608.0 154223.4 105876.0 100496.0 11964.0 11033.2 4114 27.677 9 5.965 33.642
  • **S0C:**S0区的大小 5632Kb,约5M
  • **S1C:**S1区的大小
  • **S0U:**S0区使用的大小
  • **S1U:**S1区使用的大小,s0和s1同一时间只会有一个在用
  • **EC:**伊甸园区的大小 1.6G,还挺大
  • **EU:**伊甸园区的使用大小
  • **OC:**老年代大小 约400M
  • **OU:**老年代使用大小
  • **MC:**方法区大小 约100M
  • **MU:**方法区使用大小
  • **CCSC:**压缩类空间大小
  • **CCSU:**压缩类空间使用大小
  • **YGC:**年轻代垃圾回收次数
  • **YGCT:**年轻代垃圾回收消耗时间
  • **FGC:**老年代垃圾回收次数
  • **FGCT:**老年代垃圾回收消耗时间
  • **GCT:**垃圾回收消耗总时间

jstat -gccapacity

显示各个代的对象大小

1
2
3
$ jstat -gccapacity 19295
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
106496.0 1699840.0 1699840.0 6144.0 6144.0 1687552.0 212992.0 3399680.0 388608.0 388608.0 0.0 1142784.0 105876.0 0.0 1048576.0 11964.0 4120 9
  • NGCMN:新生代中初始化大小 新生代=s0+s1+eden
  • NGCMX:新生代最大大小
  • NGC:当前新生代容量
  • OGCMN:老年代初始化大小
  • OGCMX:老年代最大大小。因为这个jvm启动时采用默认配置。老年代动态涨上来的。
  • MCMN:元空间相关
  • CCSMN: 压缩类相关

jstat -gcmetacapacity

看元空间中的内存信息

1
2
3
$ jstat -gcmetacapacity 19295
MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC FGCT GCT
0.0 1142784.0 105876.0 0.0 1048576.0 11964.0 4120 9 5.965 33.707

jstat -gcnew

新生代相关信息

1
2
3
$ jstat -gcnew 19295
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
6144.0 6144.0 3996.1 0.0 15 15 6144.0 1687552.0 1278569.1 4120 27.742

TT: Tenuring threshold。新生代的持有代数。默认是15。15代后的对象进入老年代。

DSS:Desired survivor size (kB)。期望的S区大小。

jstat -gcnewcapacity

1
2
3
$ jstat -gcnewcapacity 19295
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
106496.0 1699840.0 1699840.0 566272.0 6144.0 566272.0 6144.0 1698816.0 1687552.0 4121 9

jstat -gcold

1
2
3
$ jstat -gcold 19295
MC MU CCSC CCSU OC OU YGC FGC FGCT GCT
105876.0 100496.0 11964.0 11033.2 388608.0 154615.5 4121 9 5.965 33.718

jstat -gcoldcapacity

1
2
3
$ jstat -gcoldcapacity 19295
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
212992.0 3399680.0 388608.0 388608.0 4121 9 5.965 33.718

gcutil命令

1
2
3
$ jstat -gcutil 19295
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
93.02 0.00 65.43 39.71 94.92 92.22 4116 27.698 9 5.965 33.663

-gccause

1
2
3
$ jstat -gccause 19295
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
0.00 67.96 73.01 39.79 94.92 92.22 4121 27.753 9 5.965 33.718 Allocation Failure No GC

jstat -compiler

Just-in-Time(即时)编译器的信息

1
2
3
$ jstat -compiler 19295
Compiled Failed Invalid Time FailedType FailedMethod
25969 5 0 197.59 1 com/mysql/jdbc/AbandonedConnectionCleanupThread run

-printcompilation

1
2
3
$ jstat -printcompilation 19295
Compiled Size Type Method
25969 84 1 java/util/LinkedList toArray

Method:最近进行了JIT编译的方法

周期性输出

上面的命令都可以在后面加上周期操作:周期(单位是毫秒) 次数。

1
jstat -gc 19295 5000 10

就是每5秒循环一次,一共输出10次

jmap

主要用于打印指定Java进程堆内存的细节

-heap

打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和generation wise heap usage。

-histo[:live]

打印堆的柱状图。其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。如果指定了live子选项,则只计算活动的对象。

打印堆快照

1
jmap -dump:format=b,file=xxx pid

jhat

jhat来分析jmap生成的堆转储快照

1
jhat xxx堆转储文件

分析结果在7000端口开启一个web服务

浏览器访问:localhost:7000

不常用,功能相对来说比较简陋, 更多的是使用jvisualvm, 以及专业用于分析堆转储快照文件的Eclipse Memory Analyzer、 IBM HeapAnalyzer等工具

jvisualvm

一个界面工具,本地的java进程可以直接连上。远程的需要开启。

image-20210928101621514

image-20210928101722744

Memory Analyzer (MAT)

mat是eclipse出品的开源jvm堆转储文件分析工具。

image-20210928111923125