建品牌网站公司中国空间站扩展
web/
2025/10/1 19:47:46/
文章来源:
建品牌网站公司,中国空间站扩展,百度小程序开发教程,网站如何做查询表单转载自 一次频繁Full GC的排查过程#xff0c;根源居然是它...
业务部门的一个同事遇到个奇怪的 Full GC 问题#xff0c;有个服务迁移到新的应用后#xff0c;一直频繁 Full GC。新应用机器的配置是 4c 8g#xff0c;老应用是 4c 4g#xff0c;老应用 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%这里看 CMSInitiatingOccupancyFraction80%而实际才使用 2%看监控图表不到所以排除这种情况。 配置了 CMSClassUnloadingEnabled且 Perm Gen 的使用达到一定的比率默认为 92%这里看 CMSInitiatingPermOccupancyFraction80%而实际才使用 30看监控图表不到所以排除这种情况。 配置了 ExplictGCInvokesConcurrent 且未配置 DisableExplicitGC 的情况下显示调用了 System.gc()。 Hotspot 自己根据估计决定是否要触法如 CMS 悲观策略这类可以通过 GC 日志分析。
大致判断很可能是 System.gc() 导致的问题但是怎么定位调用 System.gc() 的代码呢 当时就想如果是 System.gc() 引起的频繁 Full GCjstack 线程堆栈应该能看到一些信息果不其然确实通过线程堆栈找到了。 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/web/85223.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!