B02、分析GC日志-6.3
1、相关GC日志参数
- -verbose:gc 输出gc日志信息,默认输出到标准输出
- -XX:+PrintGC 输出GC日志。类似:-verbose:gc
- -XX:+PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志,
并在进程退出时输出当前内存各区域分配情况 - -XX:+PrintGCTimeStamps 输出GC发生时的时间戳
- -XX:+PrintGCDateStamps 输出GC发生时的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
- -XX:+PrintHeapAtGC 每一次GC前和GC后,都打印堆信息
- -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、补充说明
- "[GC" 和 "[Full GC" 说明了这次垃圾收集的停顿类型,如果有 "Full" 则说明 GC 发生了 "Stop The World"
- 使用 Serial 收集器在 新生代的名字是 Default New Generation,因此显示的是 "[DefNew"
- 使用 ParNew 收集器在新生代的名字会变成 "[ParNew",意思是 "Parallel New Generation"
- 使用 Parallel scavenge 收集器在新生代的名字是 "[PSYoungGen"
- 使用Parallel Old Generation收集器在老年代的名字是 "[ParOldGen"
- 使用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
- user – 进程执行用户态代码(核心之外)所使用的时间。这是执行此进程所使用的实际 CPU 时间,其他进程和此进程阻塞的时间并不包括在内。在垃圾收集的情况下,表示 GC 线程执行所使用的 CPU 总时间。
- sys – 进程在内核态消耗的 CPU 时间,即在内核执行系统调用或等待系统事件所使用的 CPU 时间
- 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 区
- 如果是老年代,总容量则是全部内存大小,无变化
- PSYoungGen:表示GC发生的区域,区域名称与使用的GC 收集器是密切相关的
- (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 区
- 如果是老年代,总容量则是全部内存大小,无变化
- PSYoungGen:表示GC发生的区域,区域名称与使用的GC 收集器是密切相关的
- ([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机器上产生的垃圾回收日志文件。
相关文章:
B02、分析GC日志-6.3
1、相关GC日志参数 -verbose:gc 输出gc日志信息,默认输出到标准输出-XX:PrintGC 输出GC日志。类似:-verbose:gc-XX:PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志, 并在进程退出时输出当前内存各区域分配情况-XX:PrintGCTimeStamp…...
Redis中的集群(二)
节点 集群数据结构 redisClient结构和clusterLink结构的相同和不同之处 redisClient结构和clusterLink结构都有自己的套接字描述符和输入、输出缓冲区,这两个结构的区别在于,redisClient结构中的套接字和缓冲区是用于连接客户端的,而clust…...
UVA12538 Version Controlled IDE 题解 crope
Version Controlled IDE 传送门 题面翻译 维护一种数据结构,资磁三种操作。 1.在p位置插入一个字符串s 2.从p位置开始删除长度为c的字符串 3.输出第v个历史版本中从p位置开始的长度为c的字符串 1 ≤ n ≤ 50000 1 \leq n \leq 50000 1≤n≤50000,所…...
OAuth2.0客户端和服务端Java实现
oauth2 引言 读了《设计模式之美》和《凤凰架构》架构安全篇之后,决定写一个OAuth2.0的认证流程的Demo,也算是一个阶段性的总结,具体原理实现见《凤凰架构》(架构安全设计篇)。 涉及到的源码可以从https://github.com/WeiXiao-Hyy/oauth2获…...
物流自动分拣系统激光雷达漫反射板
早在二十世纪六十年代,激光器的诞生为激光雷达技术的发展奠定了基础。随后,激光雷达技术开始应用于各种领域,包括军事、航空、地理勘测等。然而,在物流自动分拣领域,激光雷达的应用相对较晚。 随着物流行业的快速发展和…...
2024 抖音欢笑中国年(三):编辑器技巧与实践
前言 本次春节活动中,我们大部分场景使用内部的 SAR Creator互动方案来实现。 SAR Creator 是一款基于 TypeScript 的高性能、轻量化的互动解决方案,目前支持了Web和字节内部跨端框架平台,服务于字节内部的各种互动业务,包括但不限…...
Python学习入门(1)——基础语句(二)
14. 迭代器和迭代协议 在Python中,迭代器是支持迭代操作的对象,即它们可以一次返回其成员中的一个。任何实现了 __iter__() 和 __next__() 方法的对象都是迭代器。 class Count:def __init__(self, low, high):self.current lowself.high highdef __i…...
vue 百度地图 使用 vue-baidu-map 进行当前位置定位和范围展示
vue 百度地图 使用 vue-baidu-map 进行当前位置定位和范围展示(考勤打卡) 一、创建百度地图账号,获取秘钥二、 引入插件1、安装vue-baidu-map2、在main.js中引入 三、 简单使用 最近写项目的时候,做到了考勤打卡的模块内容&#x…...
使用idea运行程序,发现控制台的中文出现乱码
修改UTF-8发现没有效果,寻找.idea文件夹的encodings.xml文件,将里面的UTF-8全部变成GBK....
基于javassm实现的大学生兼职信息系统
开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包&…...
O2OA开发平台如何查看数据表结构?
在访问后端api地址,页面最下方有列示平台的各个服务,点击进入可查看具体的表内容 后端api地址: http://{hostIP}/x_program_center/jest/list.html 其中:{hostIP}为中心服务器所在域名或者IP地址 如下图:...
心理测评性格测试矩阵版h5微信抖音QQ快手小程序app开源版开发
心理测评性格测试矩阵版h5微信抖音QQ快手小程序app开源版开发 支持SAAS、支持独立加密、支持独立开源、价格不同。 自带题库数据,后台一键初始,支持自己上传题目 心理测评 微信公众号微信小程序抖音小程序可打包APP 支持单题、跳跃题、计分题、因子题、…...
【蓝桥杯】十六进制转八进制 C++实现
1.题目信息 时间限制:1.0s 内存限制:512.0MB 问题描述 给定n个十六进制正整数,输出它们对应的八进制数。 输入格式 输入的第一行为一个正整数n (1<n<10)。 接下来n行,每行一个由09、大写字母AF组成…...
明明设置数字居中对齐,为什么excel的数字却不居中?
有时候在excel里,选中数据,设置对齐方式 左右居中,然而,数字却怎么都不居中,为什么呢? 1.按快捷键Ctrl1,打开单元格自定义格式对话框,看到是初始界面是在数字的会计专用,…...
深入解析API技术:原理、实现与应用
在现代软件开发中,API(应用程序接口)扮演着至关重要的角色。API 允许不同的软件应用程序和系统之间进行通信和数据交换,从而构建出更加高效、灵活和可扩展的软件解决方案。本文将深入解析API技术的原理、实现方法,并附…...
C语言——数组指针变量
一、什么是数组指针 数组指针变量是指向数组的指针,它可以用来遍历数组元素、进行数组操作以及作为函数参数传递数组等操作。在C语言中,数组名本身就是数组的首地址,因此数组指针可以指向数组的首地址。 数组指针变量的基本形式:…...
Redis的过期策略与内存淘汰机制原理及实践
Redis作为高性能的键值存储系统,其对数据过期与内存管理的设计直接影响到系统的性能与资源利用率。本文将以生动的比喻、通俗的语言,深入剖析Redis的过期策略与内存淘汰原理,助您全面理解数据在Redis中的生命周期管理艺术。 一、Redis过期策…...
【24届数字IC秋招总结】提前批面试经验1——小米、百度昆仑芯、长鑫存储
文章目录 前言一、小米-SOC验证工程师1.1 面试问题二、百度昆仑芯-芯片验证工程师2.1 一面面试问题2.2 二面面试问题三、长鑫存储-数字电路前言 提前批面试公司:小米、百度昆仑芯、长鑫存储 一、小米-SOC验证工程师 面试时间:7.23 周末 1.1 面试问题 1、 问研究生项目,自…...
第7章、ReactRedux 实战 - 登录注册验证;
一、登录注册认证系统课程介绍; 1、基本概念; ; 2、代码; 二、搭建前端环境; 1、基本概念; ; 2、代码; 三、搭建后端环境; 1、基本概念; ࿱…...
16路HDMI+AV流媒体IPTV高清编码器JR-3216HD
产品简介: JR-3216HD 16路高清HDMIAV编码器是专业的高清音视频编码产品,该产品具有支持16路高清HDMI音视频采集功能,16路标清AV视频采集功能,16路3.5MM独立外接音频输入,编码输出双码流H.264格式,音频MP3/…...
xrdp实战:构建企业级Linux远程桌面服务的3个关键决策
xrdp实战:构建企业级Linux远程桌面服务的3个关键决策 【免费下载链接】xrdp xrdp: an open source RDP server 项目地址: https://gitcode.com/gh_mirrors/xrd/xrdp xrdp作为开源RDP服务器,为Linux系统提供了Windows远程桌面协议的原生支持&#…...
从刷题到实战:一文搞懂C/C++进制转换(含itoa、strtol、bitset函数避坑指南)
从刷题到实战:C/C进制转换全攻略与避坑指南 引言:为什么进制转换如此重要? 记得第一次参加技术面试时,面试官抛出一道看似简单的题目:"如何将十六进制的颜色代码转换为RGB值?"当时手忙脚乱的样子…...
从陀螺仪漂移到位置修正:图解SINS精对准中的误差传递链
从陀螺仪漂移到位置修正:图解SINS精对准中的误差传递链 在自动驾驶和无人机领域,精确的导航系统是确保安全与性能的核心。想象一下,当你的设备在复杂环境中飞行或行驶时,一个微小的陀螺仪漂移如何像蝴蝶效应般最终导致显著的定位偏…...
8大网盘直链获取指南:告别限速的浏览器脚本解决方案
8大网盘直链获取指南:告别限速的浏览器脚本解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云…...
别再死记硬背了!用Python+NumPy手把手教你搞定任意倾斜椭圆的参数拟合
用PythonNumPy实战任意倾斜椭圆的参数拟合 在计算机视觉和工业检测领域,椭圆拟合是一项基础但关键的技术。想象一下这样的场景:生产线上的摄像头捕捉到的圆形零件由于拍摄角度变成了椭圆形,天文望远镜拍摄的星体轨道呈现倾斜椭圆形态…...
KMS激活脚本:5分钟免费激活Windows和Office的完整指南
KMS激活脚本:5分钟免费激活Windows和Office的完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否在为Windows系统和Office办公软件的激活问题而烦恼?面对复杂…...
10大好用班组4m变更管理系统盘点!班组4m变更管理系统选型避坑指南
在制造业数字化转型的深水区,班组4m变更管理已成为保障生产连续性与质量稳定性的核心环节。面对日益复杂的生产环境,企业急需一套成熟的班组4m变更管理系统来应对人员、设备、物料及方法的变动风险。本文将为您带来2026年10大好用班组4m变更管理系统盘点…...
如何快速解决Krita-AI-Diffusion插件安装问题:完整技术指南
如何快速解决Krita-AI-Diffusion插件安装问题:完整技术指南 【免费下载链接】krita-ai-diffusion Streamlined interface for generating images with AI in Krita. Inpaint and outpaint with optional text prompt, no tweaking required. 项目地址: https://gi…...
为什么你的技术演示应该告别手动排版?md2pptx让PPT制作变得简单高效
为什么你的技术演示应该告别手动排版?md2pptx让PPT制作变得简单高效 【免费下载链接】md2pptx Markdown To PowerPoint converter 项目地址: https://gitcode.com/gh_mirrors/md/md2pptx 还在为技术演示的格式调整而头疼吗?md2pptx是一款开源的Ma…...
技术决策框架:避免选择瘫痪
在软件质量保障领域,我们测试工程师常常发现自己置身于一个充满技术选择的十字路口:是引入Selenium还是Cypress进行UI自动化?性能测试该用JMeter还是LoadRunner?API测试框架选RestAssured还是Postman Newman?面对层出不…...
