JVM调优的GC日志观察解读

如果各项参数设置合理,系统没有超时日志出现,GC 频率不高,GC 耗时不高,那么没有必要进行 GC 优化
如果 GC 时间超过 1-3 秒,或者频繁 GC,则必须优化。

一、参数解读

  1. Jvm 调优典型参数设置;
    -Xms: 堆内存的最小值 :默认情况下,当堆中可用内存小于 40%时,堆内存会开始增加,一直增加到-Xmx 的大小。
    -Xmx :堆内存的最大值:默认值是总内存/64(且小于 1G),默认情况下,当堆中可用内存大于 70%时,堆内存会开始减少,一直减小到-Xms的大小;
    -Xmn: 新生代内存的最大值:包括 Eden 区和两个 Survivor 区的总和,配置写法如:-Xmn1024k,-Xmn1024m,-Xmn1g
    -Xss: 每个线程的栈内存:默认 1M,一般来说是不需要改。线程栈越小意味着可以创建的线程数越多

整个堆的大小 = 年轻代大小 + 年老代大小,堆的大小不包含元空间大小,如果增大了年轻代,年老代相应就会减小,官方默认的配置为年老代大小/年轻代大小=2/1 左右;
建议在开发测试环境可以用 Xms 和 Xmx 分别设置最小值最大值,但是在线上生产环境,Xms 和 Xmx 设置的值必须一样,防止抖动;

  1. GC 日志
    -XX:+PrintGCDetails 开启 GC 日志创建更详细的 GC 日志 ,默认情况下,GC 日志是关闭的
    -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps :开启 GC 时间提示
    开启时间便于我们更精确地判断几次 GC 操作之间的时两个参数的区别
    时间戳是相对于 0 (依据 JVM 启动的时间)的值,而日期戳(date stamp)是实际的日期字符串
    由于日期戳需要进行格式化,所以它的效率可能会受轻微的影响,不过这种操作并不频繁,它造成的影响也很难被我们感知。
    -XX:+PrintHeapAtGC 打印堆的 GC 日志
    -Xloggc:./logs/gc.log 指定 GC 日志路径

  2. jdk11的gc日志打印
    -Xlog:gc*:file=gc.log:time,uptime,pid,tid,tags:filecount=5,filesize=10M

gc.log是日志打印位置

二、打印日志出来

package com.zhk.study.log;import java.util.ArrayList;
import java.util.List;//测试代码
public class TestHeap {public static void main(String[] args) {List<Heap> list = new ArrayList<Heap>();while (true) {list.add(new Heap());}}
}class Heap {String HeapName = "Java Heap 测试";
}

1.jdk8

配置jvm参数
在这里插入图片描述

-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+PrintHeapAtGC
-Xloggc:E:/gc-default.log

在这里插入图片描述

在这里插入图片描述

  1. 日志解读
2022-08-05T13:45:23.336+0800: 4.866: [GC (Metadata GC Threshold) [PSYoungGen: 136353K->20975K(405504K)] 160049K->48437K(720384K), 0.0092260 secs] [Times: user=0.00 sys=0.02, real=0.02 secs]
2022-08-05T13:45:23.336+0800: 本次GC发生时间
4.866: 举例启动应用的时间
[GC【表示GC的类型,youngGC】 (Metadata GC Threshold) 元空间超阈值
[PSYoungGen: 136353K->20975K(405504K年轻代总空间)] 160049K->48437K(720384K)整堆), 0.0092260 secs本次垃圾回收耗时]
[Times: user=0.00本次GC消耗CPU的时间 sys=0.02系统暂停时间, real=0.02 secs实际应用暂停时间]
  1. FullGC 日志含义
