B02、分析GC日志-6.3

1、相关GC日志参数

  1. -verbose:gc 输出gc日志信息,默认输出到标准输出
  2. -XX:+PrintGC 输出GC日志。类似:-verbose:gc
  3. -XX:+PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志,
    并在进程退出时输出当前内存各区域分配情况
  4. -XX:+PrintGCTimeStamps 输出GC发生时的时间戳
  5. -XX:+PrintGCDateStamps 输出GC发生时的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
  6. -XX:+PrintHeapAtGC 每一次GC前和GC后,都打印堆信息
  7. -Xloggc:<file> 表示把GC日志写入到一个文件中去,而不是打印到标准输出中

2、GC日志格式

2.1、GC 日志分类

2.1.1、Minor GC

        Minor GC又叫oung GC或YGC,完整的输出日志:

[GC (Allocation Failure) [PSYoungGen: 31744K->2192K(36864K)] 31744K->2200K(121856K), 0.0139308 secs] [Times: user=0.05 sys=0.01, real=0.01 secs] 

        根据上图解析示意图可得知以下规律:

2.1.2、Full GC

[GC (Allocation Failure) [PSYoungGen: 31744K->2192K(36864K)] 31744K->2200K(121856K), 0.0139308 secs] [Times: user=0.05 sys=0.01, real=0.01 secs]

2.1.3、补充说明

  1. "[GC" 和 "[Full GC" 说明了这次垃圾收集的停顿类型,如果有 "Full" 则说明 GC 发生了 "Stop The World"
  2. 使用 Serial 收集器在 新生代的名字是 Default New Generation,因此显示的是 "[DefNew"
  3. 使用 ParNew 收集器在新生代的名字会变成 "[ParNew",意思是 "Parallel New Generation"
  4. 使用 Parallel scavenge 收集器在新生代的名字是  "[PSYoungGen"
  5. 使用Parallel Old Generation收集器在老年代的名字是 "[ParOldGen"
  6. 使用G1收集器的话,会显示为 "garbage-first heap"

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

2.2、GC日志结构

2.2.1、GC 前后情况

        通过图示,我们可以发现GC日志格式的规律一般都是:GC前内存占用—>GC后内存占用(该区域内存总大小):

[PSYoungGen: 5986K->696K(8704K)] 5986K->704K(9216K)

  • 括号内:GC回收前年轻代堆大小,回收后大小,(年轻代堆总大小)
  • 括号外:GC回收前年轻代和老年代大小,回收后大小,(年轻代和老年代总大小)

2.2.3、GC 时间

        GC日志中有三个时间:user,sys和real

  1. user – 进程执行用户态代码(核心之外)所使用的时间。这是执行此进程所使用的实际 CPU 时间,其他进程和此进程阻塞的时间并不包括在内。在垃圾收集的情况下,表示 GC 线程执行所使用的 CPU 总时间。
  2. sys – 进程在内核态消耗的 CPU 时间,即在内核执行系统调用或等待系统事件所使用的 CPU 时间
  3. real – 程序从开始到结束所用的时钟时间。这个时间包括其他进程使用的时间片和进程阻塞的时间(比如等待 I/O 完成)。对于并行gc,这个数字应该接近(用户时间+系统时间)除以垃圾收集器使用的线程数。

        由于多核的原因,一般的GC事件中,real time是小于sys + user time的,因为一般是多个线程并发的去做GC,所以real time是要小于sys+user time的。如果real>sys+user的话,则你的应用可能存在下列问题:IO负载非常重或者是CPU不够用

2.3、Minor GC 日志解析

