当前位置: 首页 > news >正文

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

前面的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 就是下面红框箭头标出来的那个

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

在这里插入图片描述

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

在这里插入图片描述

相关文章:

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

前面的10篇 都是基础的知识,包括类加载的过程 类加载的细节,jvm内存模型 垃圾回收 等等, 这一篇我们开始实战了解一下 各种疑难杂症:怎么监控 怎么发现 怎么解决 内存溢出 内存泄漏 这两个概念在垃圾回收器里面已经讲过了&#…...

Java面试题:描述Java 17中的密封接口及其用途

Java 17是继Java 11和Java 16之后的又一个长期支持(LTS)版本,它于2021年9月发布。在Java 17中,一个重要的新特性是密封接口(Sealed Interfaces),这是对Java接口的增强,它允许接口有更…...

C++11的新特性

C11是由C标准委员会指定的语言规范。相比于C98/03,C11则带来了数量可观的变化,其中包含了约140 个新特性,以及对C03标准中约600个缺陷的修正,C11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,…...

【C语言__动态内存管理__复习篇6】

目录 前言 一、动态内存管理 二、动态内存函数 2.1 malloc 2.2 free 2.3 calloc 2.4 realloc 三、动态内存常见的6个使用错误 3.1 接收malloc/calloc返回的参数后未及时检查是否为NULL 3.2 越界访问动态内存空间 3.3 对非动态开辟的内存使用free释放 3.4 使用free只释放了…...

C语言 | Leetcode C语言题解之第30题串联所有单词的子串

