[踩坑日记]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的小伙伴有可能看不懂,这是记录寄几在学习中遇到的坑,以后遇到,忘记了,再回来回顾~~