2023-11-20T17:19:43.265-0800: 0.822: [GC (ALLOCATION FAILURE) [PSYOUNGGEN: 76800K->8433K(89600K)] 76800K->8449K(294400K), 0.0088371 SECS] [TIMES: USER=0.02 SYS=0.01, REAL=0.01 SECS] 

  • (2023-11-20T17:19:43.265-0800):日志打印时间 日期格式  如 2024-05-04T21:53:59.234+0800
  • (0.822:):gc发生时,Java虚拟机启动以来经过的秒数
  • ([GC (Allocation Failure)):发生了一次垃圾回收,这是一次 Minor GC 。它不区分新生代 GC 还是老年代 GC,括号里的内容是gc发生的原因,这里的 Allocation Failure 的原因是新生代中没有足够区域能够存放需要分配的数据而失败。
  • ([PSYoungGen: 76800K->8433K(89600K)]):
    • PSYoungGen:表示GC发生的区域,区域名称与使用的GC 收集器是密切相关的
      • Serial收集器:Default New Generation  显示DefNew
      • ParNew收集器:ParNew
      • Parallel Scanvenge收集器: PSYoung
      • 老年代和新生代同理,也是和收集器名称相关
    • 76800K->8433K(89600K):GC 前该内存区域已使用容量 - > GC 后该区域容量 (该区域总容量)
      • 如果是新生代,总容量则会显示整个新生代内存的9/10,即 eden+from/to 区
      • 如果是老年代,总容量则是全部内存大小,无变化
  • (76800K->8449K(294400K)):在显示完区域容量GC的情况之后,会接着显示整个堆内存区域的GC情况:GC 前堆内存已使用容量 - > GC 堆内存容量(堆内存总容量),堆内存总容量 = 9/10 新生代+ 老年代 < 初始化的内存大小
  • (, 0.0088371 secs]):整个GC所花费的时间,单位是秒
  • ([Times: user=0.02 sys=0.01, real=0.01 secs]):
    • user:指的是CPU工作在用户态所花费的时间
    • sys:指的是CPU工作在内核态所花费的时间
    • real:指的是在此次GC事件中所花费的总时间

2.4、Full GC 日志解析

2023-11-20T17:19:43.794-0800: 1.351: [FULL GC (METADATA GC THRESHOLD) [PSYOUNGGEN: 10082K->0K(89600K)] [PAROLDGEN: 32K->9638K(204800K)] 10114K->9638K(294400K),
 [METASPACE: 20158K->20156K(1067008K)], 0.0285388 SECS] [TIMES: USER=0.11 SYS=0.00, REAL=0.03 SECS] 

  • (2023-11-20T17:19:43.794-0800):日志打印时间 日期格式  如 2013-05-04T21:53:59.234+0800
  • (1.351):gc发生时,Java虚拟机启动以来经过的秒数
  • (Full GC (Metadata GC Threshold)):
    • 发生了一次垃圾回收,这是一次FULL GC 。它不区分新生代 GC 还是老年代 GC
    • 括号里的内容是gc发生的原因,这里的 Metadata GC Threshold 的原因是 Metaspace 区不够用了
      • Full GC (Ergonomics) :JVM 自适应调整导致的GC
      • Full GC (System): 调用了System.gc( ) 方法
  • ([PSYoungGen: 10082K->0K(89600K)]):
    • PSYoungGen:表示GC发生的区域,区域名称与使用的GC 收集器是密切相关的
      • Serial收集器:Default New Generation  显示DefNew
      • ParNew收集器:ParNew
      • Parallel Scanvenge收集器: PSYoung
      • 老年代和新生代同理,也是和收集器名称相关
    • 10082K->0K(89600K):GC 前该内存区域已使用容量 - > GC 后该区域容量 (该区域总容量)
      • 如果是新生代,总容量则会显示整个新生代内存的9/10,即 eden+from/to 区
      • 如果是老年代,总容量则是全部内存大小,无变化
  • ([ParOldGen: 32K->9638K(204800K)]):老年代区域没有发生GC,因为本次GC是metaspace 引起的
  • (10114K->9638K(294400K),):在显示完区域容量GC的情况之后,会接着显示整个堆内存区域的GC情况:GC 前堆内存已使用容量 - > GC 堆内存容量(堆内存总容量)堆内存总容量 = 9/10 新生代+ 老年代 < 初始化的内存大小
  • ([Metaspace: 20158K->20156K(1067008K)],):metaspace GC  回收2K空间
  • (0.0285388 secs):整个GC所花费的时间,单位是秒
  • ([Times: user=0.11 sys=0.00, real=0.03 secs]):
    • user:指的是CPU工作在用户态所花费的时间
    • sys:指的是CPU工作在内核态所花费的时间
    • real:指的是在此次GC事件中所花费的总时间

