HeapDump性能社区Full GC异常问题排查实战案例精选合集-编程思维

处理过线上问题的同学基本都遇到过系统突然运行缓慢,CPU 100%,以及 Full GC 次数过多的问题。这些问题最终导致的直观现象就是系统运行缓慢,并且有大量的报警。

本期小编集合了HeapDump性能社区内的4篇Full GC异常问题排查文章,通过几位作者记录的真实案例,提醒自己避免踩坑,顺便复习相关知识点。

1.一顿操作后,FGC频率降低到原来的1/400

作者:阿飞Javaer

https://heapdump.cn/article/2405044

作者通过一个多月的努力,将 FullGC 从 40 次/天优化到近 10 天才触发一次,而且 YoungGC 的时间也减少了一半以上。第一次优化,作者提升了新生代大小,将初始化堆内存设置为最大内存,运行了5天后,YoungGC减少了一半以上的次数,时间减少了400s,但是FullGC的平均次数增加了41次,没有达到预期效果,于是进行了第二次调优。第二次排查过程中发现了内存泄漏问题,原来是在某个条件下会查询表中所有未处理的指定数据,但是由于查询的时候where条件中少加了模块这个条件,导致查询出的数量达40多万条,解决此问题后,线上服务器运行完全正常了,Full GC频率也大大降低了。

亮点:作者在经历了为时一个多月的调优后,总结出了一些小tips,如发现FullGC频繁的时候优先调查内存泄漏问题,如果访问业务没有这么大量且没有攻击的问题的话可以往数据库方面调查等。十分具有参考价值。

2.FGC实战:如何用Idea揪出开源组件调用System.gc导致频繁FGC

作者:阿飞Javaer

https://heapdump.cn/article/366698

作者收到最近发布的一个服务频繁FGC的告警,首先查看GC日志,推测出是因为某些地方调用System.gc()触发的FGC,很顺利就找到了这个时候是调用了一个导出报表数据到Excel并下载的接口,作者便模拟该段代码重现了问题,然后借助IDEA强大的搜索功能成功定位,发现是在调用WritableWorkbook的close()方法时调用了System.gc(),从而触发了FGC。最后改造代码解决了问题。

亮点:作者碰到问题不轻视不主观臆断,每一步推断都有理有据。先是用最小量的代码完美重现了问题,然后另辟蹊径借助IDEA强大的搜索功能精准定位到了问题所在,改造代码解决了问题,最后还进行了压测,重复调用该段代码重复验证保证再无问题。心思缜密,值得学习。

3.FullGC实战:业务小姐姐查看图片时一直在转圈圈

作者:阿飞Javaer

https://heapdump.cn/article/249540

这是一篇理论与实战结合的好文,不仅分享了UseAdaptiveSizePolicy 参数的相关知识,还提供了清晰的定位思路:
(1)首先确定业务场景,到底业务是做什么的,做了哪些事情,可能拖慢程序的逻辑有哪些
(2)根据猜测可能出现问题的部分进行确认,排除
(3)结合日志信息及相关知识进行问题原因分析确认
(4)模拟复现确认问题出现的根因
(5)解决问题

4.Redis client链接池配置不当引起的频繁full gc

作者:朱纪兵

https://heapdump.cn/article/1679033

作者作为项目的ower,非常了解业务特征,在日常查看gc log时发现其不符合业务特征应该呈现的情况,立即使用工具进行排查,然后进行了优化。正因为对业务足够了解,专业知识过硬,所以在日常巡查中就能发现疑点并对其定位,防患于未然,十分值得学习。

阅读更多性能文章,请移步 HeapDump性能社区

版权声明:本文版权归作者所有,遵循 CC 4.0 BY-SA 许可协议, 转载请注明原文链接
https://www.cnblogs.com/perfma/p/15219056.html

深入底层|JVM源码解读:HotSpot的模板解释器-编程思维

本文由HeapDump性能社区首席讲师鸠摩(马智)授权整理发布 第9篇-字节码指令的定义 之前的文章介绍了解释执行下的Java栈帧创建以及字节码分派逻辑,但是始终没有讲到虚拟机到底是怎么执行Java方法中的字节码的,在介绍字节码的执行之前,需要先知道字节码指令的定义。在Bytecodes::initialize()函

