[踩坑日记]JVM学习-GC日志的输出

近期看完的JVM一些基础学习之后,由于工作中确实没有多少JVM调优的实战,生产环境的条件其实并发并不高,大部分情况是默认JVM参数。

在本机win10下,基于JDK1.8.0_161,来测试

所以就自己实验,体验一下JVM参数的实战魅力...

这几天遇到的坑:

实验代码:

1 public static void main(String[] args) {
2         byte[] array1 = new byte[4 * 1024 * 1024];
3         array1 = null;
4         byte[] array2 = new byte[2 * 1024 * 1024];
5         byte[] array3 = new byte[2 * 1024 * 1024];
6         byte[] array4 = new byte[2 * 1024 * 1024];
7         byte[] array5 = new byte[128 * 1024];
8         byte[] array6 = new byte[2 * 1024 * 1024];
9     }

JVM参数:

 1 -XX:NewSize=10485760
 2 -XX:MaxNewSize=10485760
 3 -XX:InitialHeapSize=20971520
 4 -XX:MaxHeapSize=20971520
 5 -XX:SurvivorRatio=8
 6 -XX:MaxTenuringThreshold=15
 7 -XX:PretenureSizeThreshold=3145728
 8 -XX:+UseParNewGC
 9 -XX:+UseConcMarkSweepGC
10 -XX:+PrintGCDetails
11 -XX:+PrintGCTimeStamps
12 -Xloggc:gc3.log

简单说明:

JVM参数说:

 

 

剩下几个不在图中的比较简单:

-XX:+UseParNewGC  使用ParNew垃圾回收器
-XX:+UseConcMarkSweepGC  使用CMS垃圾回收器
-XX:+PrintGCDetails  打印详细的GC日志
-XX:+PrintGCTimeStamps  打印出来每次GC发生的时间
-Xloggc:gc3.log  设置将GC日志写入一个磁盘文件

然后是代码的逐行分析:

 

 

 

 上面是正确的分析情况

————————————————分割线————————————————

下面是遇到的坑:

而在IDEA中会出现:

 

 

 

 

 勉强分析也是可以知道执行了CMS垃圾回收器,还把CMS的几个阶段答应出来了:

初始标记,并发标记,重新标记,并发回收。这里面估计是因为IDEA编译器内部的机制,导致这些信息都打印出来了,而且还影响分析,

第二十行看到新生代from Survivor区还有一堆不明对象存在,更难分析了。。。(IDEA编译器内部的机制导致!)

最好还是使用命令执行,更新加精准,更少不可控因素:

第二坑:

编译时候记住记住把:package com.***.***.***;去掉!

虽然 在编译器中会报错,但是用命令编译就没问题的!不然无法执行命令

 

 没有去掉package的情况:

 

 去掉package的情况;

 

 打开同级目录可以看到:

gc3.log文件!!!

 

 和理论分析几乎完美契合!

没有学习过JVM的小伙伴有可能看不懂,这是记录寄几在学习中遇到的坑,以后遇到,忘记了,再回来回顾~~

 

posted @ 2020-08-01 10:43  vince_z  阅读(1665)  评论(0编辑  收藏  举报