2022-08-05T20:24:47.815+0800: 6.955: [Full GC (Metadata GC Threshold) [PSYoungGen: 701K->0K(72704K)] [ParOldGen: 38678K->35960K(175104K)] 39380K->35960K(247808K), [Metaspace: 56706K->56706K(1099776K)], 0.1921975 secs] [Times: user=1.03 sys=0.00, real=0.19 secs]
2022-08-05T20:24:47.815+0800:
6.955: 刚启动服务就Full GC【整堆回收!!】[Full GC (Metadata GC Threshold) Metaspace空间超限!
[PSYoungGen: 701K->0K(72704K)] 年轻代没有回收空间
[ParOldGen: 38678K->35960K(175104K)] 39380K->35960K(247808K), 老年代也没有到阈值,整堆更没有到阈值
[Metaspace: 56706K->56706K(1099776K)], 0.1921975 secs]
[Times: user=1.03本次GC消耗CPU的时间 sys=0.00系统暂停时间, real=0.19 secs实际应用暂停时间]

2、jdk11默认G1回收

启动参数修改为

-Xlog:gc*:file=gc.log:time,uptime,pid,tid,tags:filecount=5,filesize=10M

在这里插入图片描述

  1. 日志解读
[2023-09-14T11:38:32.994+0800][0.017s][12940][11992][gc,heap] Heap region size: 1M
[2023-09-14T11:38:33.001+0800][0.024s][12940][11992][gc     ] Using G1
[2023-09-14T11:38:33.001+0800][0.024s][12940][11992][gc,heap,coops] Heap address: 0x0000000701c00000, size: 4068 MB, Compressed Oops mode: Zero based, Oop shift amount: 3
[2023-09-14T11:38:33.201+0800][0.225s][12940][8148 ][gc,start     ] GC(0) Pause Young (Normal) (G1 Evacuation Pause)
[2023-09-14T11:38:33.202+0800][0.225s][12940][8148 ][gc,task      ] GC(0) Using 3 workers of 3 for evacuation
[2023-09-14T11:38:33.215+0800][0.238s][12940][8148 ][gc,phases    ] GC(0)   Pre Evacuate Collection Set: 0.0ms
[2023-09-14T11:38:33.215+0800][0.238s][12940][8148 ][gc,phases    ] GC(0)   Evacuate Collection Set: 12.7ms
[2023-09-14T11:38:33.215+0800][0.239s][12940][8148 ][gc,phases    ] GC(0)   Post Evacuate Collection Set: 0.2ms
[2023-09-14T11:38:33.215+0800][0.239s][12940][8148 ][gc,phases    ] GC(0)   Other: 0.3ms
[2023-09-14T11:38:33.215+0800][0.239s][12940][8148 ][gc,heap      ] GC(0) Eden regions: 12->0(10)
[2023-09-14T11:38:33.215+0800][0.239s][12940][8148 ][gc,heap      ] GC(0) Survivor regions: 0->2(2)
[2023-09-14T11:38:33.215+0800][0.239s][12940][8148 ][gc,heap      ] GC(0) Old regions: 0->7
[2023-09-14T11:38:33.215+0800][0.239s][12940][8148 ][gc,heap      ] GC(0) Humongous regions: 4->4
[2023-09-14T11:38:33.215+0800][0.239s][12940][8148 ][gc,metaspace ] GC(0) Metaspace: 6551K->6551K(1056768K)
[2023-09-14T11:38:33.215+0800][0.239s][12940][8148 ][gc           ] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 16M->12M(256M) 14.012ms
[2023-09-14T11:38:33.215+0800][0.239s][12940][8148 ][gc,cpu       ] GC(0) User=0.03s Sys=0.02s Real=0.01s

这段日志描述了Java应用程序的垃圾收集事件的详细信息。让我解释一下每个部分的含义:
[2023-09-14T11:38:32.994+0800] - 这是时间戳,表示日志记录的时间。

[0.017s] - 这是相对于日志记录的时间的时间戳,表示日志记录发生的相对时间。

[12940][11992] - 这两个数字可能是线程的标识符,用于标识执行垃圾收集的线程。

