记一次生产环境Java堆内存溢出问题排查思路

1. 用Visual VM 加载堆转储文件

先将转储文件从服务器下载下来,打开Visual VM,点击右上角的Load Snapshot,将这个转储文件加载到Visual VM中。
在这里插入图片描述

2. 用Visual VM 分析堆转储文件

1)首先看到是醒目的红色,这里标记了堆内存溢出的线程,我这里显示是Nacos的配置中心的一个更新本地配置的Updater线程导致堆内存溢出。
我本地debug发现,这个线程里边根本就不会创建太多对象。而且本地测试环境的配置文件数 、配置文件内容大小不会与生产环境相差太多,那么可以推测生产环境也不会创建太多的对象。因此可以进一步推测不是这个线程导致的内存溢出。实际情况可能是在此之前就已经内存不足了,只是在这个线程任务中GC已经不起作用了、实在是分配不了新对象,最终程序崩溃。

在这里插入图片描述
2)不能直接从线程上看出问题所在,就只能去看java对象的分布情况了。

Class by Number of InstancesClasses by Size of Instances两个维度都可以看出byte[]char[]String 的对象个数及内存大小都是排在最前列的。
光看这几种对象其实没啥意义,因为它们是最常见的几种准标量,它们几乎在任何系统的任何时候都是数量最多、内存占用最大的,它们一般都是被其他复杂对象给引用着,所以我们主要还是得关注这些复杂对象
除了这个常见的准标量外,可以直观看到EnterpriseProjectDO 对象占用内存最大。看到这个Java类型的对象很多,我第一反应就是我负责的那个定时任务可能在运行,那个定时任务会创建大量的EnterpriseProjectDO对象。但后来又细想了下,白天那个定时任务不会运行,它的执行计划是每晚11点,后来在XxlJob的用户界面复查发现当时也没有其他人手动执行那个定时任务。

我只能扩大排查范围,后来在Dominators By Retain Size维度看到了关键信息
在这里插入图片描述
点击Dominators By Retain Sizeview all按钮显示出一下结果
在这里插入图片描述
从上图可以看出,用绿框标注出的对象是重点怀疑对象,这几类对象数量多、占用内存大,且有好几个还是GC Root。

  • (1) 先看排第一的ResultSetImpl,这说明此时数据库查询向java程序返回了很大的数据报文。
  • (2) 再看ArrayList#115426这个对象,其中的元素类型是EnterpriseMainAndCredential,因此需要关注某个代码逻辑会用到这个类。
    在这里插入图片描述
  • (3) 然后看HashMap#26865这个对象,展开后发现,这个HashMap的key是Long类型、value是ArrayList(其元素类型是EnterpriseCredentialDO),这明显是一个Java 8 对集合进行stream分组的结果。因此得重点排查对项目中对EnterpriseCredentialDO的分组代码
    在这里插入图片描述
  • (4) 再然后看ConcurrentHashMap#239这个对象,展开这个map发现,它的key是Bean名、value是Bean对象,可以推测出这个对象是DefaultListableBeanFactory中记录bean名到bean实例之间映射的字段singletonObjects ,因此这个对象对我们排查问题没啥参考意义。
    在这里插入图片描述
  • (5) 最后看ArrayList$SubList#1这个对象,展开这个对象后发现它是元素类型EnterpriseMainDOArrayList 的子视图,这个java项目中有使用内存分页,所以需要注意项目中对EnterpriseMainDO 集合调用subList进行分页的代码逻辑
    在这里插入图片描述

3 结合分析结果,定位并解决问题

(1) 直接IDEA中搜索 EnterpriseMainAndCredential被引用的地方,很快就定位了一个代码位置,这个类只有那一个处被使用。这个接口没有传租户id,会导致查询所有的EnterpriseProjectDO,在这个接口中这个实体对应的数据库表的数据量是最大的,达到了30多万,反序列化为Java实体时会创建大量对象。

(2) 另外由于过滤条件复杂,主数据没法在数据库层做过滤,需要将所有的EnterpriseMainDO(数据量不大,总量才3000多条)查出,再做内存分页,所以在堆转储文件分析看到了元素类型是EnterpriseMainDOArrayList$SubList

(3) 代码中对EnterpriseCredentialDO EnterpriseProjectDO 都进行了stream 分组,所以在堆转储文件分析看到了上面提的的HashMap#26865对象。

(4) 内存溢出的原因也在于这里的stream 分组统计,代码中对这两对象集合分组后,只取了分组后的size,并未使用集合里的对象具体信息。EnterpriseProjectDO 的数据量特别大,且代码逻辑又只需要统计的count数,所以这个统计应该放在数据库上(利用group by统计)。

(5) 最后,我改写了代码,用sql在数据库上做数据统计,大大减少了数据库的返回数据包文大小,java程序客户端也就不需要创建那么多的java数据库实体类,不会出现GC失败、内存溢出的问题了。

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

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

相关文章

doss攻击为什么是无解的?

这个让Google、亚马逊等实力巨头公司也无法避免的攻击。可以这么说,是目前最强大、最难防御的攻击之一,属于世界级难题,并且没有解决办法。 Doss攻击的原理不复杂,就是利用大量肉鸡仿照真实用户行为,使目标服务器资源…

Rust语言

文章目录 Rust语言一,Rust语言是什么二,Rust语言能做什么?Rust语言的设计使其适用于许多不同的领域,包括但不限于以下几个方面:1. 传统命令行程序:2. Web 应用:3. 网络服务器:4. 嵌入…

albef论文学习

首先要知道vit是啥东西。vit就是transformer模型在图像领域的运用。 transformer模型原本是用于自然语言的,encoder和decoder接受的都是文字。vit把图像分割成很多个小块,把各个小块拉长当成向量来用,接下来就是一样的。最后接一个全连接层做…

