java 线上生产问题排查思路,jvm内存溢出实例重启原因排查生产实战

java jvm内存溢出实例重启排查生产实战(使用VisualVM)

背景

项目组线上生产环境不定期的发生内存爆满然后实例重启,实例发布上线后实例内存不断增长最后维持在百分之九十多,十分危险。因此我参与到了排查中,本篇博客将记录排查过程和思路。

第一步:看报错

在日志中搜索error exception timeout等关键词来定位收集错误日志,并优先将报错的bug解决。
既然有内存溢出,少不了你能看到OutOfMemoryError这个报错,意思就是内存溢出错误。

第二步:看链路跟踪、机器指标监控等监控平台

云厂商比如腾讯云阿里云华为云都会有链路跟踪产品,或者是常见的pinpoint 、skywalking等
监控这边云平台也有,还有普鲁米修斯Prometheus之类的平台,随便百度都能搜到,记住选的时候要考虑主流的,生态完善的,社区活跃的,适合国内的,适合项目的和现有硬件配套的适合自己用的。

在问题排查过程中,有效的监控工具会让你更快更方便的掌握系统现状信息,更快的发现问题位置。
在链路跟踪中,你可以查看接口调用量、接口调用链路、接口每步耗时、慢接口、慢SQL、慢调用、异常信息、jvm信息、GC信息等

  1. 找慢接口
    慢接口的业务代码里可能会有不恰当的低性能实现方案,例如全表扫描、大量数据加载、模糊匹配、大量遍历、new大量对象、死锁等操作,若发现应予以优化解决。

  2. 看接口调用量
    看下接口调用量的变化,是否有异常流量突增导致系统无法处理大量请求,检查接口的请求量是否符合业务平时的正常数值,若有异常流量核实流量来源,成因,并及时做出应对措施。

  3. 慢SQL
    用explain查看执行计划,找到开发者了解这个SQL的业务需求,并对SQL进行优化,例如使用恰当的索引、做时间范围限制、避免在查询条件中使用函数导致索引失效等

  4. 慢调用
    有可能当前业务代码并不慢,而是下游服务或者第三方服务慢,则考虑优化下游服务或者将第三方调用改为异步实现,或考虑使用缓存等措施来提高性能。

  5. new大量对象
    在new对象、读取数据库数据的时候要考虑尽量使用更少的内存,更多的复用,更少的读取关键数据来实现原本的业务逻辑,错误的方式比如只需要某个表的所有ID字段,在查询时将所有字段的数据查询出来了。只需要指定某个表有多少条数据,却将表所有数据查出来然后获取集合大小。
    在代码逻辑中你仍然可以优化,例如创建集合时提前预估容量并指定容量new集合,避免集合做多次扩容操作浪费资源损耗性能。插入大量数据时一条条插入,可以优化为每1000条为一批生成SQL来批量插入等,性能优化的这些技巧需要不断学习和实践,看优秀的源码也可以学习到很多优秀的写法。

  6. 异常信息
    也就是看报错信息,找到报错代码行,解决bug。或者是jvm级别的报错则分析报错原因,引发报错的业务代码位置,进行优化、bug解决。

  7. 看jvm信息
    你可以看jvm线程数是否有突增、堆内存是否有突增、年轻代老年代内存使用情况,是否内存不够,直接内存是否一直增长,类加载个数、元空间内存是否持续增长(有些框架或者代码会去不断生成新的代理类~),线程状态是否有阻塞的线程

  8. 看GC信息
    通过查看jvm的内存回收GC记录也能够得到一些信息,例如在某些时候GC频繁,证明内存频繁不足,若是年轻代的minor GC频繁证明创建对象操作比较多,新生代内存需要不断的回收才能满足频繁创建对象的需要,而FullGC(也就是MajorGC)触发的时候,证明你的老年代内存也不足了,那么你要考虑是否有大量强链接对象占据了老年代内存,你可以指定jvm参数,在jvm内存溢出的时候导出堆内存,然后使用VisualVM这样的工具来分析堆文件(.dump/.hrof)。

第三步:导出堆文件使用VisualVM分析

MAT之类的工具也可以,自行选择。
java jvm堆内存分析工具MAT(导出运行中jvm堆内存、加载导出文件分析)

加载堆文件

在这里插入图片描述

第一眼看一下概要信息
在这里插入图片描述

来分析对象
在这里插入图片描述
在这里插入图片描述

点开char[]会发现大量的char[]数组,这个你肯定和熟悉,String里就是char[]

在这里插入图片描述
然后你可以随机抽查一些字符串里的内容看看,点左边的+号,展开看内容或者引用链路,可以看到这个字符串是什么对象里引用的,有助于分析。这次问题排查的时候从这边抽查发现了大量的某个类的实例,里面存了大量字符串。于是通过这个类最后定位到了一个调度,有人写了查询二十多万条数据出来直接装List里,真是绝了。浪费多少内存。
在这里插入图片描述

额外你可以用包聚合的方式来从查看对象,发现某个包下的某个vo对象居然有11万个,这也是占用了大量内存,需要优化的地方。
在这里插入图片描述

在这里插入图片描述

还可以以实例维度来排序
在这里插入图片描述
这个最大的对象里有24万个item,你就说恐怖不恐怖,一看是数据库查询了这么多数据,人才
在这里插入图片描述