题目: 题解: typedef struct {char key[32];int val;UT_hash_handle hh; } HashItem;int* findSubstring(char * s, char ** words, int wordsSize, int* returnSize){ int m wordsSize, n strlen(words[0]), ls strlen(s);int *res (int *)mall…...

大数据dolphinscheduler 本地容器化安装

Minio 容器安装 docker run -p 9000:9000 -p 9090:9090 --name minio -d -e "MINIO_ACCESS_KEYminioadmin" -e "MINIO_SECRET_KEYminioadmin" -v D:\SF\DOCKER\minio\data:/data -v D:\SF\DOCKER\minio\config:/root/.minio minio/minio server /da…...

简单的车牌号识别

目录 处理流程与界面各接口编写时遇到的一些问题上传图片识别结果标签显示中文 处理流程与界面 首先点击“上传图片”按钮,可以选择文件夹中含有汽车车牌的图片,并显示在“图片框”中。 点击“检测车牌”按钮,会先对“图片框”中即含有汽车车…...

openGauss学习笔记-261 openGauss性能调优-使用Plan Hint进行调优-将部分Error降级为Warning的Hint

文章目录 openGauss学习笔记-261 openGauss性能调优-使用Plan Hint进行调优-将部分Error降级为Warning的Hint261.1 功能描述261.2 语法格式261.3 示例261.3.1 忽略非空约束261.3.2 忽略唯一约束261.3.3 忽略分区表无法匹配到合法分区261.3.4 更新/插入值向目标列类型转换失败 o…...

CSS水波纹效果

效果图&#xff1a; 1.创建一个div <div class"point1" click"handlePoint(1)"></div> 2.设置样式 .point1{width: 1rem;height: 1rem;background: #2ce92f;position: absolute;border-radius: 50%;z-index: 999;cursor: pointer;} 3.设置伪…...

迭代器模式:优雅地遍历数据集合

在软件设计中&#xff0c;迭代器模式是一种常见且有用的设计模式&#xff0c;它允许顺序访问一个聚合对象中的各个元素&#xff0c;而又不暴露该对象的内部表示。这种模式在需要对集合进行遍历操作而又不想暴露集合内部结构的场景下非常有用。 一、迭代器模式的使用条件 访问集…...

c++总结笔记(一)

计算机可以将程序转化为二进制指令&#xff08;即机器码&#xff09;&#xff0c;并由CPU执行&#xff0c;CPU会按照指令的顺序依次执行每个指令。 C语言特点&#xff1a; 简洁高效可移植模块化标准化 C语言的标准 C89(C90)标准C99标准C11标准 导入 使用include导入包含…...

[python][gradio]chatbot控件用法

chatbot模块是Gradio中的一个组件&#xff0c;用于展示聊天机器人的输出&#xff0c;包括用户提交的消息和机器人的回复。它支持一些Markdown语法&#xff0c;包括粗体、斜体、代码和图片等。Chatbot模块的输入不接受用户输入&#xff0c;而是通过函数返回的列表来设置聊天内容…...

Sublime Text下载,安装,安装插件管理器,下载汉化插件

SublimeTest官网 © Sublime Text中文网 下载安装 一路点击安装即可 安装插件管理器 管理器官网安装 - 包控制 (packagecontrol.io) 手动安装将3 位置点击网址下载 再打开SublimeTest 点击 选择第一个Browse Packages..... 将会跳转到文件夹中 进入上一个文件夹 在进入…...

c++ ,stl经常出现的<>尖括号其实就是模板类的实例化

通过比如vector<int> 实际上是调用了类似模板template<T t>class vector{...}实例化了一个使用int的vector类来进行定义&#xff0c;我们可以尝试简单的做一个自己的array类 template<typename T1 ,int d2> class array1 {private:T1 *p;int size;public:ar…...

goproxy 简单介绍 及一键安装脚本

goproxy 官网 https://goproxy.cn/ GoProxy 是一项用于 Go 模块的高性能代理服务&#xff0c;旨在为 Go 开发人员提供更快速、更可靠的模块下载体验。它提供以下主要功能&#xff1a; 全球分布式代理服务器: GoProxy 在全球多个地区部署了代理服务器&#xff0c;例如拉斯维加…...

Day13-Python基础学习之数据分析案例

数据分析案例 data_define.py # 数据定义的类 class Record:def __init__(self, date, order_id, money, province):self.date dateself.order_id order_idself.money moneyself.province province ​def __str__(self):return f"{self.date}, {self.order_id}, {se…...

研究生,该学单片机还是plc。?

PLC门槛相对较低&#xff0c;但是在深入学习和应用时&#xff0c;仍然有很高的技术要求。我这里有一套单片机入门教程&#xff0c;不仅包含了详细的视频 讲解&#xff0c;项目实战。如果你渴望学习单片机&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&am…...

【Java】导出Mysql表表结构与注释数据字典

需求&#xff1a; 把mysql中所有表的字段名、数据类型、长度、注释整理成csv&#xff0c;做成数据字典。 import java.io.IOException; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import ja…...

第07-2章 TCP/IP模型

7.7 TCP/IP模型详解 7.7.1 简介 应用层的PDU>APDU&#xff08;Application PDU&#xff09; 表示层的PDU>PPDU&#xff08;Presentation PDU&#xff09; 会话层的PDU>SPDU&#xff08;Session PDU&#xff09; 7.7.2 TCP/IP协议体系 &#xff08;1&#xff09;TCP…...

【办公类-21-15】 20240410三级育婴师 712道单选题(题目与答案合并word)

作品展示 背景需求&#xff1a; 前文将APP题库里的育婴师题目下载到EXCEL&#xff0c;并进行手动整理 【办公类-21-13】 2024045三级育婴师 721道单选题 UIBOT下载整理-CSDN博客文章浏览阅读451次&#xff0c;点赞10次&#xff0c;收藏3次。【办公类-21-13】 2024045三级育婴…...

从数据焦虑到数字资产:WeChatExporter如何重塑你的微信记忆管理

从数据焦虑到数字资产&#xff1a;WeChatExporter如何重塑你的微信记忆管理 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因手机存储空间不足而不得不删除珍贵…...

活动策划27年:一场手印启动,让我读懂“谨慎”二字

活动策划27年&#xff1a;一场手印启动&#xff0c;让我读懂“谨慎”二字做活动策划27年&#xff0c;千余场活动下来&#xff0c;我常跟团队说&#xff1a;“做活动&#xff0c;不怕累&#xff0c;就怕措手不及的意外。”每一场活动前&#xff0c;我都要反复推演流程&#xff0…...

告别兼容性烦恼:在Vue/React项目中优雅集成sm-crypto国密算法(附IE9+解决方案)

告别兼容性烦恼&#xff1a;在Vue/React项目中优雅集成sm-crypto国密算法&#xff08;附IE9解决方案&#xff09; 国密算法作为国内信息安全领域的重要标准&#xff0c;在前端项目中的集成需求日益增长。然而&#xff0c;现代前端框架与老旧浏览器兼容性问题往往成为开发者的拦…...

CocoaPods终极版本管理指南:掌握语义化版本控制与依赖锁定策略

CocoaPods终极版本管理指南&#xff1a;掌握语义化版本控制与依赖锁定策略 【免费下载链接】CocoaPods The Cocoa Dependency Manager. 项目地址: https://gitcode.com/gh_mirrors/co/CocoaPods CocoaPods是iOS和macOS开发中最受欢迎的依赖管理器&#xff0c;它通过智能…...

EDA工具选型实战:从价格到价值的深度迁移指南

1. 从价格战到价值战&#xff1a;一次EDA工具市场策略的深度复盘十年前&#xff0c;当Altium宣布将其旗舰PCB设计软件Altium Designer的价格下调约75%时&#xff0c;整个电子设计自动化&#xff08;EDA&#xff09;圈子都炸开了锅。这无异于在由Cadence、Mentor Graphics&#…...

Keyviz完全指南:5分钟掌握实时键鼠可视化技巧

Keyviz完全指南&#xff1a;5分钟掌握实时键鼠可视化技巧 【免费下载链接】keyviz Keyviz is a free and open-source tool to visualize your keystrokes ⌨️ and &#x1f5b1;️ mouse actions in real-time. 项目地址: https://gitcode.com/gh_mirrors/ke/keyviz 你…...

对比使用Taotoken前后,个人开发者的月度AI调用成本变化

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比使用Taotoken前后&#xff0c;个人开发者的月度AI调用成本变化 在原型开发与日常编码辅助中&#xff0c;频繁调用大模型API已成…...

JPlag代码抄袭检测工具:如何高效识别17种编程语言的代码抄袭行为

JPlag代码抄袭检测工具&#xff1a;如何高效识别17种编程语言的代码抄袭行为 【免费下载链接】JPlag State-of-the-Art Source Code Plagiarism & Collusion Detection. Check for plagiarism in a set of programs. 项目地址: https://gitcode.com/gh_mirrors/jp/JPlag …...

氛围编程实战:用AI工具栈快速构建可部署应用

1. 项目概述&#xff1a;什么是“氛围编程”&#xff1f;如果你对“氛围编程”这个词感到陌生&#xff0c;或者觉得它听起来有点玄乎&#xff0c;那太正常了。我第一次听到时&#xff0c;也以为又是哪个硅谷弄潮儿发明的新潮黑话。但当我真正开始实践&#xff0c;并在几个月内从…...

别再只盯着应力云图了!用ANSYS Workbench的‘圣维南原理’和模型简化,把你的计算效率提升200%

别再只盯着应力云图了&#xff01;用ANSYS Workbench的‘圣维南原理’和模型简化&#xff0c;把你的计算效率提升200% 有限元分析工程师常常陷入一个误区&#xff1a;认为模型越精细&#xff0c;结果越准确。但现实情况是&#xff0c;一个未经合理简化的复杂模型不仅会消耗大量…...