一次频繁Full GC的排查过程,根源居然是它...

转载自   一次频繁Full GC的排查过程,根源居然是它...

业务部门的一个同事遇到个奇怪的 Full GC 问题,有个服务迁移到新的应用后,一直频繁 Full GC。新应用机器的配置是 4c 8g,老应用是 4c 4g,老应用 GC 都很正常,并且代码没有变更,所以比较奇怪。

现象

问题的现象是,从监控图上看一直有大量的 Full GC

 

排查

遇到这个问题,一般都是先看看各个区的内存占用情况:

 

从监控图上看 Old Gen、Young Gen、Perm Gen,没什么问题,不会触发 Full GC,当然这里看各个 Gen 是否会触发 Full GC 需要结合 JVM 参数配置来看。

顺便也看了下 GC 日志,一直狂暴 CMS GC 日志,而且可以看到老年代使用空间也不大,细心可以发现,大量的 CMS GC 中夹杂着 Young、Perm 区的回收,所以其实是 Full GC。GC 日志如下:

 

老应用的 JVM 参数配置

 

新应用的 JVM 参数配置

 

通过上面的观察,再根据一般触发 CMS GC 几个可能性:

  • Old Gen 使用达到一定的比率,默认为92%,这里看 CMSInitiatingOccupancyFraction=80%,而实际才使用 2%(看监控图表)不到,所以排除这种情况。

  • 配置了 CMSClassUnloadingEnabled,且 Perm Gen 的使用达到一定的比率默认为 92%,这里看 CMSInitiatingPermOccupancyFraction=80%,而实际才使用 30%(看监控图表)不到,所以排除这种情况。

  • 配置了 ExplictGCInvokesConcurrent 且未配置 DisableExplicitGC 的情况下显示调用了 System.gc()。

  • Hotspot 自己根据估计决定是否要触法,如 CMS 悲观策略,这类可以通过 GC 日志分析。

大致判断很可能是 System.gc() 导致的问题,但是怎么定位调用 System.gc() 的代码呢? 当时就想如果是 System.gc() 引起的频繁 Full GC,jstack 线程堆栈应该能看到一些信息,果不其然,确实通过线程堆栈找到了。

jstack 作用非常大,很多问题都能从这里发现,而且比较轻量,对应用基本无影响。某次的 jstack 信息只代表那个时刻的线程堆栈,有时只看一个 jstack 信息可能看不出什么问题,一般可以多 jstack 几次,然后对比去看,基本就能发现一些问题。 当然该问题,也可能不是频繁的 Full GC,可能通过 jstack 定位不到问题,可以 jstat -gccause pid 1000,来查看 gc 原因。

很明显,是由于 jxl 这个包中的 close 方法显示调用了 System.gc() 导致的问题。

跟了下代码,自然确实存在这段代码,不过有个设置开关,可以 disable 这个功能,所以在使用的时候可以设置 setGCDisabled(true),关闭触发 System.gc()。

但是为什么老应用没有问题呢,主要是因为它 -XX:+DisableExplicitGC,屏蔽了 System.gc() 动作,新应用的 JVM 没有这个配置。

可能大家还有个疑问,都知道 System.gc() 会触发 Full GC,那为什么一直进行 CMS GC(通过GC日志)呢? 主要是因为这个参数 -XX:+ExplicitGCInvokesConcurrent,打开此参数后,会做并行 Full GC,只有配置 -XX:+UseConcMarkSweepGC 这个参数,该参数才会生效。因此,System.gc() 时 Old 区会进行 CMS GC,可提高 Full GC 效率。

总结

尽量减少显示使用 System.gc() 来触发 Full GC,这会导致频繁 Full GC,非常影响应用性能。

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

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

相关文章

jzoj1158-荒岛野人【扩欧,gcd,同余方程】

正题 大意 有n个野人,每个野人有一个初始山洞CiCi,每次向前移动距离PiPi,寿命LiLi,如果野人走到了最后一个山洞那么继续就好回到第一个山洞,求至少多少个山洞才可以让野人们不会发生冲突。 解题思路 我们可以枚举答…

.NET Core 2.0 的dll实时更新、https、依赖包变更问题及解决

今天所有开发环境已经迁移到mac OS下的Visual Studio Code 命令行编译发布,而运行服务器是CentOS7,和windows没什么关联了。 只要你Relese编译并在本地有一个与服务器相同的运行环境中运行成功了,迁移到真实服务器不会有什么难度。 下面是迁…

“老师,我写着写着就 强制交卷了……”

大家好,我是雄雄,欢迎关注公众号【雄雄的小课堂】。01暴露出的问题

蚂蚁金服的一次面试经历(一面、二面)

转载自 蚂蚁金服的一次面试经历(一面、二面) 一次有把握的面试,需要经过长时间的准备 电话一面 1、自我介绍、自己做的项目和技术领域 2、项目中的监控:那个监控指标常见的有哪些? 3、微服务涉及到的技术以及需要…

Mybatis案例

