JVM修炼之路【11】- 解决内存溢出、内存泄漏 以及相关案例

news2024/11/27 9:53:31

前面的10篇 都是基础的知识,包括类加载的过程 类加载的细节,jvm内存模型 垃圾回收 等等,
这一篇我们开始实战了解一下 各种疑难杂症:怎么监控 怎么发现 怎么解决

内存溢出 内存泄漏

这两个概念在垃圾回收器里面已经讲过了,
当一个对象我们已经不再使用 但是我们又没有明确的断掉它 可达性分析法觉得他不能回收 一直存在堆内存里面——这就是内存溢出

随着内存溢出 越来越多 最后吧内存撑爆 造成OOM ——这就是内存泄漏

下面介绍一款企业级的JVM监控 :Prometheus 负责收集监控数据 grafana负责可视化显示
在这里插入图片描述

首先当我们看到内存趋势图 要会分辨,内存图频繁上升是正常的 因为程序的运行过程就会创建对象,但是一直上升下不来 这就是有问题的 说明有对象没回收 然后越积越多

在这里插入图片描述

JVM内存问题经典案例

先来一个最经典的,大家学习线程池的时候 书或者博客资料上面 都会有这个例子;

就是 线程池中使用 threadlocal

在这里插入图片描述
我们知道 threadlocal里面存的是本地线程的副本,当一个线程销毁时 它对应的threadlocal的副本数据 也就销毁了,

但是线程池是一个例外 我们讲过 为了节省线程 不断 新建和销毁的成本 所以设计了线程池,线程池里面核心线程都是活的, 如果我们不手动执行 remove, 那么threadlocal 就会一直占用堆内存

如果遇到大数据量和高数量的线程池 就有可能造成OOM


并发请求量过大 这个很好理解 也很常见,一个系统的并发请求量是有限的,如果有大量的用户短时间内同时访问 访问过程中大量创建对象 就很容易造成 堆内存溢出 OOM.

在这里插入图片描述


过多的线程创建
这种情况也会有,不管是线程池的参数设置,还是程序中某些设计里面 手动创建了大量的线程
,每个线程都占用一定的内存,可能会导致内存溢出。


超大对象 或者大文件IO 读写

这种情况也很多 ,比如你的对象里面有那种text 大字段 , 你select的时候 一次性select几万条数据出来 可能瞬间就把内存撑爆了。

还有大文件读写,比如你的web 写了一个文件下载功能,但是你没有限制文件下载的大小,用户直接下一个超级大的文件,jvm也会oom

mq的消息补偿机制是什么 是不是消费者消费失败 还可以再拉取一次消息


怎么样定位内存问题

接下来说最最重要的, 我们上面说了 内存溢出的几个案例 和原理, 那么线上系统当我们真正遇到内存溢出的时候,我们怎样去定位?

我们平时生活中生病去查病因的时候 回去医院拍个片子,这个片子上面记录的就是我们身体状况的一个快照。

同样线上服务出现了oom 或者其他内存问题的时候 我们也要拍一个片子 把内存溢出那个时间点的 快照拿到 去观察下 内存的情况
在这里插入图片描述
这个快照就是heap profile文件, 这个文件怎么生成呢?
一种方式是配置参数
在这里插入图片描述
这样如果发生了oom 系统就回自动的输出快照文件到你的指定目录

但是这种方式比较被动,如果系统发生了内存问题 内存占用量比较大,但是还没破那个店 没有oom 这时候你迫不及待就想分析解决 那么你就主动生成这个文件:

在这里插入图片描述
看 arthas 又出现了! 很方便

heap profile文件里面记录的就是内存的详细情况。

然后快照文件是导出来了,怎么看它呢? 你直接txt打开吗? 肯定是不行的

有2种打开方式 一种是MAT软件打开 (这种不太方便以为线上机器 安装MAT 还有再导出结果 不是很顺手)

第二种方式就是线上诊断系统,现在很多企业都会有自己自研的或者包装的(也可能他们的诊断系统内核就是MAT)诊断系统 你只需要把快照文件上传。

然后当你用正确的工具打开它时 看直方图:
这里看看深堆大小排序 排在最前面的 就是占用内存最大的对象
在这里插入图片描述

