JVM虚拟机系统性学习-JVM调优之通过gceasy分析GC日志对堆、元空间、线程堆栈和垃圾回收器进行调优

通过 gceasy工具对生成的 GC 日志进行分析

这里使用的 JDK 版本为 JDK8!

在分析 GC 日志时,可以同时采用多种工具(Arthas、gceasy、JVM 连接 Graphana 监控)进行分析,避免某种工具分析不准确

gceasy 每个月只可以免费分析 5 个 gc 日志,因此要节约机会!hhh!

我们先将 gc.log 文件放入 gceasy 中进行分析,分析结果如下:

首先是 JVM 内存大小,可以看到新生代分配了 624 mb,而 Peak 也就是峰值也达到了 624 mb,说明新生代很容易就被占满了,而对于元空间 Meta Space 来说,分配了 1 个 gb,而峰值才使用了 59 mb,因此元空间分配的大小也不合理,对于 JDK8 来说,如果不指定元空间的大小,默认元空间的最大值是系统内存的大小,在 64 位操作系统中,元空间默认初始值为 21MB,如果初始未给定的元空间的大小,导致初始元空间过小,会 频繁触发 Full GC 来调高元空间大小

在这里插入图片描述

接下来看一些关键的性能指标,可以看到 Avg Pause GC Time 也就是平均 GC 时间为 10 ms,最大 GC 时间为 190 ms,这些参数目前看来也正常,没有出现过长的 GC 时间

在这里插入图片描述

接下来看一下 GC 持续时间的一些情况,可以看到在系统刚开始就发生了几次 Full GC,这是很严重的问题,可以看到这三次 Full GC 产生的原因分别是:Metadata GC ThreasholdErgonomics,即元空间超过阈值,Ergonomics 的含义是自动调节 GC 暂停时间和吞吐量从而产生的 GC,是虚拟机中对性能的优化,那么因为 Ergonomics 产生的 GC 我们可以不管,总结一下这几次 Full GC 产生的原因就是 元空间超过阈值!

在这里插入图片描述

最后我们可以看一下 GC 的指标,可以看到 Full GC 总共发生了 6 次,还是比较多的,需要控制一下 Full GC 的次数,因为 Full GC 对系统性能影响是比较大的

在这里插入图片描述

上边我们已经通过 gceasy 分析了 gc 日志了,存在的问题主要有以下几点:

  • Meta Space 空间分配不合理
  • Full GC 产生次数过多
堆和元空间优化

那么优化参数我们从 堆空间元空间新生代 3 个方面进行入手,参数调整如下:

-Xms1096m -Xmx1096m -Xmn408m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m
  • 堆空间通过 -Xms -Xmx 来进行调整,为了尽量避免 Full GC,堆空间可以设置为 Full GC 后老年代空间占用的 3-4 倍 ,这样的话一般可以避免老年代空间不足从而导致 Full GC 的情况,最好设置为 8 的整数倍,我们通过上边 easygc 分析中的 JVM Memory Size 得知,老年代的峰值为 274mb,因此这里设置堆空间大小为 274 * 4 = 1096 mb,设置堆空间为 Full GC 后老年代对象的 4 倍大小
  • 元空间通过 -XX:MetaspaceSize=N 来设置,这里设置元空间大小为 128 mb
  • 新生代通过 -Xmn 来设置,新生代可以设置为 Full GC 后老年代空间占用的 1-1.5 倍 ,即 274 * 1.5 = 411 mb,最好设置为 8 的整数倍,因此改为 408 mb

可以看到优化后,JVM 内存的使用更加合理了,新生代也没有超过分配的内存大小,如下图:

在这里插入图片描述

并且 Full GC 的次数为 0

在这里插入图片描述

这里需要注意的是,如果使用 Docker 部署的 java 应用,可以在 Dockerfile 中设置 JVM 的参数,并且在启动的时候,尽量去将 JVM 参数打印出来,确保设置的参数生效!

线程堆栈优化

上边对 JVM 中的堆和方法区的大小进行了优化,接下来看一下如何对 JVM 中的线程堆栈进行优化

JDK5.0 后每个线程堆栈大小为 1M,在相同物理内存下,线程堆栈越小,就能生成更多的线程,但是操作系统对一个进程内的线程数量还是有限制的,如果堆栈不是很深可以设置 256k,如果是很大的应用可以使用 512k

对于平常的系统来说,是不需要进行线程堆栈的优化的,但是如果开发一些中间件的话,需要创建出很多的线程,那么对于线程堆栈的优化还是比较有必要的,线程堆栈大小设置通过 -Xss 进行设置