第四步:考虑jvm参数优化、arthas进入jvm分析等操作

根据项目业务,分配合理的内存,根据机器配置之类的去合理选择垃圾回收器等,这些暂时先不写了~ 找相关资料、博客看呗

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

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

相关文章

TTS 擂台: 文本转语音模型的自由搏击场

对文本转语音 (text-to-speech, TTS) 模型的质量进行自动度量非常困难。虽然评估声音的自然度和语调变化对人类来说是一项微不足道的任务,但对人工智能来说要困难得多。为了推进这一领域的发展,我们很高兴推出 TTS 擂台。其灵感来自于LMSys为 LLM 提供的…

08|记忆:通过Memory记住客户上次买花时的对话细节

无论是LLM还是代理都是无状态的,每次模型的调用都是独立于其他交互的。也就是说,我们每次通过API开始和大语言模型展开一次新的对话,它都不知道你其实昨天或者前天曾经和它聊过天了。 使用ConversationChain from langchain import OpenAI…

C语言例:表达式 45-35+1^2 的值

代码如下&#xff1a; #include<stdio.h> int main(void) {int a;a 4&5-3&&51^2;printf("4&5-3&&51^2 %d\n",a);return 0; } 结果如下&#xff1a;

18 优先级队列

priority_queue介绍 1.优先级队列是一种容器适配器&#xff0c;根据弱排序标准&#xff0c;它的第一个元素总是最大的 2.此上下文类似于堆&#xff0c;堆中可以随时插入元素&#xff0c;检索最大堆元素 3.优先队列实现为容器适配器&#xff0c;容器适配器即将特定容器类封装作…

代码随想录|Day23|回溯03|39.组合总和、40.组合总和II、131.分割回文串

39.组合总和 本题和 216.组合总和III 类似&#xff0c;但有几个区别&#xff1a; 没有元素个数限制&#xff1a;树的深度并不固定&#xff0c;因此递归终止条件有所变化每个元素可以使用多次&#xff1a;下层递归的起始位置和上层相同&#xff08;startIndex不需要改动&#xf…

PostgreSQL中vacuum 物理文件truncate发生的条件

与我联系&#xff1a; 微信公众号&#xff1a;数据库杂记 个人微信: iiihero 我是iihero. 也可以叫我Sean. iiheroCSDN(https://blog.csdn.net/iihero) Sean墨天轮 (https://www.modb.pro/u/16258) 数据库领域的资深爱好者一枚。 水木早期数据库论坛发起人 db2smth就是俺&am…

特约撰稿 | 李杰:2024快消品牌企业如何赢在数字化?

随着用户群体、消费场景的细分&#xff0c;以及渠道的进一步多元化&#xff0c;让快消品企业遇到了一些机遇与挑战&#xff0c;在这样的大趋势之下&#xff0c;2024年快消品牌企业&#xff0c;要脱颖而出赢得增长&#xff0c;必须要把握战略上的机会。 作者&#xff5c;纷享销…

苍穹外卖-day09:用户端历史订单模块(理解业务逻辑),商家端订单管理模块(理解业务逻辑),校验收货地址是否超出配送范围(相关API)

用户端历史订单模块 1. 查询历史订单&#xff08;分页查询&#xff09; 1.1 需求分析和设计 产品原型&#xff1a; 业务规则 分页查询历史订单可以根据订单状态查询展示订单数据时&#xff0c;需要展示的数据包括&#xff1a;下单时间、订单状态、订单金额、订单明细&#…

探寻源码宝藏:介绍开源项目“source-code-hunter“

最近处于金三银四的面试黄金期&#xff0c;许多同学在面试中反映现在要求非常高&#xff0c;阅读源码几乎是必问项。然而&#xff0c;阅读源码时常常觉得晦涩难懂&#xff0c;令人头疼。今天在浏览 GitHub 时&#xff0c;我发现了一个名为 source-code-hunter 的宝藏项目。这个…

苍穹外卖-day06:HttpClient、微信小程序开发、微信登录(业务流程)、导入商品浏览功能代码(业务逻辑)

苍穹外卖-day06 课程内容 HttpClient微信小程序开发微信登录导入商品浏览功能代码 功能实现&#xff1a;微信登录、商品浏览 微信登录效果图&#xff1a; 商品浏览效果图&#xff1a; 1. HttpClient 1.1 介绍 HttpClient 是Apache Jakarta Common 下的子项目&#xff0c;…

在Linux系统中如何查询日志?

在工作中&#xff0c;我们有时候会定位问题&#xff0c;这时候就需要查询日志了&#xff0c;那么查询日志的命令有哪些呢&#xff1f; cat 查看某个日志文件中的所有内容。 使用示例&#xff1a;cat file.txt 显示 file.txt 文件的所有内容。 如果要对查询的结果进行筛选&am…

代码随想录算法训练营第11天| 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

系列文章目录 目录 系列文章目录20. 有效的括号利用栈对称匹配将栈中元素弹出与判断栈顶元素是否匹配分开&#xff0c;比较耗时&#xff08;2ms)&#xff1a;若将栈中元素弹出与判断栈顶元素是否匹配放一起&#xff0c;比较节省时间(1ms)&#xff1a; 1047. 删除字符串中的所有…