但是仅仅看直方图还不够,我们希望精确的找到 是哪一个接口方法 造成了内存问题:
我们打开直方图 旁边那个按钮 支配树, 然后我们找到占用内存排序顶端的这个线程
你看这个名字 http-nio-8081 一看就是Tomcat创建的用户线程。

然后接下来重点来了 下面这么多方法 我们应该看哪一个

这时候回忆起我们之前学过的基础的 springmvc中 有一个核心方法 HandlerMethod 就是下面红框箭头标出来的那个

是他负责把请求对象 发到 对应的控制器方法。

在这里插入图片描述

所以我们点开它 ,然后最后一栏描述中 就清清楚楚的表明了 是哪一个接口方法造成了 内存溢出:

在这里插入图片描述

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

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

相关文章

视频秒播优化实践

本文字数:2259字 预计阅读时间:10分钟 视频起播时间,即首帧时间,是视频类应用的一个重要核心指标,也是影响用户观看体验的核心因素之一。如果视频要加载很久才能开始播放,用户放弃播放甚至离开 App 的概率都…

React + three.js 实现人脸动捕与3D模型表情同步

系列文章目录 React 使用 three.js 加载 gltf 3D模型 | three.js 入门React three.js 3D模型骨骼绑定React three.js 3D模型面部表情控制React three.js 实现人脸动捕与3D模型表情同步 示例项目(github):https://github.com/couchette/simple-react-three-facia…

【Godot4自学手册】第三十六节圆形移动或扇形移动的铁球

在第三十四节我实现了来回无限滚动的伤害铁刺球,这一节我准备实现一个圆形移动或扇形移动,并带有链条的铁球。效果如下: 一、实现原理 绕一点做圆周运动,简单的说就是: 每一帧根据旋转的角度计算出下一个位置的坐标…

R语言绘图:绘制横向柱状图

代码主要实现&#xff1a; 对数据进行排序&#xff0c;并且相同分组的数据会有相同的颜色。最后&#xff0c;绘制横向柱状图。 # 加载ggplot2包 library(ggplot2)# 示例数据&#xff0c;假设有三列&#xff1a;Group, Variable, Value data <- data.frame(Group factor(c(…

植被参数光学遥感反演方法(Python)及遥感与生态模型数据同化算法

传统的地面实测方法能够得到比较准确的植被参数&#xff08;如叶面积指数、覆盖度、生物量、叶绿素、干物质、叶片含水量、FPAR等&#xff09;&#xff0c;但其获取信息有限&#xff0c;难以满足大范围提取植被参数的需求&#xff0c;尤其在异质地表区域。遥感技术的发展为植被…

【PythonCode】力扣Leetcode11~15题Python版

【PythonCode】力扣Leetcode11~15题Python版 前言 力扣Leetcode是一个集学习、刷题、竞赛等功能于一体的编程学习平台&#xff0c;很多计算机相关专业的学生、编程自学者、IT从业者在上面学习和刷题。 在Leetcode上刷题&#xff0c;可以选择各种主流的编程语言&#xff0c;如C…

316_C++_xml文件解析成map,可以放到表格上 + xml、xlsx文件互相解析

xml文件例如&#xff1a; <?xml version"1.0" encoding"UTF-8" standalone"yes"?> <TrTable> <tr id"0" label"TR_PB_CH" text"CH%2"/> <tr id"4" label"TR_PB_CHN"…

[BT]BUUCTF刷题第16天(4.12)

第16天 Web [MRCTF2020]Ezpop 打开网站就是一段泄露的源代码&#xff1a; <?php //flag is in flag.php //WTF IS THIS? //Learn From https://ctf.ieki.xyz/library/php.html#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E9%AD%94%E6%9C%AF%E6%96%B9%E6%B3%95 //And Crack…

Ollama、FastGPT大模型RAG结合使用案例

参考: https://ollama.com/download/linux https://doc.fastai.site/docs/intro/ https://blog.csdn.net/m0_71142057/article/details/136738997 https://doc.fastgpt.run/docs/development/custom-models/m3e/ Ollama作为后端大模型加载运行 FastGPT作为前端页面聊天集成RA…

Linux函数学习 select