3、案例演示

3.1、代码示例

package blnp.net.cn.jvm.demos;/**** 在jdk7 和 jdk8中分别执行*  -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+UseSerialGC** @author lyb 2045165565@qq.com* @createDate 2024/4/7 14:49*/
public class GcLogTest {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];allocation4 = new byte[4 * _1MB];}public static void main(String[] agrs) {testAllocation();}}

JDK1.7.0_080版本的执行结果:

Connected to the target VM, address: '127.0.0.1:56576', transport: 'socket'
[GC[DefNew: 8174K->618K(9216K), 0.0050449 secs] 8174K->6762K(19456K), 0.0051236 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
Heapdef new generation   total 9216K, used 4879K [0x00000000f9a00000, 0x00000000fa400000, 0x00000000fa400000)eden space 8192K,  52% used [0x00000000f9a00000, 0x00000000f9e296c0, 0x00000000fa200000)from space 1024K,  60% used [0x00000000fa300000, 0x00000000fa39a900, 0x00000000fa400000)to   space 1024K,   0% used [0x00000000fa200000, 0x00000000fa200000, 0x00000000fa300000)tenured generation   total 10240K, used 6144K [0x00000000fa400000, 0x00000000fae00000, 0x00000000fae00000)the space 10240K,  60% used [0x00000000fa400000, 0x00000000faa00030, 0x00000000faa00200, 0x00000000fae00000)compacting perm gen  total 21248K, used 3049K [0x00000000fae00000, 0x00000000fc2c0000, 0x0000000100000000)the space 21248K,  14% used [0x00000000fae00000, 0x00000000fb0fa698, 0x00000000fb0fa800, 0x00000000fc2c0000)
No shared spaces configured.
Disconnected from the target VM, address: '127.0.0.1:56576', transport: 'socket'

JDK1.8.0_321版本的执行结果:

Connected to the target VM, address: '127.0.0.1:49940', transport: 'socket'
[GC (Allocation Failure) [DefNew: 6517K->676K(9216K), 0.0024239 secs] 6517K->4772K(19456K), 0.0024547 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heapdef new generation   total 9216K, used 7224K [0x00000000fec00000, 0x00000000ff600000, 0x00000000ff600000)eden space 8192K,  79% used [0x00000000fec00000, 0x00000000ff264f08, 0x00000000ff400000)from space 1024K,  66% used [0x00000000ff500000, 0x00000000ff5a9320, 0x00000000ff600000)to   space 1024K,   0% used [0x00000000ff400000, 0x00000000ff400000, 0x00000000ff500000)tenured generation   total 10240K, used 4096K [0x00000000ff600000, 0x0000000100000000, 0x0000000100000000)the space 10240K,  40% used [0x00000000ff600000, 0x00000000ffa00020, 0x00000000ffa00200, 0x0000000100000000)Metaspace       used 3100K, capacity 4556K, committed 4864K, reserved 1056768Kclass space    used 327K, capacity 392K, committed 512K, reserved 1048576K
Disconnected from the target VM, address: '127.0.0.1:49940', transport: 'socket'

3.2、图解过程

JDK1.7

JDK1.8

4、GC日志分析工具

4.1、GCeasy

        官网地址,GCeasy是一款在线的GC日志分析器,可以通过GC日志分析进行内存泄漏检测、GC暂停原因分析、JVM配置建议优化等功能,而且是可以免费使用的(有一些服务是收费的)。

注意:该站点国内访问较不稳定,如果打开失败可以多刷新几次。

4.2、GCView

        GCViewer是一个免费的、开源的分析小工具,用于可视化查看由SUN/Oracle,IBM,HP和BEA Java虚拟机产生的垃圾收集器的日志。

        GCViewer用于可视化Java VM选项-verbose:gc 和.NET生成的数据-Xloggc:<file>。它还计算与垃圾回收相关的性能指标(吞吐量,累积的暂停,最长的暂停等)。当通过更改世代大小或设置初始堆大小来调整特定应用程序的垃圾回收时,此功能非常有用。

        下载地址,只需双击gcviewer-1.3x.jar或运行java -jar gcviewer-1.3x.jar(它需要运行java 1.8 vm),即可启动GCViewer(gui)。

4.3、其它工具

4.3.1、HPjmeter

        工具很强大,但只能打开由以下参数生成的GC log, -verbose:gc -Xloggc:gc.log。添加其他参数生成的gc.log无法打开。HPjmeter集成了以前的HPjtune功能,可以分析在HP机器上产生的垃圾回收日志文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/804276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XILINX 7系列时钟资源

文章目录 前言一、时钟概要1.1、CC1.2、BUFR、BUFIO、BUFMR1.3、CMT1.4、BUFH1.5、BUFG 二、时钟路由资源三、CMT 前言 本文主要参考xilinx手册ug472 一、时钟概要 7系列FPGA时钟资源主要有CC、BUFR、BUFIO、BUFMR、CMT、BUFG、BUFH和GTE_COMMON 1.1、CC “CC”&#xff0…

代码签名证书是什么?软件签名证书功能和分类

代码签名证书是什么&#xff1f;代码签名证书&#xff08;Code Signing Certificate&#xff09;是用于对可执行文件或脚本&#xff0c;软件代码等进行数字签名&#xff0c;可验证软件发布者身份、保证软件签名后未被篡改&#xff0c;以此验证开发者身份的真实性和保护代码的完…

运营商名称 是如何显示到 手机通知栏上的?

在我们日常使用手机的过程中&#xff0c;经常会在通知栏或设置菜单中看到特定的运营商名称&#xff0c;例如"中国移动"、"中国联通"或"中国电信"等。 那么&#xff0c;这些运营商的名称是如何出现在我们手机上的呢&#xff1f;手机又是如何区分不…

软信天成:如何通过5个步骤获得高层对主数据管理项目的支持

如今&#xff0c;全球各地的组织正在采用主数据管理&#xff08;MDM&#xff09;以应对日益严峻的数据问题。然而&#xff0c;成功地实现 MDM 项目并非易事&#xff0c;这需要得到高层的全力支持。下面&#xff0c;软信天成将详细介绍五步策略&#xff0c;协助您获得高层对MDM项…

SCI一区 | Matlab实现OOA-TCN-BiGRU-Attention鱼鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现OOA-TCN-BiGRU-Attention鱼鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现OOA-TCN-BiGRU-Attention鱼鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…

基于springboot实现常州地方旅游管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现旅游管理系统演示 摘要 随着旅游业的迅速发展&#xff0c;传统的旅游信息查询方式&#xff0c;已经无法满足用户需求&#xff0c;因此&#xff0c;结合计算机技术的优势和普及&#xff0c;针对常州旅游&#xff0c;特开发了本基于Bootstrap的常州地方旅游管…

MacOS初识SIP——解决快捷指令sh脚本报错Operation not permitted

前言 因为一些原因&#xff0c;设计了一套快捷指令&#xff0c;中间涉及到一个sh脚本的运行&#xff0c;通过快捷指令运行时就会报错&#xff1a;operation not permitted 奇怪的是在快捷指令窗口下运行一切正常&#xff0c;但是从其他地方直接调用&#xff0c;例如通过Comma…

微服务 - (狂神)

什么是微服务&#xff1a; 微服务方案&#xff1a; 1. SpringCloud NetFlix 2. Dubbo 3. SpringCloud Alibaba 解决了什么问题&#xff1a; 1. 服务过多&#xff0c;客户端怎么访问 2. 服务过多&#xff0c;服务间怎么传值 3. 服务过多&#xff0c;如何治理 4. 服务过多…

【Flutter】三个Channel(Android-java / Ios-swift)

Channel 实现与原生通信 【1】MethodChannel flutter MethodChannel官方文档 通过MethodChannel来传递数据&#xff0c;调用方法 案例 分别调用Android和Ios原生的获取电量的方法 Flutter端 实例一个MethodChannel&#xff0c; 唯一标识name&#xff0c;定义方法名称get…

JavaScript ECMAScript标准的与时俱进:从ES6至ES14的革新之路与关键技术特性剖析

ECMAScript&#xff08;通常缩写为ES&#xff09;是一种标准化的脚本语言规范&#xff0c;由ECMA International&#xff08;前身为European Computer Manufacturers Association&#xff0c;欧洲计算机制造商协会&#xff09;制定。自1997年发布首个版本以来&#xff0c;ECMAS…

设计模式之创建型模式---建造者模式

文章目录 建造者模式概述经典的建造者模式建造者模式的变种总结 建造者模式概述 建造者模式是一种广泛使用的设计模式&#xff0c;在三方开源库和各种SDK中经常见到。建造者设计模式在四人帮的经典著作《设计模式&#xff1a;可复用面向对象软件基础》中被提及&#xff0c;它的…

搭建前后端的链接(java)

搭建前后端的链接(java) 一.前提 1.1 javaEE 搭建前后端的链接首先需要用到javaEE&#xff0c;也就是java企业版&#xff0c;也就是java后端(后端javaSE) 利用javaEE和前端交互&#xff0c;javaSE和数据库交互&#xff0c;javaSE和javaEE之间再进行交互就实现了前后端的交互…

语音识别(录音与语音播报)

语音识别&#xff08;录音与语音播报&#xff09; 简介 语音识别人工智能技术的应用领域非常广泛&#xff0c;常见的应用系统有&#xff1a;语音输入系统&#xff0c;相对于键盘输入方法&#xff0c;它更符合人的日常习惯&#xff0c;也更自然、更高效&#xff1b;语音控制系…

JVM—垃圾收集器

JVM—垃圾收集器 什么是垃圾 没有被引用的对象就是垃圾。 怎么找到垃圾 引用计数法 当对象引用消失&#xff0c;对象就称为垃圾。 对象消失一个引用&#xff0c;计数减去一&#xff0c;当引用都消失了&#xff0c;计数就会变为0.此时这个对象就会变成垃圾。 在堆内存中主…

C++设计模式:抽象工厂模式(七)

1、定义与动机 抽象工厂定义&#xff1a;提供一个接口&#xff0c;让该接口负责创建一系列“相关或者相互依赖的对象”&#xff0c;无需指定它们具体的类动机&#xff1a; 在软件系统中&#xff0c;经常面临着“一系列相互依赖的对象”的创建工作&#xff1b;同时&#xff0c;…

人工智能——深度学习

4. 深度学习 4.1. 概念 深度学习是一种机器学习的分支&#xff0c;旨在通过构建和训练多层神经网络模型来实现数据的高级特征表达和复杂模式识别。与传统机器学习算法相比&#xff0c;深度学习具有以下特点&#xff1a; 多层表示学习&#xff1a;深度学习使用深层神经网络&a…

麒麟KOS删除鼠标右键新建菜单里不需要的选项

原文链接&#xff1a;麒麟KOS删除鼠标右键新建菜单里不需要的选项 Hello&#xff0c;大家好啊&#xff01;在日常使用麒麟KOS操作系统时&#xff0c;我们可能会发现鼠标右键新建菜单里包含了一些不常用或者不需要的选项。这不仅影响我们的使用效率&#xff0c;也让菜单显得杂乱…

新能源电力行业设备点巡检系统的应用

新能源电力行业正日益成为全球能源结构的重要支柱&#xff0c;其设备点巡检系统作为确保电力设施安全、高效运行的关键环节&#xff0c;正受到业界的广泛关注和应用。 设备点巡检系统是一种集数据采集、实时监控、智能分析于一体的现代化管理工具。在新能源电力行业中&#xff…

Java常见算法_常见的查找算法和排序算法——简介及代码演示

在本文中我将介绍Java中的常见算法&#xff0c;查找算法包括基本查找、二分查找、插值查找和分块查找。排序算法包括冒泡排序、选择排序、插入排序和快速排序 查找算法&#xff1a; 1.基本查找&#xff1a; 代码&#xff1a; public class BasicSearchDemo {public static …

SpringMVC:搭建第一个web项目并配置视图解析器

&#x1f449;需求&#xff1a;用spring mvc框架搭建web项目&#xff0c;通过配置视图解析器达到jsp页面不得直接访问&#xff0c;实现基本的输出“hello world”功能。&#x1f469;‍&#x1f4bb;&#x1f469;‍&#x1f4bb;&#x1f469;‍&#x1f4bb; 1 创建web项目 1…