查看gc日志

1.设置vm参数

在Run/Debug configurations 的VM options文本框中输入:-XX:+PrintGCDateStamps -XX:+PrintGCDetails

2.实例代码

package com.ly.demo.gc;

/**
 * 引用计数算法的缺陷:无法回收对象间相互循环引用的问题
 * 参数:-XX:+PrintGCDateStamps -XX:+PrintGCDetails
 * @author yue.liu
 * @date 2019-04-01
 */
public class ReferenceCountingGC {
    public Object instance = null;
    private static final int _1MB = 1024 * 1024;
    /**
     * 占内存,以便在gc日志中查看是否被回收
     */
    private byte[] maxSize = new byte[2 * _1MB];

    public static void testGC(){
        ReferenceCountingGC objectA = new ReferenceCountingGC();
        ReferenceCountingGC objectB = new ReferenceCountingGC();
        objectA.instance = objectB;
        objectB.instance = objectA;

        objectA = null;
        objectB = null;

        System.out.println("我活着。。。");
        System.gc();
        System.out.println("我死了。。。");
    }

    public static void main(String[] args) {
        ReferenceCountingGC.testGC();
    }
}

3.gc日志

在这里插入图片描述
解释:

  1. PSYoungGen:表示新生代,这个名称由收集器决定。PS是Parallel
    Scavenge收集器的缩写,它配套的新生代称为PSYoungGen,新生代又分化eden space、from space和to
    space这三部分
  2. ParOldGen:Parallel Scavenge收集器配套的老年代
  3. Metaspace: Parallel Scavenge收集器配套的永久代
  4. total & used:总的空间和用掉的空间

可以看到上面有两种GC类型:GC和Full GC,有Full表示这次GC是发生了Stop-The-World的。

新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度非常快。

老年代GC(Major GC/Full GC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC,Major GC的速度一般会比Minor GC慢10倍以上。
major gc

  1. 图中方括号内部的[PSYoungGen: 9198K->991K(36864K)],表示GC前该内存区域已使用容量->GC后该内存区域已使用容量,后面圆括号里面的36864K为该内存区域的总容量。
  2. 方括号外面的 9198K->999K(121856K), 0.0028196 secs],表示GC前Java堆已使用容量->GC后Java堆已使用容量,后面圆括号里面的121856K为Java堆总容量。
  3. PSYoungGen耗时,[Times: user=0.00 sys=0.00, real=0.00 secs]分别表示用户消耗的CPU时间、内核态消耗的CPU时间 、 操作从开始到结束所经过的墙钟时间(Wall Clock Time)

user是用户态耗费的时间,sys是内核态耗费的时间,real是整个过程实际花费的时间。user+sys是CPU时间,每个CPU core单独计算,所以这个时间可能会是real的好几倍。

CPU时间和墙钟时间的差别是,墙钟时间包括各种非运算的等待耗时,例如等待磁盘I/O、等待线程阻塞,而CPU时间不包括这些耗时。
Full GC:

[Full GC (System.gc()) [PSYoungGen: 991K->0K(36864K)] [ParOldGen: 8K->912K(84992K)] 999K->912K(121856K), [Metaspace: 3958K->3958K(1056768K)], 0.0074408 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 

从左到右分别为:

[GC类型 (System.gc()) [Young区: GC前Young的内存占用->GC后Young的内存占用(Young区域总大小)] [old老年代: GC前Old的内存占用->GC后Old的内存占用(Old区域总大小)] GC前堆内存占用->GC后堆内存占用(JVM堆总大小), [永久代区: GC前占用大小->C后占用大小(永久代区总大小)], GC用户耗时] [Times:用户耗时 sys=系统时间, real=实际时间] 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值