[gc,heap] Heap region size: 1M - 这表示Java堆的分区大小为1MB。

[gc] Using G1 - 这表示Java使用了G1垃圾收集器。

[gc,heap,coops] Heap address: 0x0000000701c00000, size: 4068 MB, Compressed Oops mode: Zero based, Oop shift amount: 3 - 这描述了Java堆的地址、大小以及压缩指针(Compressed Oops)的信息。

[gc,start] GC(0) Pause Young (Normal) (G1 Evacuation Pause) - 这是垃圾收集事件的开始,GC(0) 表示第0次垃圾收集,Pause Young (Normal) (G1 Evacuation Pause) 表示这是一次Young代正常的G1垃圾收集事件。

[gc,task] GC(0) Using 3 workers of 3 for evacuation - 这表示在这次垃圾收集事件中,有3个工作线程用于执行对象的迁移。

[gc,phases] - 这一系列的行描述了垃圾收集的不同阶段,包括 Pre Evacuate Collection Set、Evacuate Collection Set、Post Evacuate Collection Set 等。

[gc,heap] - 这行提供了有关堆内存的信息,包括Eden、Survivor、Old、Humongous等区域的变化。

[gc,metaspace] - 这行提供了有关元数据空间(Metaspace)的信息,包括它的大小变化。

[gc] Pause Young (Normal) (G1 Evacuation Pause) 16M->12M(256M) 14.012ms - 这行提供了垃圾收集事件的摘要信息,包括收集前后的堆内存使用量变化,以及事件的持续时间。

[gc,cpu] - 这行提供了垃圾收集事件的CPU占用情况。

总的来说,这些日志记录提供了关于Java应用程序中垃圾收集事件的详细信息,包括时间戳、线程标识、垃圾收集器类型、堆内存情况以及事件持续时间等。这些信息对于分析和调整Java应用程序的性能非常有用。

三、优化

优化垃圾回收性能通常需要仔细分析应用程序的行为和垃圾回收日志,然后根据分析的结果采取相应的措施。以下是一些可能的优化建议,但请注意,具体的优化策略会根据应用程序的需求和行为而变化:

  • 分析垃圾回收模式:首先要了解应用程序的垃圾回收模式。从日志中可以看出,这里使用的是G1(Garbage-First)垃圾回收器。不同的垃圾回收器适用于不同的应用程序,因此确保选择了最适合应用程序需求的回收器是很重要的。

  • 调整堆大小:根据应用程序的需求,可能需要调整堆大小(-Xms 和 -Xmx 参数)。如果应用程序频繁触发垃圾回收,可能需要增加堆大小以减少回收的频率。但要注意,堆大小的过分增加也可能导致长时间的垃圾回收停顿,因此需要谨慎调整。

  • 分析垃圾回收暂停时间:从日志中可以看到每次Young区和Mixed区垃圾回收的停顿时间。优化的目标是减少这些停顿时间,以提高应用程序的响应性。可以使用参数来控制垃圾回收暂停时间,例如使用 -XX:MaxGCPauseMillis 参数。

  • 分析内存分配模式:查看日志中的Eden、Survivor和Old区的分配情况。如果发现频繁的对象进入Old区,可能需要调整各个区域的大小或者调整年轻代的比例,以减少对象在Old区的存活时间。

  • 检查Metaspace使用:从日志中可以看到Metaspace的使用情况。如果Metaspace的使用不断增长,可能需要增加Metaspace的大小或者检查是否有类加载器泄漏。

  • 分析对象生命周期:了解应用程序中对象的生命周期模式,可以帮助确定何时进行垃圾回收。如果对象的生命周期很短,可以采用更侧重于Young区的策略。如果对象生命周期很长,需要确保Old区的管理足够高效。

  • 监控和调整:使用性能监控工具和垃圾回收日志持续监控应用程序的性能。如果发现性能问题,可以根据实时数据来调整垃圾回收参数。

  • 并行和并发:根据应用程序的特性,可以选择并行垃圾回收或并发垃圾回收。并行回收器适用于多核系统,而并发回收器适用于需要最小停顿时间的应用程序。

  • 分析吞吐量:了解应用程序的吞吐量需求,可以选择适当的垃圾回收策略。某些垃圾回收器更适合高吞吐量,而某些回收器更适合低停顿时间。

  • 版本升级:考虑将JVM版本升级到最新的稳定版本,因为新版本通常会带来性能和垃圾回收方面的改进。