面试官:Java 线程如何启动的?-编程思维

摘要:Java 的线程创建和启动非常简单,但如果问一个线程是怎么启动起来的往往并不清楚,甚至不知道为什么启动时是调用start(),而不是调用run()方法呢? 本文分享自华为云社区《Thread.start() ,工作这么久,还不知道它是怎么让线程跑起来的!》,作者:小傅哥。 面试官:我考你个题,看看你进大厂的几率大

Java Happens-Before原则-编程思维

Java Happens-Before原则 Happens-Before原则核心就是表达在一些条件下,前面的操作对于后面的操作是可见的。它有六个条件,或者说是六条原则。 一、线程中的顺序性原则 这个最容易理解,这个原则是指在同一个线程中,按照程序的顺序,前面的操作Happens-Before后面的操作。也就说在同一个线

JVM 之类加载器-编程思维

一、什么是 JVM   JVM(Java Virtual Machine)是一个可以执行 Java 字节码文件(即 .class 文件)的虚拟机进程。当 Java 源文件能被成功编译成 .class 文件,就能在不同平台上的不同版本的 JVM 运行,因为 JVM 能将相同的 .class 文件解释称不同平台的机器码。正

Java程序员涨薪必备的性能调优知识点,收好了!-编程思维

Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢、接口超时,服务器负载高、并发数低,数据库频繁死锁等。尤其是在“糙快猛”的互联网开发模式大行其道的今天,随着系统访问量的增加和代码的日渐臃肿,各种性能问题开始纷至沓来。Java 应用性能的瓶颈点非常多,比如磁盘、内存、网络 I/O 等系统因素,Jav

坏代码导致的性能问题大赏:CPU占用飙到了900%!-编程思维

读过《重构 - 改善既有代码的设计》一书的同学们应该都很了解“代码的坏味道”。当然确定什么是代码“坏味道”是主观的,它会随语言、开发人员和开发方法的不同而不同。在工作当中,很多时候都是在维护之前的项目和在此基础上增加一些新功能,为了能让项目代码易于理解和维护,要时刻注意代码中的“坏味道”,当发现代码如果有坏味道了,要及

如何提高C# StringBuilder的性能-编程思维

本文探讨使用C# StringBuilder 的最佳实践,用于减少内存分配,提高字符串操作的性能。 在 .NET 中,字符串是不可变的类型。每当你在 .NET 中修改一个字符串对象时,就会在内存中创建一个新的字符串对象来保存新的数据。相比之下,StringBuilder 对象代表了一个可变的字符串,并随着字符串大小的增

数据库性能优化,究竟该如何下手?-编程思维

数据库性能优化的目标是通过充分利用系统资源来最小化查询的响应时间。对这些资源的最佳利用包括最大限度地减少网络流量、磁盘 I/O 和 CPU 时间。这个目标只能通过理解数据的逻辑和物理结构、系统上使用的应用程序以及数据库的冲突使用如何影响性能来实现。实际上,数据库性能优化是一项系统工程,需要使用系统化分析方法,从硬件、软

软件性能测试分析与调优实践之路-Java应用程序的性能分析与调优-手稿节选-编程思维

Java编程语言自从诞生起,就成为了一门非常流行的编程语言,覆盖了互联网、安卓应用、后端应用、大数据等很多技术领域,因此Java应用程序的性能分析和调优也是一门非常重要的课题。Java应用程序的性能直接关系到了很多大型电商网站的访问承载能力、大数据的数据处理量等,它的性能分析和调优往往还可以节省很多的硬件成本。 5.1

如何做好性能测试分析诊断调优-暨《软件性能测试、分析与调优实践之路》-赠书。-编程思维

   一个系统或者软件性能的重要性自然是无需多说,永远没有哪个用户可以忍受打开一个网站或者软件需要很久才能响应,性能是评估一个系统或者软件最实在的指标,如果一个网站做得再好看、再漂亮,但是性能上不去,那也只是华而不实。 笔者在离开测试岗进入研发岗已经有好几个年头了,按理说不应该再去写关于软件测试的书籍了而应该更多的去关