理解 GC 日志

使用的是 java version "1.8.0_161"进行测试的。
设置 JVM 启动参数为:

-Xms10m -Xmx10m -XX:+PrintGCDetails -Xloggc:/data/log/gc.log 
-XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/data/log

执行代码片段:

public class RuntimeConstantPoolOOM {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        int i = 0;
        while (true) {
            list.add(String.valueOf(i++).intern());
        }
    }
}

然后抛出异常

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded

下面来看生成的 gc.log。

CommandLine flags:
 -XX:+HeapDumpOnOutOfMemoryError
 -XX:HeapDumpPath=/data/log
 -XX:InitialHeapSize=10485760 
 -XX:MaxHeapSize=10485760
 -XX:+PrintGC 
 -XX:+PrintGCDateStamps 
 -XX:+PrintGCDetails 
 -XX:+PrintGCTimeStamps 
 -XX:+UseCompressedClassPointers
 -XX:+UseCompressedOops 
 -XX:+UseParallelGC 

这是 gc.log 中的虚拟机运行的参数,可知我们的垃圾收集器是 ParallelGC。

Minor GC

Minor GC:新生代 GC,指发生在新生代的 GC 事件,新生代的 Java 对象大多朝生夕灭,Minor GC 会很频繁,回收速度非常快。

2018-11-18T19:31:12.804-0800: 0.207: 
[ GC (Allocation Failure) [PSYoungGen: 2048K->496K(2560K)] 
 2048K->588K(9728K), 0.0011270 secs ]
[Times: user=0.00 sys=0.01, real=0.00 secs] 
  1. 2018-11-18T19:31:12.804-0800: 发生 GC 事件的开始时间点
  2. 0.207:GC 事件的开始时间,相对于 JVM 的启动时间,单位是秒
  3. GC:用来区分是 Minor GC 还是 Full GC 的标志,这里表示发生的 Minor GC
  4. Allocation Failure:引起垃圾回收的原因,本次 GC 是因为年轻代中不能存放新分配的数据结构
  5. PSYoungGen:表示新生代,这个名称由 GC 收集器决定,这里的收集器是 Parallel Scavenge,新生代收集器,采用复制算法进行收集
  6. 2048K->496K(2560K):表示本次 GC 之前和之后年轻代内存的使用情况,圆括号里的 2560k 表示年轻代的总大小,年轻代细分为 Eden、From Survivor、To Survivor 空间。
  7. 2048K->588K(9728K):表示本次 GC 之前和之后堆内存的使用情况,括号里的内存大小表示可用的堆内存
  8. 0.0011270 secs:GC 事件持续的时间,单位是秒
  9. Times: user=0.00 sys=0.01, real=0.00 secs:GC 事件的持续时间,通过多种分类来进行衡量:
    user - 此次垃圾回收,垃圾收集线程消耗的所有 CPU 时间,即用户态消耗的 CPU 时间
    sys - 内核态消耗的 CPU 时间
    real - 应用程序暂停的时间(clock time),包括各种非运算的等待耗时,如等待磁盘 I/O 、线程阻塞,CPU时间不包括这些

堆大小 = 新生代(eden + from + to) + 老年代,
年轻代从 2048K->496K 回收了1552 k,
堆内存 从 2048K->588K 回收了 1460 k,
可知有 1552 - 1460 = 92k 的对象从年轻代升级到了老年代

Full GC

发生在老年代的 GC(或称 Major GC),经常伴随至少一次的 Minor GC,Full GC 的速度一般会比 Minor GC 慢 10 倍以上。

2018-11-18T19:31:12.857-0800: 0.259:
 [Full GC (Ergonomics) [PSYoungGen: 480K->0K(2560K)] 
 [ParOldGen: 5706K->5764K(7168K)] 6186K->5764K(9728K),
 [Metaspace: 3317K->3317K(1056768K)], 0.0556835 secs] 
 [Times: user=0.09 sys=0.00, real=0.06 secs] 
  1. [Full GC (Ergonomics) [PSYoungGen: 480K->0K(2560K)]: 老年代 GC 又称 Major GC,会伴随着一次年轻代的 GC(Minor GC),速度比较慢
  2. [ParOldGen: 5706K->5764K(7168K)] 6186K->5764K(9728K):老年代 GC,Parallel Scavenge 的老年代版本,5706K->5764K(7168K)] 这个和年轻代的 GC 类似,表示 GC 前和 GC 后所占用的空间。6186K->5764K(9728K)表示 GC 前和 GC 后堆内存的占用,括号里是堆内存的大小
  3. [Metaspace: 3317K->3317K(1056768K)]:表示元空间 GC 前和 GC 后的内存占用,括号里表示 JVM 元空间的总大小
    参考:Understanding Garbage Collection Logs
    JVM(十三)理解GC日志
    《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值