1、前文回顾 - 之前讲原理,本周讲GC日志
2、程序的JVM参数示范 - 见3
3、如何打印出JVM GC日志?
-XX:NewSize=5242880 -XX:MaxNewSize=5242880 -XX:InitialHeapSize=10485760 -XX:MaxHeapSize=10485760 -XX:SurvivorRatio=8
-XX:PretenureSizeThreshold=10485760 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
-Xloggc:gc.log
注意:设置了-Xloggc 后-XX:+PrintGCDetails就不生效了
4、示例程序代码
5、对象是如何分配在Eden区内的 - 见思考题
6、采用指定JVM参数运行程序
-Xloggc:d:/gc.log ,查看日志d:/gc.log
idea:
命令行:
java com.yh.stu.jvm.zero2master._43YoungGC -Xms10m -XX:NewSize=5242880
-XX:MaxNewSize=5242880 -XX:InitialHeapSize=10485760 -XX:MaxHeapSize=10485760
-XX:PretenureSizeThreshold=10485760 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
-XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:SurvivorRatio=3 -Xloggc:gcd.log
7、今日思考题
这次Young GC到底是如何运行的?
思考题回答:
参数设置:
参数设置了堆大小为10M,指定了新生代5M ,那么老年代也是5M,因为SurvivorRatio=8,所以Eden区4M,S1、S2分别是0.5M。
GC前的空间分配及判断:
先分配了3次1M对象进入Eden区,再次分配2M时,Eden区放不下了,准备进行Young GC,此时需要判断是否需要空间担保,5M的老年代空余>3M的新生代已用空间,不需要空间担保。直接进行Young GC。
执行Young GC:
遍历所有线程栈中的和静态的引用变量,进行GCRoots追踪,发现新生代的Eden和S1区没有对象存活,不需要进行对象的拷贝,直接清空Eden区和S1区。此时YoungGC执行完成。