千家信息网

JAVA GC日志的相关知识有哪些

发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,本篇内容主要讲解"JAVA GC日志的相关知识有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"JAVA GC日志的相关知识有哪些"吧!GC环境模拟首先
千家信息网最后更新 2025年02月23日JAVA GC日志的相关知识有哪些

本篇内容主要讲解"JAVA GC日志的相关知识有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"JAVA GC日志的相关知识有哪些"吧!

GC环境模拟

首先我们给出如下代码用来触发GC

public static void main(String[] args) {// 每100毫秒创建100线程,每个线程创建一个1M的对象,即每100ms申请100M堆空间Executors.newScheduledThreadPool(1).scheduleAtFixedRate(() -> {for (int i = 0; i < 100; i++) {new Thread(() -> {try {// 申请1Mbyte[] temp = new byte[1024 * 1024];Thread.sleep(new Random().nextInt(1000)); // 随机睡眠1秒以内} catch (InterruptedException e) {e.printStackTrace();}}).start();}}, 1000, 100, TimeUnit.MILLISECONDS);}

我们要模拟的场景是年轻代不断地Young GC,并有一部分对象晋升到老年代,当老年代空间不足时触发Full GC。

程序逻辑:每100毫秒钟创建100个线程,每个线程创建一个1M的对象,即每100ms申请100M堆空间。之所以每个线程随机睡眠1s,是为了避免对象朝生夕灭,保证可以有一部分对象能晋升到老年代,更好的触发Young GC 和 Full GC,注意这个睡眠时间如果大了,会导致OOM,如果小了,很难触发FULL GC。

虚拟机参数解释

启动Java进程:java -Xms200m -Xmx200m -Xmn100m -verbose:gc -XX:+PrintGCDetails -Xloggc:./gc.log -XX:+PrintGCDateStamps -jar demo-0.0.1-SNAPSHOT.jar

-Xms200m -Xmx200m 最小/最大堆内存 200M

-Xmn100m 年轻代内存 100M

-verbose:gc 开启GC日志

-XX:+PrintGCDetails -Xloggc:./gc.log -XX:+PrintGCDateStamps 将GC日志详情输入到gc.log中

jmap分析

jcmd 获取我们Java进程的Id:6264

jmap -heap 6264查看堆信息

第一次查看,我们发现 Eden区是98M,S0、S1是1M

第二次查看, Eden区是99M,S0、S1是0.5M

Eden区与Survivor区的比例在动态的变化,并不是默认的8:1:1。

原来我们使用默认的垃圾收集器Parallel Scavenge+Parallel Old组合,而该收集器下-XX:+UseAdaptiveSizePolicy是默认开启的,即Eden区与Survivor区比例根据GC情况会自适应变化。

我们加上参数,关闭年轻代自适应,年轻代比例设置为8:1:1

-XX:-UseAdaptiveSizePolicy -XX:SurvivorRatio=8

另外为了尽早的触发FULL GC,我们新增虚拟机参数

-XX:MaxTenuringThreshold=10

晋升年龄由默认的15修改为10,使得年轻代的对象更容易晋升到老年代

重启虚拟机查看jmap

年轻代

Eden区80M 已使用51M,当前使用率63.8% S0区10M 已使用0.43M,使用率4.37% S1区10M 使用率为空

老年代

100M 已使用18.39M,使用率18.9%

GC日志内容分析

查看我们输出的GC日志gc.log,选取其中两段

2019-06-09T02:55:30.993+0800: 330.811: [GC (Allocation Failure) [PSYoungGen: 82004K->384K(92160K)] 184303K->102715K(194560K), 0.0035647 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]2019-06-09T02:55:30.997+0800: 330.815: [Full GC (Ergonomics) [PSYoungGen: 384K->0K(92160K)] [ParOldGen: 102331K->5368K(102400K)] 102715K->5368K(194560K), [Metaspace: 16941K->16914K(1064960K)], 0.0213953 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]

Young GC

2019-06-09T02:55:30.993+0800: 330.811: [GC (Allocation Failure) [PSYoungGen: 82004K->384K(92160K)] 184303K->102715K(194560K), 0.0035647 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]2019-06-09T02:55:30.997+0800: 330.815: [Full GC (Ergonomics) [PSYoungGen: 384K->0K(92160K)] [ParOldGen: 102331K->5368K(102400K)] 102715K->5368K(194560K), [Metaspace: 16941K->16914K(1064960K)], 0.0213953 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]

解释:

年轻代GC:[GC前年轻代80.08M->GC后0.37M(年轻代总大小90M)]GC前堆179.98M->GC后堆100.3M(堆总大小190M),用时] 其中年轻代总大小是90M而不是100M,这里我理解是年轻代当前最大申请到90M 100M*80%=80M 是Eden区大小 80M*80% = 64M Eden区默认占用超过8成即64M就会触发YoungGC

Full GC

[Full GC (Ergonomics) [PSYoungGen: 384K->0K(92160K)] [ParOldGen: 102331K->5368K(102400K)] 102715K->5368K(194560K), [Metaspace: 16941K->16914K(1064960K)], 0.0213953 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]

解释:

[GC前年轻代0.375M->GC后年轻代0M(年轻代总大小90M)][GC前老年代99.93M->GC后老年代5.24M(老年代总大小100M)]GC前堆100.3M->GC后堆5.24M(堆总大小190M),[元数据区:GC前16.5,GC后16.5(元数据区总大小1040M)],用时] 可以推测出此次FullGC原因是年轻代晋升老年代空间不足导致

利用可视化工具分析

这里我们利用 gceasy.io/ 分析一下

(1)统计年轻代、老年代、元数据区最大可用空间以及峰值,这里元数据区大小在我们的虚拟机参数没有配置,所以取的是默认值

(2)吞吐量、GC平均延迟、最大延迟以及延迟区间的统计

(3)堆所用大小的实时分析,红色位置是发生了FullGC使得堆总量直线下降

会发现虚拟机在刚启动不久的阶段触发大量的FULL GC,我的理解是我们申请的对象都随机睡眠一秒以内,刚启动时大部分还存在线程的引用,GCRoot可达。在刚启动的时候触发FULL GC并不会完整清理掉老年代空间并由于空间不足不断触发FULL GC。

(4)GC空间总量和时间的统计

(5)各类GC时间、GC次数、GC总量等指标

到此,相信大家对"JAVA GC日志的相关知识有哪些"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

年轻 年代 大小 空间 日志 对象 线程 分析 晋升 使用率 参数 数据 睡眠 知识 最大 内容 总量 时间 比例 延迟 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 服务器管理能力是什么 订货下单软件开发 liunx服务器安全加固 民政局数据库登记贫困困境儿童 安庆保险软件开发哪家好 网络安全网贷发生后除置程序结构 国外学术数据库怎么搜期刊 网络数据库属于几次信息 汽车网络技术的发展趋势结论 深圳oem网络安全工厂 青岛OA软件开发招聘 同城游 麻将 软件开发 502错误是服务器问题吗 数据库里如何分离数据库 机关网络安全管理制度 db2退出数据库连接命令 淘宝推广属于网络技术 数据库第一章动画 局域网如何设置服务器账号密码 中国国家网络安全100强 数据库的日期类型转换 sql教程之备份数据库 开发的程序必须上传服务器吗 党委主要负责人 网络安全 计算机网络技术专业弱势和优势 网络安全官歌曲 服务器开机黑屏显示在运行 长宁区推广数据库系统研发职能 怎么编制简单的数据库应用程序 服务器推出
0