上篇文章说了ZGC是jdk11加入的,他是未来jvm垃圾收集器的奠定者,满足TB级别内存处理,STW时间保持在10ms以下。
- Jmap
我们可以先通过jmap -histo 进程ip 来查看,但是这样看不太清晰,我们可以用这行命令生成一个文件:jmap -histo > ./print.txt。
我们还可以通过jmap -heap 进程ip 来看堆信息。
以上则是命令执行后获取到的信息。
分别代表最大堆空间是3G多,年轻代74M,年轻代最大1个G,老年代171M,元空间则是20多M。
下面则是堆正在用的信息,eden的空间容量是capacity,已经使用和空闲的都显示在内,还有from svrvivor和to survivor容量和使用情况,最后old generation代表老年代使用情况。
命令:jmap -dump:format=b,file=print.hprof 进程ip
则可以导出dump文件,这里是可以通过设置jvm参数来导出的:
-XX:+HeapDumpOnOutOfMemoryError
-XX:+HeapDumpPath=./ (存放dump文件路径)
- Jstack
命令:jstack 进程ip
从打印的信息可以看到,jstack很容易帮我们发现死锁,甚至连死锁在哪一行都标记出来(在165行)
Thread-20和thread-19线程互相死锁。
还可以看到他们锁的线程ip,是16进制,一个锁着0x000000078591c980
一个锁着0x000000078591c990
- Jinfo
命令:Info -flags pid
Jinfo -sysprops pid
- Jstat
命令:jstat -gc pid
S0C:survivor0区域,C代表当前总大小。 (单位KB)
S1C:survivor1区域,C代表当前总大小。
S0U:survivor0区域,U代表Use正在使用的区域大小。
S1U:survivor1区域,U代表Use正在使用的区域大小。
EC:eden区域,C代表当前总大小。
EU:eden区域,U代表Use正在使用的eden区域大小。
OC:old区域,C代表当前总大小。
OU:old区域,U代表Use正在使用的old区域大小。
MC:元空间区域,C代表当前总大小。
MU:元空间区域,U代表元空间正在使用的区域大小。
CCSC和CCSU代表压缩指针。
YGC:8,代表从系统启动开始youngGC发生8次GC。
TGCT:0.858,代表youngGC消耗时间0.858s。
FGC:2,代表从系统启动开始FULLGC发生2次。
FGCT:0.055,代表fullGC消耗0.055s。
GCT:FGC和YGC总的T之和。
Jstat -gc pid 1000 10 代表我要执行10次这个命令,1s执行一次。
Jstat -gccapacity pid可以查看堆情况。
Jstat -gcnew pid可以查看新生代垃圾回收。
Jstat -gcnewcapacity pid查看新生代内存。
Jstat -gcold pid老年代垃圾回收。
Jstat -gcoldcapacity pid老年代内存情况。