-Xms1096m -Xmx1096m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xss512k
垃圾回收器组合优化
  • 吞吐量优先:Parallel Scavenge + ParallelOldGC
  • 响应时间优先(低延迟):ParNew + CMS
G1 垃圾回收器

G1 兼顾了吞吐量和响应时间,尤其在大内存的情况下比较好,配置 G1 只需要 3 步:

  1. 开启 G1 垃圾收集器
  2. 设置堆内存
  3. 设置最大的停顿时间
 # 设置堆、元空间大小-Xms256m -Xmx256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xss512k# 开启 G1-XX:+UseG1GC -XX:MaxGCPauseMillis=100# 开启 GC 日志创建更详细的 GC 日志-XX:+PrintGCDetails -XX:+PrintGCTimeStamps,-XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:./logs/gc.log

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

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

相关文章

未来应用从何而来:认知力延伸、边界突破、回归云与产业

文 | 智能相对论 作者 | 沈浪 或许,谁也没想到未来应用来的如此之快,现如今传统应用从开发到体验,已经进入了一个前所未有的颠覆性改革阶段。 不久前,美国人工智能公司OpenAI举办开发者大会。在现场,公司创始人Sam …

7+m6A+分型+实验,甲基化方向的生信思路,没有思路的同学可参考

今天给同学们分享一篇生信文章“Landscape analysis of m6A modification regulators related biological functions and immune characteristics in myasthenia gravis”,这篇文章发表在J Transl Med期刊上,影响因子为7.4。 结果解读: MG相…

浅谈MapReduce

MapReduce是一个抽象的分布式计算模型,主要对键值对进行运算处理。用户需要提供两个自定义函数: map:用于接受输入,并生成中间键值对。reduce:接受map输出的中间键值对集合,进行sorting后进行合并和数据规…

AI日报:谷歌Gemini Pro即将面向企业和开发者

文章目录 总览Gemini介绍 模型能力产品API其他产品Imagen2和其他新闻Duet AI 总览 现在,您可以免费访问Gemini Pro的API,这是谷歌最新大型语言模型的第一个版本。 Gemini 介绍 谷歌通过其API让企业和开发者第一次看到了其最强大的大型语言模型Gemini。…

NXP应用随记(四):eMios阅读随记-整体功能概述

目录 1、eMios IP介绍 2、时钟结构 3、通道类型 4、功能介绍 5、中断与DMA 6、EMIOS -通道分配建议(针对S32K312) 1、eMios IP介绍 Emios是什么?eMIOS提供了独立的通道(UCs),您可以配置这些通道来为不同的功能生成或测量时间事件。 每个eMIOS实例最…

上海亚商投顾:沪指再度失守3000点 北向资金净卖出近百亿

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 三大指数昨日集体调整,尾盘均跌超1%,北证50则逆势拉升涨超3%。医药股逆势走强&#xf…

文件操作2❤

一:文件的顺序读写 1:顺序读写函数 函数名 功能 适⽤于 fgetc 字符输⼊函数 所有输⼊流 fputc 字符输出函数 所有输出流 fgets ⽂本⾏输⼊函数 所有输⼊流 fputs ⽂本⾏输出函数 所有输出流 fscanf 格式化…

linux高级管理——LAMP平台部署及应用

一、认识LAMP: 在LAMP平台的四个构成组件中,每个组件都承担着一部分关键应用。经过十几年的发展,各组件间的兼容性得到了不断的完善.协作能力和稳定性也不断增强,可以构建出非常优秀的Web应用系统。各组件的主要作用如…

L1-044:稳赢

题目描述 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示: 现要求你编写一个稳赢不输的程序,根据对方的出招,给出对应的赢招。但是!为了不让对方输得太惨,你需要每隔K次…

基于ssm的“游侠”旅游信息管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本“游侠”旅游信息管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的…

深度学习 Day14——P3天气识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 文章目录 前言1 我的环境2 代码实现与执行结果2.1 前期准备2.1.1 引入库2.1.2 设置GPU(如果设备上支持GPU就使用GPU,否则使用C…

JMeter逻辑控制器

JMeter逻辑控制器 一、IF控制器1、作用2、步骤 二、循环控制器1、作用2、步骤3、线程组和循环控制器的区别? 三、ForEach控制器1、作用2、步骤 一、IF控制器 1、作用 **控制下面的测试元素是否执行**2、步骤 添加线程组用户定义的变量添加if控制器,判断…