综上所述,优化垃圾回收性能是一个复杂的过程,需要深入了解应用程序的行为和需求。建议在开发和测试环境中进行多次测试和调整,以找到最佳的垃圾回收配置。同时,密切关注生产环境中的性能指标,以及随着应用程序负载变化而进行必要的调整。

四、gc次数判断

gc次数

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

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

相关文章

VMware vCenter 从6.7跨版本升级至7.0U3N

本文尝试使用 vCenter Server Appliance 管理界面 (VAMI) 进行对vCenter Server Appliance7应用进行小版本升级&#xff0c;从6.7.0.47000升级到7.0.3.01600&#xff08;7.0U3N&#xff09;。 一、升级前的准备工作 1、检查当前运行环境&#xff08;当前为6.7.0.47000&#x…

【办公自动化】用Python批量从上市公司年报中获取主要业务信息

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

软件测试行业已经卷到什么程度了?

近几个月经常听到IT行业的人员吐槽找工作难的事情&#xff0c;特别是找软件测试工作相比前几年难了很多&#xff0c;以前只要简历一挂网上&#xff0c;每天会接到好多个面试邀请电话&#xff0c;甚至两三天或者一周内就能把工作找好&#xff0c;而现在把简历投了个遍&#xff0…

在Linux上利用宝塔面板搭建网站,并通过内网穿透方便地实现公网访问

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板&#xff0c;它支持Linux/Windows系统&#xff0c;我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

IDEA报错:No valid Maven installation found

当我想要用maven进行clean的时候&#xff0c;发现报了这个错误&#xff0c;idea的event logs记录为 网上又说可能是因为你的maven环境没有配置好&#xff0c;我对我的maven进行了检查&#xff0c;发现是没有问题的&#xff0c;在这里提醒大家&#xff0c;如果你以前的项目maven…

计算机竞赛 机器视觉opencv答题卡识别系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 答题卡识别系统 - opencv python 图像识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分…

ChatGPT新增超强插件:文本直接生成视频、海报,支持自定义修改!

全球著名在线设计平台Canva&#xff0c;在ChatGPT Plus&#xff08;GPT-4&#xff09;上推出了插件功能&#xff0c;用户通过文本提示&#xff0c;几秒钟就能生成演示文稿、PPT插图、电子书封面、宴会邀请函等各种精美设计海报&#xff0c;同时支持生成视频。 该插件最强大的功…

爬虫系统的核心:如何创建高质量的HTML文件?

在网页抓取或爬虫系统中&#xff0c;HTML文件的创建是一项重要的任务。HTML文件是网页的基础&#xff0c;包含了网页的所有内容和结构。在爬虫系统中&#xff0c;我们需要生成一个HTML文件&#xff0c;以便于保存和处理网页的内容。 在这种情况下&#xff0c;可以使用Java函数…

Zebec 生态 AMA 回顾:Nautilus 以及 $ZBC 的未来

在9月7日&#xff0c;Zebec创始人Sam做客社区&#xff0c;并进行了“Nautilus Chain以及$ZBC的未来”主题的AMA访谈。Sam在本次访谈中对Nautilus Chain生态的价值捕获、Zebec生态布局规划、可能会推出的Nautilus Chain治理通证NAUT进行了解读。本文将对本次AMA进行回顾与总结。…