PostgreSQL入门到实战-第二十弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(四)官网地址PostgreSQL概述PostgreSQL中LEFT JOIN命令理论PostgreSQL中LEFT JOIN命令实战更新计划 PostgreSQL中表连接操作(四) 如何使用PostgreSQL LEFT JOIN子句从多个表中选择数据 官网地址 声明: 由于操作系统, 版本更新等…

14亿美元!德国默克与AI生物科技公司合作;马斯克Neuralink首位脑机接口植入者用意念打游戏;黄仁勋在俄勒冈州立大学开讲

AI for Science 的新成果、新动态、新视角—— 日本第一 IT 公司富士通:生成式 AI 加速药物研发 马斯克:Neuralink 首位脑机接口植入者用「意念」打游戏 默克与 AI 生物科技公司 Caris 达成合作 AI 蛋白质设计服务提供商「天鹜科技」完成数千万元 Pre…

CPU核心数、线程数都是什么意思?

最早,每个物理 cpu 上只有一个核心,对操作系统而言,也就是同一时刻只能运行一个进程/线程。 为了提高性能,cpu 厂商开始在单个物理 cpu 上增加核心(实实在在的硬件存在),也就出现了多核 cpu&…

bugku-web-你从哪里来

这里就这一句话提示,问我是不是谷歌的? 用谷歌浏览器访问 没看见什么变化 抓包查看 没有变化 这时我想到爬虫中的反爬策略中有一种,判断请求的当前界面来判断用户的起始判断位置 这时抓取报文 GET / HTTP/1.1 Host: 114.67.175.224:1516…

【简单讲解macOs虚拟机安装全过程】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

leetcode 1702

leetcode 1702 题目 例子 代码思路 class Solution { public:string maximumBinaryString(string binary) {int n binary.size();int i binary.find(0);if(i string::npos){return binary;}int zeros count(binary.begin(), binary.end(), 0);string s(n, 1);s[izeros-1]…

蓝桥杯,,,,,,

辗转相除求最大公约数 #include<iostream> using namespace std;int gcd(int a, int b)//求最大公约数&#xff0c;如果返回值为1&#xff0c;最大公约数只有1&#xff0c;为所求 {return b ? gcd(b, a % b) : a; } int main() {int count 0;for(int i1;i<2020;i)f…

《二》Qt Creator工具介绍与使用

一、关于界面 点击文件--->新建文件或项目会出现如下图&#xff1a; 我们选择第一个 点击下一步下一步&#xff1a; 继续下一步直到结束&#xff1a; 二&#xff0c;具体文件介绍 我们点击pro查看以下 QT core gui第1行 表示使用qt的core和gui库&#xff0c;如果以后…

DVWA靶场的下载与搭建

目录 什么是靶场 DVWA靶场下载 下载地址 安装 什么是靶场 靶场就是人为提供的带有安全漏洞的服务&#xff0c;每一个学习者都可以在本地快速搭建来实操&#xff0c;回溯漏洞的发生原理以及操作方式。DVWA靶场呢就是一个可以通过浏览器访问的拥有可视化页面的web靶场。 DVW…

实况窗助力美团打造鸿蒙原生外卖新体验,用户可实时掌握外卖进展

自2023年华为宣布全新HarmonyOS NEXT蓄势待发&#xff0c;鸿蒙原生应用全面启动以来&#xff0c;已有金融、旅行、社交等多个领域的企业和开发者陆续宣布加入鸿蒙生态。其中&#xff0c;美团作为国内头部的科技零售企业&#xff0c;是首批加入鸿蒙生态的伙伴&#xff0c;其下的…

一题多解之回文字符问题

递推实现 #include <iostream> #include <algorithm> #include <string> using namespace std; string s; //递归实现 bool judge(int b,int e){//结束条件&#xff1a;be,只有一个字符;或者b>e,遍历结束if(b>e) return true;else{//当前位置与其前一…

函数、指针和数组的相互运用(C语言)

1、函数指针数组 含义&#xff1a;数组的每个元素都是函数指针类型.eg&#xff1a; &#xff08;此代码链接&#xff1a;http://t.csdnimg.cn/ClJmb.也可以在我发布博客中找到&#xff09; 2、指向函数指针数组的指针 1、引入 3、回调函数 1、含义&#xff1a;就是一个通过…

前端开发攻略---简化响应式设计:利用 SCSS 优雅管理媒体查询

1、演示 2、未优化前的代码 .header {width: 100px;height: 100px;background-color: red; } media (min-width: 320px) and (max-width: 480px) {.header {width: 10px;} } media (min-width: 320px) and (max-width: 480px) {.header {height: 20px;} } media (min-width: 48…

ffmpeg命令与批处理编程

(一) CMD脚本查找所有文件 powershell与cmd转换 powershell与cmd虽然同为windows命令&#xff0c;但许多命令并不通用。 CMD换行符 a 在CMD下&#xff0c;可以用^作为换行符&#xff0c;类似于Linux下的\。举例如下&#xff1a; start pemu.exe ^ -net nic,vlan1,macaddr…

Mongodb前后端整合篇

一、前端篇 1.1mongoose介绍 Mongoose 是一个对象文档模型库&#xff0c;官网 http://www.mongoosejs.net/ 方便使用代码操作 mongodb 数据库pnpm i mongoose5.13.15 1.2初步使用 import mongoose from mongoose; //设置 strictQuery 为 true mongoose.set(strictQuery, true…

ssm041绿色农产品推广应用网站+vue

绿色农产品推广应用网站 摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的…

js打印页面源码 ,打印选取的容器里的内容,打印指定内容

js打印页面源码 &#xff0c;打印选取的容器里的内容&#xff0c;打印指定内容 效果 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge&…