JVM的GC日志及运行参数解读

 更新时间:2023年09月03日 14:21:57   作者:jacheut  
这篇文章主要为大家介绍了JVM的GC日志及运行参数解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文 

{Heap before GC invocations=35866 (full 34):
 par new generation   total 290176K, used 287809K [0x00000000d4400000, 0x00000000e7000000, 0x00000000e7000000)
  eden space 273152K, 100% used [0x00000000d4400000, 0x00000000e4ec0000, 0x00000000e4ec0000)
  from space 17024K,  86% used [0x00000000e4ec0000, 0x00000000e5d10770, 0x00000000e5f60000)
  to   space 17024K,   0% used [0x00000000e5f60000, 0x00000000e5f60000, 0x00000000e7000000)
 concurrent mark-sweep generation total 409600K, used 159259K [0x00000000e7000000, 0x0000000100000000, 0x0000000100000000)
 Metaspace       used 137146K, capacity 146452K, committed 147072K, reserved 378880K
  class space    used 15581K, capacity 17238K, committed 17536K, reserved 247808K
2023-09-02T01:18:40.811+0000: 142176.656: [GC (Allocation Failure) 2023-09-02T01:18:40.811+0000: 142176.657: [ParNew: 287809K->13868K(290176K), 0.0142053 secs] 447069K->173146K(699776K), 0.0144550 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
Heap after GC invocations=35867 (full 34):
 par new generation   total 290176K, used 13868K [0x00000000d4400000, 0x00000000e7000000, 0x00000000e7000000)
  eden space 273152K,   0% used [0x00000000d4400000, 0x00000000d4400000, 0x00000000e4ec0000)
  from space 17024K,  81% used [0x00000000e5f60000, 0x00000000e6ceb260, 0x00000000e7000000)
  to   space 17024K,   0% used [0x00000000e4ec0000, 0x00000000e4ec0000, 0x00000000e5f60000)
 concurrent mark-sweep generation total 409600K, used 159277K [0x00000000e7000000, 0x0000000100000000, 0x0000000100000000)
 Metaspace       used 137146K, capacity 146452K, committed 147072K, reserved 378880K
  class space    used 15581K, capacity 17238K, committed 17536K, reserved 247808K
}

 一段GC日志

 JVM参数为:-Xms700m -Xmx700m -Xmn300m -XX:MetaspaceSize=250m -XX:MaxMetaspaceSize=250m -XX:SurvivorRatio=16

如上是一段GC日志,先来解读这一行:

2023-09-02T01:18:40.811+0000: 142176.656: [GC (Allocation Failure) 2023-09-02T01:18:40.811+0000: 142176.657: [ParNew: 287809K->13868K(290176K), 0.0142053 secs] 447069K->173146K(699776K), 0.0144550 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]

2023-09-02T01:18:40.811+0000:表示的是一个日期格式

142176.656:系统运行142176.656秒的时候发生。

GC:表明进行一次垃圾回收,前面没有Full修饰,表明这是一次Minor GC。注意它不是表示只GC新生代。

(Allocation Failure):表示本次引起GC的原因是因为在年轻代中没有足够的空间能够存储新的数据了。

ParNew:表明本次GC发生在年轻代并且使用的是ParNew垃圾收集器。ParNew是一个Serial收集器的多线程版本,会使用多个CPU和线程完成垃圾收集工作(默认使用的线程数和CPU数相同,可以使用-XX: ParallelGCThreads参数限制)。该收集器采用复制算法回收内存,期间会停止其他工作线程,即Stop The World。

287809K->13868K(290176K):单位是KB
三个参数分别为:GC前该内存区域(这里是年轻代)使用容量,GC后该内存区域使用容量,该内存区域的总容量(Eden区 + 1个Survivor区)。

0.0142053 secs:该内存区域GC耗时,单位是秒。

447069K->173146K(699776K):三个参数分别为:堆区垃圾回收前的大小,堆区垃圾回收后的大小,堆区总大小。

0.0144550 secs:该内存区域GC耗时,单位是秒。

[Times: user=0.01 sys=0.00, real=0.01 secs]:分别表示用户态耗时,内核态耗时和总耗时。

其他日志解读

如果设置了 PrintHeapAtGC 参数,则 HotSpot 在 GC 前后都会将 GC 堆的概要信息输出出来。
Heap before GC 和 Heap after GC 分别表示 GC 前后堆的信息的开始,invocations 表示 GC 的次数,可以看到 后面跟了个 invocations,这里 invocations 表示总的 GC 次数,可以发现在 after 之后,invocations 自增了,而 full 表示第几次 Full GC。
invocations 会随着系统运行一直自增下去,通过这些信息可以很轻松的统计出一段时间的 GC 次数。

Heap before GC invocations=35866 (full 34):
 par new generation   total 290176K, used 287809K [0x00000000d4400000, 0x00000000e7000000, 0x00000000e7000000)
  eden space 273152K, 100% used [0x00000000d4400000, 0x00000000e4ec0000, 0x00000000e4ec0000)
  from space 17024K,  86% used [0x00000000e4ec0000, 0x00000000e5d10770, 0x00000000e5f60000)
  to   space 17024K,   0% used [0x00000000e5f60000, 0x00000000e5f60000, 0x00000000e7000000)
Heap after GC invocations=35867 (full 34):
par new generation   total 290176K, used 13868K [0x00000000d4400000, 0x00000000e7000000, 0x00000000e7000000)
  eden space 273152K,   0% used [0x00000000d4400000, 0x00000000d4400000, 0x00000000e4ec0000)
  from space 17024K,  81% used [0x00000000e5f60000, 0x00000000e6ceb260, 0x00000000e7000000)
  to   space 17024K,   0% used [0x00000000e4ec0000, 0x00000000e4ec0000, 0x00000000e5f60000)

再看下面的日志,可以看到年轻代和老年代所使用的垃圾回收器,以及各自的情况。

新生代 par new generation 表示使用 ParNew 作为垃圾回收器,一共 290176 K 大小,使用了 287809 K 大小。其中 eden 区已经满了,from survivor 用了 86%,to survivor 用了 0%,每个后面都跟了内存地址,头一个表示起始地址,第二个表示当前用到的最大地址,第三个表示终止地址。
观察 before 和 after,细心点可以观察到 from 和 to 的地址对调了。

紧跟着 par new generation 后面的是 concurrent mark-sweep generation,总共的量409600K,使用的量159277K,地址可以清楚的看到,后面跟着的三个参数同样是起止地址,而第二个和第三个是相同的。
此外还给出了 Metaspace 的使用情况,以及 class space 的使用情况。这两个值初始会比较小,在使用过程中会容量会逐步扩大。

  • used:加载的类的空间量。
  • capacity: 当前分配块的元数据的空间。
  • committed: 空间块的数量。
  • reserved:元数据的空间保留(但不一定提交)的量。

以上就是JVM的GC日志及运行参数解读的详细内容,更多关于JVM GC日志解读的资料请关注脚本之家其它相关文章!

相关文章

  • Spring注解之@Import使用方法讲解

    Spring注解之@Import使用方法讲解

    @Import是Spring基于Java注解配置的主要组成部分,下面这篇文章主要给大家介绍了关于Spring注解之@Import的简单介绍,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • Java 在 Array 和 Set 之间进行转换的示例

    Java 在 Array 和 Set 之间进行转换的示例

    这篇文章主要介绍了Java如何在Array和Set之间进行转换,在本文章中,我们对如何在 Java 中对Array和Set进行转换进行一些说明和示例,需要的朋友可以参考下
    2023-05-05
  • Springboot实例讲解实现专业材料认证管理系统流程

    Springboot实例讲解实现专业材料认证管理系统流程

    这是一个基于java的毕业设计项目,毕设课题为springboot框架的知识产权服务平台系统,是一个采用b/s结构的javaweb项目,需要的朋友可以参考下
    2022-06-06
  • 创建动态代理对象bean,并动态注入到spring容器中的操作

    创建动态代理对象bean,并动态注入到spring容器中的操作

    这篇文章主要介绍了创建动态代理对象bean,并动态注入到spring容器中的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 详解Java序列化如何破坏单例模式

    详解Java序列化如何破坏单例模式

    这篇文章主要为大家详细介绍了Java序列化是如何破坏单例模式的,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以学习一下
    2023-12-12
  • Spring Boot 启动流程解析

    Spring Boot 启动流程解析

    Spring Boot 是一个简化的 Spring 应用开发框架,它以 “约定优于配置” 的理念,为开发者提供了开箱即用的功能,本文将详细剖析其内部实现,帮助你深入理解 Spring Boot 的启动机制,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • 浅谈Java中GuavaCache返回Null的注意事项

    浅谈Java中GuavaCache返回Null的注意事项

    Guava在实际的Java后端项目中应用的场景还是比较多的,比如限流,缓存,容器操作之类的,本文主要介绍了GuavaCache返回Null的注意事项,感兴趣的可以了解一下
    2021-10-10
  • Java多线程批量数据导入的方法详解

    Java多线程批量数据导入的方法详解

    这篇文章主要介绍了Java多线程批量数据导入的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面小编和大家来一起学习下吧
    2019-06-06
  • java数据结构与算法之简单选择排序详解

    java数据结构与算法之简单选择排序详解

    这篇文章主要介绍了java数据结构与算法之简单选择排序,结合实例形式分析了选择排序的原理、实现方法与相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • 关于Spring的@Autowired依赖注入常见错误的总结

    关于Spring的@Autowired依赖注入常见错误的总结

    有时我们会使用@Autowired自动注入,同时也存在注入到集合、数组等复杂类型的场景。这都是方便写 bug 的场景,本篇文章带你了解Spring @Autowired依赖注入的坑
    2021-09-09

最新评论