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.rhkb.cn/news/303108.html

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

相关文章

K8S容器空间不足问题分析和解决

如上图&#xff0c;今天测试环境的K8S平台出现了一个问题&#xff0c;其中的一个容器报错&#xff1a;Free disk space below threshold. Available: 3223552 bytes (threshold: 10485760B)&#xff0c;意思服务器硬盘空间不够了。这个问题怎么产生的&#xff0c;又怎么解决的呢…

springboot+vue2+elementui+mybatis- 批量导出导入

全部导出 批量导出 报错问题分析 经过排查&#xff0c;原因是因为在发起 axios 请求的时候&#xff0c;没有指定响应的数据类型&#xff08;这里需要指定响应的数据类型为 blob 二进制文件&#xff09; 当响应数据回来后&#xff0c;会执行 axios 后置拦截器的代码&#xff0…

Linux内核映像vmlinux、Image、zImage、uImage,system.map区别

编译好内核后&#xff0c;一般都会生成标题中的各种文件&#xff0c;这些文件都有什么不同呢&#xff1f; vmlinux&#xff08;elf文件&#xff09; vmlinux&#xff1a;Linux内核编译出来的原始的内核文件&#xff0c;elf格式&#xff0c;未做压缩处理。 该映像可用于定位内…

JVM—垃圾收集器

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

基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba并采用前后端分离的企业级微服务多租户系统架构

简介 基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba并采用前后端分离的企业级微服务多租户系统架构。并引入组件化的思想实现高内聚低耦合并且高度可配置化&#xff0c;适合学习和企业中使用。 真正实现了基于RBAC、jwt和oauth2的无状态统一权限认证的解决方案&#x…

天池医疗AI大赛[第一季] Rank5解决方案

一、赛题说明 数据格式 本次大赛数据集包含数千份高危患者的低剂量肺部CT影像&#xff08;mhd格式&#xff09;数据&#xff0c;每个影像包含一系列胸腔的多个轴向切片。每个影像包含的切片数量会随着扫描机器、扫描层厚和患者的不同而有差异。原始图像为三维图像。这个三维图…

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

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

从ChatGPT到多模态大模型:现状与未来(多模态)

ChatGPT 训练的核心技术主要包括: 预训练语言模型;有监督微调;基于人类反馈的 强 化 学 习 (ReinforcementLearningfrom Human Feedback,RLHF) 首先,通过自监督预训练使语言模型从大规模语料库中学习语言规律,具备基础 理解和生成能力;然后,通过构造指令微调数据集 并对模型进…

uniapp在发行原始云打包ios时提示私钥证书不是有效的p12文件

uniapp在发行原始云打包ios时提示私钥证书不是有效的p12文件 解决方法&#xff1a; 经过我多次的创建p12证书文件&#xff0c;然后更换设备继续创建&#xff0c;仍然存在这个问题&#xff0c;通过排查不是.p12的本身的问题&#xff0c;而是命名的问题&#xff0c;命名不能是中…

数据仓库的概念和作用?如何搭建数据仓库?

随着企业规模的扩大和数据量的爆炸性增长&#xff0c;有效管理和分析海量数据成为企业数字化转型的关键。而在互联网的普及过程中&#xff0c;信息技术已深入渗透各行业&#xff0c;逐渐融入企业的日常运营。然而&#xff0c;企业在信息化建设中面临了一系列困境和挑战&#xf…

MKS GHW-12 RF Plasma Generator Genesis 使用说明

MKS GHW-12 RF Plasma Generator Genesis 使用说明

云平台和云原生

目录 1.0 云平台 1.1.0 私有云、公有云、混合云 1.1.1 私有云 1.1.2 公有云 1.1.3 混合云 1.2 常见云管理平台 1.3 云管理的好处 1.3.1 多云的统一管理 1.3.2 跨云资源调度和编排需要 1.3.3 实现多云治理 1.3.4 多云的统一监控和运维 1.3.5 统一成本分析和优化 1.…

适用于 Mac 的 10 大数据恢复工具,具有优点、缺点

数据丢失很常见&#xff0c;并且可能由于许多不同的原因而发生。这种情况在我和我们团队的其他成员身上发生过很多次&#xff0c;即使我们格外小心我们的个人存储设备。 幸运的是&#xff0c;数据恢复软件在大多数情况下都可以工作。但是&#xff0c;由于数据丢失场景彼此之间…

主流排序简单集合

排序算法集合 选择排序 图解&#xff1a;以此类推直至 /*选择排序*/ void select_sort(vector<int>& nums) {/*选取一个基准元素逐个与后面的比较*/for (int i 0; i < nums.size() - 1-1; i) {int min i;/*定义随之变化的基准元素*/for (int j i 1; j <…

LVS+Keepalive 实现负载均衡高可用集群_lvs+keepalived

一、LVS 介绍 目前LVS已经被集成到Linux内核模块中。LVS是Linux Virtual Server的简称&#xff0c;也就是Linux虚拟服务器&#xff0c;该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案&#xff0c;终端互联网用户从外部访问公司的外部负载均衡服务器&#xff0c;终…

【项目】棋海争锋

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 项目介绍 WebSocket介绍 使用 项目创建 数据库设计 用户模块 登录接口 注册接口 获取用户信息接口 匹配模块 …

华为S5735S核心交换配置实例

以下脚本实现创建vlan2,3&#xff0c;IP划分&#xff0c;DHCP启用&#xff0c;接口划分&#xff0c;ssh,telnet,http,远程登录启用 默认用户创建admin/admin123提示首次登录需要更改用户密码 sysname test-Hxvlan 2 description to test1…

【快捷部署】016_Ollama(CPU only版)

&#x1f4e3;【快捷部署系列】016期信息 编号选型版本操作系统部署形式部署模式复检时间016Ollama&#xff08;CPU only&#xff09;latestCentOS 7.XDocker单机2024-04-10 注意事项&#xff1a; 1、目前镜像及大模型下载速度尚可&#xff0c;但由于容量较大&#xff0c;所以…

汽车4S行业的信息化特点与BI建设挑战

汽车行业也是一个非常大的行业&#xff0c;上下游非常广&#xff0c;像主机厂&#xff0c;上游的零配件&#xff0c;下游的汽车流通&#xff0c;汽车流通之后的汽车后市场&#xff0c;整个链条比较长。今天主要讲的是汽车流通&#xff0c;汽车4S集团。一个汽车4S集团下面授权代…

gitlab、jenkins安装及使用文档二

安装 jenkins IP地址操作系统服务版本192.168.75.137Rocky9.2jenkins 2.450-1.1 jdk 11.0.22 git 2.39.3192.168.75.138Rocky9.2gitlab-ce 16.10.0 结合上文 jenkins安装 前期准备&#xff1a; yum install -y epel-release yum -y install net-tools vim lrzsz wget…