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、示例程序代码

043、JVM实战总结:动手实验,自己动手模拟出频繁Young GC的场景_参数设置

5、对象是如何分配在Eden区内的 - 见思考题

6、采用指定JVM参数运行程序

      -Xloggc:d:/gc.log ,查看日志d:/gc.log

idea:

043、JVM实战总结:动手实验,自己动手模拟出频繁Young GC的场景_参数设置_02

命令行:

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执行完成。