城市内涝监测预警系统:有效降低内涝风险,保障城市安全

近日&#xff0c;受台风“海葵”的影响&#xff0c;福建广东多地遭遇了持续性强降雨的袭击&#xff0c;道路积水严重&#xff0c;“城市看海”模式再次开启&#xff0c;不少网友纷纷调侃房子已经升级为海景房。近年来受极端天气影响&#xff0c;城市内涝灾害越发凸显&#xff0…

0015Java程序设计-springboot美食网站

摘 要目 录**绪论**1.1背景及意义1.2 国内外研究概况1.3 研究的内容 开发环境 摘 要 随着移动应用技术的发展&#xff0c;越来越多的用户借助于移动手机、电脑完成生活中的事务&#xff0c;许多的传统行业也更加重视与互联网的结合。 本论文主要介绍基于java的美食网站&#…

Jmeter安装与测试

目录 一&#xff1a;JMeter简介&#xff1a; 二&#xff1a;JMeter安装与配置 三&#xff1a;JMeter主要原件 一&#xff1a;JMeter简介&#xff1a; JMeter&#xff0c;一个100&#xff05;的纯Java桌面应用&#xff0c;由Apache组织的开放源代码项目&#xff0c;它是功能 …

VoxWeekly|The Sandbox 生态周报|20230911

欢迎来到由 The Sandbox 发布的《VoxWeekly》。我们会在每周发布&#xff0c;对上一周 The Sandbox 生态系统所发生的事情进行总结。 如果你喜欢我们内容&#xff0c;欢迎与朋友和家人分享。请订阅我们的 Medium 、关注我们的 Twitter&#xff0c;并加入 Discord 社区&#xf…

gif动画如何快速生成?教你几步快速搞定gif制作

gif动画图片已经充斥着我们的日常生活&#xff0c;它的画面丰富生动&#xff0c;且易于传播和保存。平时工作时也能用到&#xff0c;特别是需要有操作演示的时候&#xff0c;就可以把演示的视频做成gif动图。通过使用【GIF中文网】这款gif动画制作&#xff08;https://www.gif.…

C++项目实战——基于多设计模式下的同步异步日志系统-②-前置知识补充-不定参函数

文章目录 专栏导读不定参函数C风格不定参函数不定参宏函数 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师&#xff0c;阿里云专家博主&#xff0c;CSDN内容合伙人…致力于 C/C、Linux 学…

idea启动缓慢解决办法

idea启动缓慢解决办法 文章目录 idea启动缓慢解决办法前言一、修改内存大小二、虚拟机运行大小三、插件禁用1、安卓相关2、构建工具3、Code Coverage 代码覆盖率4、数据库5、部署工具6、html和xml7、ide settings8、JavaScript框架和工具9、jvm框架10、Keymap快捷键映射11、kot…

ChatGPT帮助一名儿童确诊病因,之前17位医生无法确诊

9月13日&#xff0c;Today消息&#xff0c;一位名叫Alex的4岁儿童得了一种浑身疼痛的怪病&#xff0c;每天需要服用Motrin&#xff08;美林&#xff09;才能止痛。3年的时间&#xff0c;看了17名医生无法确诊病因。&#xff08;新闻地址&#xff1a;https://www.today.com/heal…

java使用itext生成pdf

效果&#xff1a; maven依赖 <!--PDF处理--><!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</vers…

【Unity3D赛车游戏优化篇】【十】汽车粒子特效和引擎咆哮打造极速漂移

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

jdk 中的 keytool 的使用,以及提取 jks 文件中的公钥和私钥

这里暂时只需要知道如何使用就可以了。 首先是生成一个密钥&#xff0c; keytool -genkeypair -alias fanyfull -keypass ffkp123456 -validity 365 -storepass ffsp123456 -keystore fanyfull.jks -keyalg RSA解释一下这里的选项&#xff0c; -alias 密钥对的名称-keypass …