1、【microboot项目】修改配置文件,引入所需要的相关依赖库: ext.versions [ // 定义所有要使用的版本号springboot : 2.4.3, // SpringBoot版本号junit : 5.7.1, // 配置JUnit测试工具的版本编号juni…

jzoj1161-机器人M号【欧拉函数,dp】

正题 大意 因为题目比较gou,所以就直接放题目了 机器人1号可以制造其他的机器人。 第2秒,机器人1号造出了第一个机器人——机器人2号。 第3秒,机器人1号造出了另一个机器人——机器人3号。 之后每一秒,机器人1号都可以造出一个新…

张老师讲Python~

大家好,我是雄雄,欢迎关注微信公众号【雄雄的小课堂】。最近我的个人站上线啦,欢迎大家访问http://穆雄雄.com;或者点击文末的“阅读原文”。昨天下午靳老师分享了关于网站部署的内容,今天下午请张炜林上去分享了下他准…

Entity Framework Core 2.0 新特性

一.模型级查询过滤器(Model-level query filters) ef core2.0包含了一个新特性,我们叫他模型级查询过滤器(Model-level query filters)。此特性允许使用Linq查询表达式直接定义在实体类型的元数据模型上。这样的过滤器…

SpringCache与Redis

文章目录SpringCache简介常⽤注解Cacheable自定义CacheManager配置和过期时间自定义缓存KeyGenerator常用注解CachePut 和 CacheEvict多注解组合CachingSpringCache简介 ⽂档:https://spring.io/guides/gs/caching/ ⾃Spring 3.1起,提供了类似于Transact…

激动的时刻,终于成啦~

大家好,我是雄雄,欢迎关注公众号:【雄雄的小课堂】。今天,最令我激动的一件事莫过于倾注一周精力的“在线测试”终于可以投入使用了,周二发过一篇文章,是关于在线测试的问题总结,也就是在周二&a…

C#使用Xamarin开发可移植移动应用(4.进阶篇MVVM双向绑定和命令绑定)附源码

今天的学习内容? 今天我们讲讲Xamarin中的MVVM双向绑定,嗯..需要有一定的MVVM基础.,具体什么是MVVM - -,请百度,我就不多讲了 效果如下: 正文 1.简单的入门Demo 这个时间的功能很简单,就是一个时间的动态显示. 我们首先创建一个基础的页面如下: <?xml version"…

由「Metaspace容量不足触发CMS GC」从而引发的思考

转载自 由「Metaspace容量不足触发CMS GC」从而引发的思考 某天早上&#xff0c;毛老师在群里问「cat 上怎么看 gc」。 好好的一个群 看到有 GC 的问题&#xff0c;立马做出小鸡搓手状。 之后毛老师发来一张图。 老年代内存占用情况 图片展示了老年代内存占用情况。 第一个…

P1040,jzoj1167-加分二叉树【树形dp】

前言 没有SPJ坑了我好久qwq 正题 测试连接&#xff1a;https://www.luogu.org/recordnew/lists?uid52918&pidP1040 大意 一颗二叉树的中序遍历是1,2,3...n−2,n−1,n1,2,3...n−2,n−1,n然后给出每个点的值aiai&#xff0c;每个点的分数是 sislsonsrsonaisislsonsrsona…

是现在的钱不值钱还是药太贵!

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号【雄雄的小课堂】。莫名其妙的就感觉身体不舒服&#xff0c;然后越来越严重&#xff0c;打小以来还是第一次遇见这样的&#xff0c;你说是感冒吧&#xff0c;它也不流鼻涕&#xff0c;喉咙也不痛&#xff0c;鼻子也通…

P3951,jzoj5473-小凯的疑惑【数论】(NOIP2017提高组)

#正题 评测记录&#xff1a; https://www.luogu.org/recordnew/show/8283818 大意 两个币值&#xff08;互质正整数&#xff09;&#xff0c;求不能完全&#xff08;需要找零&#xff09;的最贵的东西。 解题思路 首先众所周知axbyc而且a和b互质的正整数&#xff0c;c为正整数…

一次堆外内存泄露的排查过程

转载自 一次堆外内存泄露的排查过程 最近在做一个基于 websocket 的长连中间件&#xff0c;服务端使用实现了 socket.io 协议&#xff08;基于websocket协议&#xff0c;提供长轮询降级能力&#xff09; 的 netty-socketio 框架&#xff0c;该框架为 netty 实现&#xff0c;鉴…

.NET Core 2.0 特性介绍和使用指南

前言 这一篇会比较长&#xff0c;介绍了.NET Core 2.0新特性、工具支持及系统生态&#xff0c;现状及未来计划&#xff0c;可以作为一门技术的概述来读&#xff0c;也可以作为学习路径、提纲来用。 对于.NET Core 2.0的发布介绍&#xff0c;围绕2.0的架构体系&#xff0c;我想…

Lombok MyBatisX

Lombok的使用 [1] 什么是LomBok lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具&#xff0c;简单来说&#xff0c;比如我们新建了一个类&#xff0c;然后在其中写了几个属性&#xff0c;然后通常情况下我们需要手动去建立g…

希望尽快好起来吧~

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号【雄雄的小课堂】。莫名其妙的生病&#xff0c;每天睡觉之前都在祷告&#xff0c;睡一觉明天早上就好了&#xff0c;结果第二天非但没有好&#xff0c;反而还加重了。买的药吃了也无济于事&#xff0c;还渐渐的开始发烧……

2018/7/9-纪中某B组题【jzoj1503,jzoj1158,jzoj1161】

正题 T1&#xff1a;jzoj1503-体育场【带权并查集】 博客链接&#xff1a;https://blog.csdn.net/mr_wuyongcong/article/details/80969720 T2&#xff1a;jzoj1158-荒岛野人【扩欧,gcd,同余方程】 博客链接&#xff1a;https://blog.csdn.net/mr_wuyongcong/article/details…