如何看懂GC日志

先在idea上设置好jvm启动参数
-Xms20M 最大堆空间20m
-Xms20M 最小堆空间20m
-Xmn 10 新生代10m
因此老年代也就只有10m了
-xx:+PrintGCDetails 表示打印GC日志
-xx:SurvivorRatio=8表示 在新生代中 eden区和survivor区的大小比值为8比1
如何看懂GC日志_第1张图片

运行代码

 private static final int _1MB = 1024 * 1024;
    public static void testAllocation() {
        byte[] allocation1, allocation2, allocation3, allocation4;
        allocation1 = new byte[2 * _1MB];
        allocation2 = new byte[2 * _1MB];
        allocation3 = new byte[2 * _1MB];
        //出现一次minor GC
        allocation4 = new byte[4 * _1MB];

    }


    public static void main(String[] args) {
        testAllocation();
    }

创建了3个2MB的对象,一个4MB的对象,

因为一开始 先来的2mb对象会被放到eden区,放了3个之后,占了6mb空间,

-Xmn 10 新生代10m
-xx:SurvivorRatio=8表示 在新生代中 eden区和survivor区的大小比值为8比1
因此 eden的大小为8mb,因为在新生代中有两个survivor区。

此时eden区已经用掉了6mb,就还剩下2mb
因此放不下新来的4mb
因此allocation4会被分配到老年代 。
-xx:+PrintGCDetails 表示打印GC日志。

打印出来的gc日志如下 :
如何看懂GC日志_第2张图片

PSYoungGen 表示的是新生代 ,垃圾收集器为Parallel Scanvenge 是一款并行的垃圾收集器,特点为重视吞吐量,而不是gc停顿时间,可以设置自动调节新生代eden区的比率大小和晋升老年代的年龄等参数。
除此之外,还有ParNew ,表明用的垃圾收集器是ParNew 一款并行垃圾收集器,
defNew表明用的是默认的serial垃圾收集器,单线程的垃圾收集器。

但是以上的共同点就是,都是代表新生代。
新生代的信息

 PSYoungGen      total 9216K, used 8192K [0x00000007bf600000, 0x00000007c0000000, 0x00000007c0000000)
  eden space 8192K, 100% used [0x00000007bf600000,0x00000007bfe00000,0x00000007bfe00000)
  from space 1024K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007c0000000)
  to   space 1024K, 0% used [0x00000007bfe00000,0x00000007bfe00000,0x00000007bff00000)
  

第一行 表明是新生代 Parallel Scanvenge 垃圾收集器
总大小为9216k ,已使用8182k ,eden区空间为8192k, 已经被使用百分之百
from survivor和to survivor区都没有被使用,大小为1024k

老年代

ParOldGen       total 10240K, used 4096K [0x00000007bec00000, 0x00000007bf600000, 0x00000007bf600000)
  object space 10240K, 40% used [0x00000007bec00000,0x00000007bf000010,0x00000007bf600000)

老年代用的是ParOldGen 表示是用的paraller old 收集器, 是parallel scavenge的老年代版本,使用多线程和 标记-整理 算法。 除了这个之外 还有serial old和cms收集器。
总大小为10240k,已经使用4096k,因此可以看到 那4mb的对象被分配到了老年代
对象空间已经被使用40%

你可能感兴趣的:(java,学习)