1、Linux select 函数 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); nfds 最大文件fd 1 readfds 监听可读文件集合fd writefds 监听可写文件集合fd exceptfd 监听异常文件集…

[蓝桥杯] 岛屿个数(C语言)

提示&#xff1a; 橙色字体为需要注意部分&#xff0c;红色字体为难点部分&#xff0c;会在文章“重难点解答”部分精讲。 题目链接 蓝桥杯2023年第十四届省赛真题-岛屿个数 - C语言网 题目理解 这道题让我们求岛屿个数&#xff0c;那么我们就应该先弄懂&#xff0c;对于一…

R: 支持向量机(Support Vector Machine,简称SVM)

在数据科学和机器学习领域中&#xff0c;支持向量机&#xff08;Support Vector Machine&#xff0c;简称SVM&#xff09;是一种强大的监督学习算法&#xff0c;常用于分类和回归分析。它的优点之一是可以适用于复杂的数据集&#xff0c;并且在高维空间中表现良好。在本文中&am…

SpringBoot3 + Vue3 + Uniapp + uView + Elenment 实现动态二级分类以及二级分类的管理

SpringBoot3 Vue3 Uniapp uView Elenment 实现动态二级分类以及二级分类的管理 1. 效果展示1.1 前端显示效果1.2 后台管理一级分类1.3 后台管理二级分类 2. 后端代码2.1 GoodsCategoryController.java2.2.1 GoodsCategoryMapper.java2.2.2 GoodsCategorySonMapper.java2.3.…

蓝桥杯备赛(C/C++组)

README&#xff1a; 本笔记是自己的备考笔记&#xff0c;按照官网提纲进行复习&#xff01;适合有基础&#xff0c;复习用。 一、总考点 试题考查选手解决实际问题的能力&#xff0c;对于结果填空题&#xff0c;选手可以使用手算、软件、编程等方法解决&#xff0c;对于编程大…

Laravel 11入门:使用ServBay打造高效开发环境

Laravel 11发布&#xff0c;改进了不少功能。 它引入了更加流畅的应用结构、每秒限速、健康路由等特性。 此外&#xff0c;Laravel还推出了第一方可扩展的WebSocket服务器Laravel Reverb&#xff0c;为你的应用提供强大的实时功能。 在今天的指南中&#xff0c;我将设置一个…

OSPF中配置VLAN通信(单臂路由)

OSPF中配置VLAN通信&#xff08;单臂路由&#xff09; 单臂路由&#xff08;One-Arm Routing&#xff09;是一种网络路由配置方式&#xff0c;常用于解决网络中的特定问题。在传统的网络架构中&#xff0c;路由器通常需要连接到多个子网或网络段&#xff0c;每个子网都需要一个…

项目管理工具——使用甘特图制定项目计划的详细步骤

甘特图是一种直观的项目管理工具&#xff0c;它有助于我们清晰地展示任务安排、时间管理和项目的进度。以下是使用甘特图制定项目计划的详细步骤&#xff1a; 1、创建项目&#xff1a;首先&#xff0c;在进度猫中创建新的项目&#xff0c;并设置项目的时间、工作日等参数。根据…

test4132

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

14届蓝桥杯 C/C++ B组 T6 岛屿个数 (BFS,FloodFill,填色)

首先拿到这道题不要想着去直接判断环里面的岛屿&#xff0c;这样太困难了&#xff0c;我们可以使用之前做过的题的经验&#xff0c;在输入加入一圈海水&#xff0c;然后从(0,0)点开始BFS&#xff0c;这里进行八向搜索&#xff0c;搜到的0全部都染色成2&#xff0c;假如2能够蔓延…

GEE数据集——巴基斯坦国家级土壤侵蚀数据集(2005 年和 2015 年)

简介 巴基斯坦国家级土壤侵蚀数据集&#xff08;2005 年和 2015 年&#xff09; 该数据集采用修订的通用土壤流失方程 (RUSLE)&#xff0c;并考虑了六个关键影响因素&#xff1a;降雨侵蚀率 (R)、土壤可侵蚀性 (K)、坡长 (L)、坡陡 (S)、覆盖管理 (C) 和保护措施 (P)&#xff…