jvm命令
jps
打印当前服务器上的java进程
1 | $ jps |
jinfo
打印java进程的信息
1 | $ jinfo -flags 10963 |
可以看到jvm的配置信息。
我在启动这个jar时并没有指定Xms和Xmx。所以都是默认值。
我的服务器是64G内存,所以默认的Xms是1G,Xmx是16G。即服务器内存的1/64和1/4。
jstat
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量
注:本实例启动jvm时,没有指定任何JVM参数
class
输出类加载相关信息
1 | $ jstat -class 19295 |
一共加载了16603个类,大小31K。卸载了147个类。装载和卸载总耗时18秒
gc命令
打印堆相关信息
1 | $ jstat -gc 19295 |
- **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 | $ jstat -gccapacity 19295 |
- NGCMN:新生代中初始化大小 新生代=s0+s1+eden
- NGCMX:新生代最大大小
- NGC:当前新生代容量
- OGCMN:老年代初始化大小
- OGCMX:老年代最大大小。因为这个jvm启动时采用默认配置。老年代动态涨上来的。
- MCMN:元空间相关
- CCSMN: 压缩类相关
jstat -gcmetacapacity
看元空间中的内存信息
1 | $ jstat -gcmetacapacity 19295 |
jstat -gcnew
新生代相关信息
1 | $ jstat -gcnew 19295 |
TT: Tenuring threshold。新生代的持有代数。默认是15。15代后的对象进入老年代。
DSS:Desired survivor size (kB)。期望的S区大小。
jstat -gcnewcapacity
1 | $ jstat -gcnewcapacity 19295 |
jstat -gcold
1 | $ jstat -gcold 19295 |
jstat -gcoldcapacity
1 | $ jstat -gcoldcapacity 19295 |
gcutil命令
1 | $ jstat -gcutil 19295 |
-gccause
1 | $ jstat -gccause 19295 |
jstat -compiler
Just-in-Time(即时)编译器的信息
1 | $ jstat -compiler 19295 |
-printcompilation
1 | $ jstat -printcompilation 19295 |
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进程可以直接连上。远程的需要开启。


Memory Analyzer (MAT)
mat是eclipse出品的开源jvm堆转储文件分析工具。
