Java进阶之Dump文件初体验
视频地址:https://www.bilibili.com/video/BV1Ak4y137oh
学习文章:https://d9bp4nr5ye.feishu.cn/wiki/VQoAwlzrXiLFZekuLIyc1uK5nqc
最近线上频繁的内存告警,同事A通过分析dump文件解决了这个问题,我当然是不会放过这种学习的机会。
文章目录
- 一、分析dump文件
- 1、下载dump文件
- 2、查看dump文件
- 3、分析dump文件
- 二、扩展:JVM内存结构,回收规则
- 三、实战
一、分析dump文件
1、下载dump文件
步骤 | 命令 | 描述 |
---|---|---|
找到Java服务 | jps | 找到需要观察的Java服务进程。 也可以使用 ps -ef grep java 1. jps 属于JDK提供的命令 2. ps 是Linux提供的命令 |
生成dump文件 | jmap | jmap -dump:file=/tmp/xdx_dump.bin 1 上面命令的含义就是在 /tmp 目录下生成一个名为 xdx_dump 的文件,格式为 bin,java服务的进程 1 |
压缩dump文件 | tar | 在真实线上生成的 dump 文件都很大,所以我们需要把它压缩成 tar.gz 文件,可以减少6倍以上的大小。 tar -zcvf xdx_dump_one.tar.gz xdx_dump_one.bin 上面命令的含义就是 把当前目录下的xdx_dump_one.bin文件,压缩成 xdx_dump_one.tar.gz 文件 |
2、查看dump文件
可以通过两种方式获取查看dump文件的软件
- 官网下载,可以拿到最新版本。 https://visualvm.github.io/
- 在JDK的 home/bin 目录下已经带了这个工具,并且还是中文的。
从服务器上下载压缩后的dump文件,拿到本地后再解压出来,双击打开 visualvm,把解压好的bin文件拖进去。然后你就可以看到堆中的数据信息了。
3、分析dump文件
毫无疑问,内存飙升,我们只需要看看当前系统中内存占比最大的是个什么东西,然后想办法干掉它。
二、扩展:JVM内存结构,回收规则
为了方便理解后面实战的部分,需要准备一点前置知识:JVM内存结构和回收机制。
Hotspot VM将内存划分为不同的三个物理区:新生代、老年代、永久代。其中新生代又被分成Edun区和两个Survivor区。
描述 | |
---|---|
新生代 | 大多数对象在这里被创建,其中很多对象的生命周期很短。每次新生代的垃圾回收(又称Minor GC)后只有少量对象存活,所以选用复制算法,只需要少量的复制成本就可以完成回收。 新生代内又分三个区:一个Eden区,两个Survivor区(一般而言),大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到两个Survivor区(中的一个)。当这个Survivor区满时,此区的存活且不满足“晋升”条件的对象将被复制到另外一个Survivor区。对象每经历一次Minor GC,年龄加1,达到“晋升年龄阈值”后,被放到老年代,这个过程也称为“晋升”。显然,“晋升年龄阈值”的大小直接影响着对象在新生代中的停留时间。 |
老年代 | 在新生代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代,该区域中对象存活率高。老年代的垃圾回收(又称Major GC)通常使用“标记-清理”或“标记-整理”算法。整堆包括新生代和老年代的垃圾回收称为Full GC(HotSpot VM里,除了CMS之外,其它能收集老年代的GC都会同时收集整个GC堆,包括新生代)。 |
永久代 | 要存放元数据,例如Class、Method的元信息,与垃圾回收要回收的Java对象关系不大。相对于新生代和年老代来说,该区域的划分对垃圾回收影响比较小。 |
Minor GC 的频率远高于Major GC,所以对象一旦到达老年代,它存活的时间会更长。
三、实战
在我们查看dump文件的时候,发现内存占用前几名(比例很大)都是日志输出的对象。伪代码如下:
List<XdxDTO> list = this.baseMapper.getAllList();
log.info("当前数据为:{}", JSONUtil.toJsonStr(list));
正常来说在方法里面返回的数据都属于局部变量,当方法执行完毕之后就没有引用会被回收。
但使用log输出的时候,它是异步输出的,消费能力不足的时候,就会把任务丢到阻塞队列里面去,如果某个大对象这时候在阻塞队列等待执行,恰好Edun区满了要被回收的时候,日志还没输出相当于还有引用这个数据,就不会被回收,如果系统持续压力过大,经过几轮Minor GC还没用回收,这个对象就会被放老年代,更难以回收了, 从而导致了内存OOM。
相关文章:

Java进阶之Dump文件初体验
视频地址:https://www.bilibili.com/video/BV1Ak4y137oh 学习文章:https://d9bp4nr5ye.feishu.cn/wiki/VQoAwlzrXiLFZekuLIyc1uK5nqc 最近线上频繁的内存告警,同事A通过分析dump文件解决了这个问题,我当然是不会放过这种学习的机…...

基于扩展(EKF)和无迹卡尔曼滤波(UKF)的电力系统动态状态估计(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
曲线拟合(MATLAB拟合工具箱)位置前馈量计算(压力闭环控制应用)
利用PLC进行压力闭环控制的项目背景介绍请查看下面文章链接,这里不再赘述。 信捷PLC压力闭环控制应用(C语言完整PD、PID源代码)_RXXW_Dor的博客-CSDN博客闭环控制的系列文章,可以查看PID专栏的的系列文章,链接如下:张力控制之速度闭环(速度前馈量计算)_RXXW_Dor的博客-CSD…...
小程序使用echarts
参考文档:echarts官网、echarts-for-weixin 第一步引入组件库,可直接从echarts-for-weixin下载,也可以从echarts官网自定义生成,这里我们就不贴了组件库引入好后,就是页面引用啦,废话不多说,直…...
面向对象——封装
C面向对象的三大特性为:封装、继承、多态 C认为万事万物都皆为对象,对象上有其属性和行为 例如: 人可以作为对象,属性有姓名、年龄、身高、体重…,行为有走、跑、跳、吃饭、唱歌… 车也可以作为对象…...

【LeetCode】160.相交链表
题目 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结…...
【JWT的使用】
文章目录 前言1、用户登录1.1 JWTThreadLocal 2.1 代码实现2.1.1 ThreadLocal工具类2.2.2 定义拦截器2.2.3 注册拦截器 前言 1、用户登录 1.1 JWT JSON Web Token简称JWT,用于对应用程序上用户进行身份验证的标记。使用 JWTS 之后不需要保存用户的 cookie 或其他…...
Python获取音视频时长
Python获取音视频时长 Python获取音视频时长1、安装插件2、获取音视频时长.py3、打包exe4、下载地址 Python获取音视频时长 1、安装插件 pip install moviepy -i https://pypi.tuna.tsinghua.edu.cn/simple2、获取音视频时长.py 上代码:获取音视频时长.py # -*-…...
TCP四次握手为什么客户端等待的时间是2MSL
目录 什么是MSL从第三次握手开始分析总结 什么是MSL MSL是Maximum Segment Lifetime英文的缩写,中文可以译为“报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。 从第三次握手开始分析 第三次握手服务端…...

Android Studio 启用设备远程调试配置完整步聚
启用手机设置->开发者选项-无线调试,然后选择允许 已启用后无线调试变成绿色 ,点击无线调试进入详情页面 点击Android Studio的Device Manager 下的WIFI图标 会弹出下图窗口 打开手机的开发者选项中的WIFI调试(无线调试)下的使用二维码配对设备进行扫描. 设备配对成功后手机…...

玩转LaTeX(三)【数学公式(基础)、矩阵、多行公式】
数学公式基础 导言区(引包) \usepackage{amsmath} %带星号的eqution 正文区 \begin{document}%数学公式初步 \section{简介} \LaTeX{}将排版内容分为文本模式和数学模式。文本模式用于普通文本排版,数学模式用于数学公式排版。 …...

jenkins 配置git
在linux 中输入 保证git 安装成功 git --version使用查看git 安装目录(非源码安装直接用yum 安装的) which gitjenkins 中到 系统管理–>全局工具配置–> Git installations 新建一个项目 选择自由风格 源码管理选择 git 如果使用的是码云&a…...
单机部署MinIo并设置开机自启
MinIO 是高性能的对象存储,是为海量数据存储、人工智能、大数据分析而设计的,它完全兼容Amazon S3接口,单个对象最大可达5TB,适合存储海量图片、视频、日志文件、备份数据和容器/虚拟机镜像等。MinIO主要采用Golang语言实现&#…...

Latex | 使用MATLAB生成.eps矢量图并导入Latex中的方法
一、问题描述 用Latex时写paper时,要导入MATLAB生成的图进去 二、解决思路 (1)在MATLAB生成图片的窗口中,导出.eps矢量图 (2)把图上传到overleaf的目录 (3)在文中添加相应代码 三…...
宝塔面板定时任务重启各种服务
一个php项目,laravel框架,使用了nginx php redis mysql 还有进程守护supervisor,用于laravel的异步队列进程queue,当服务器重启后有可能部分服务没有成功启动这个时候可以用定时任务去检查服务状态,然后对不正常的自动…...
Ansible playbook编写
目录 palybooks 组成示例:运行palybook定义,引用变量when 条件判断循环Templates模块tags 模块 palybooks 组成 Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行Variables:变量Temp…...

个人博客系统 -- 登录页面添加图片验证码
目录 1. 功能展示 2. 前段代码 3. 后端代码 1. 功能展示 在登录页面添加验证码登录 1. 检测到没有输入验证码或者输入的验证码错误时,进行弹窗提示.并且刷新当前验证码图片 2. 点击验证码进行刷新 2. 前段代码 1. 添加验证码标签,在密码的下面,在login.html进行修改 主要…...

剑指offer10-I.斐波那契数列
学计算机的对这道题肯定不陌生,我记得是学C语言的时候学递归的时候有这道题,于是我就世界用递归写了如下代码: class Solution {public int fib(int n) {if(n1) return 1;if(n0) return 0;return (fib(n-1) fib(n-2)) % 1000000007;} } 到…...

13年测试经验,性能测试-压力测试指标分析总结,看这篇就够了...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 一般推荐…...
大数据课程D3——hadoop的Source
文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握Source的AVRO Source; ⚪ 掌握Source的Exec Source; ⚪ 掌握Source的Spooling Directory Source; ⚪ 掌握Source的Netcat Source; ⚪ 掌握Source的Sequence Generator Source;…...

前端开发面试题总结-HTML篇
文章目录 HTML面试高频问答一、HTML 的 src 和 href 属性有什么区别?二、什么是 HTML 语义化?三、HTML的 script 标签中 defer 和 async 有什么区别?四、HTML5 相比于 HTML有哪些更新?五、HTML行内元素有哪些? 块级元素有哪些? 空(void)元素有哪些?六、iframe有哪些优点…...

2025年6月6日第一轮
2025年6月6日 The rapid in Chiese industdy is developnig e,and it is From be in a enjoy a deep is developing The drone industry in China is developing The drone industy in china develops rapidly and is in a leading position in in the world. The dro…...

通过阿里云 DashScope API 调用通义千问
获取API Key 百炼控制台https://bailian.console.aliyun.com/?tabmodel#/api-key 步骤 1:安装 DashScope SDK pip install dashscope 步骤 2:LangChain 调用 from langchain_community.llms import Tongyi# 设置阿里云 API Key(从环境变…...
Go 语言 := 运算符详解(短变量声明)
Go 语言 : 运算符详解(短变量声明) : 是 Go 语言中特有的短变量声明运算符(short variable declaration),它提供了简洁的声明并初始化变量的方式。这是 Go 语言中常用且强大的特性之一。 基本语法和用途 va…...
Shell编程核心符号与格式化操作详解
Shell编程作为Linux系统管理和自动化运维的核心技能,掌握其常用符号和格式化操作是提升脚本开发效率的关键。本文将深入解析Shell中重定向、管道符、EOF、输入输出格式化等核心概念,并通过丰富的实践案例帮助读者掌握这些重要技能。 一、信息传递与重定…...

Keil开发STM32生成hex文件/bin文件
生成hex文件生成bin文件 STM32工程的hex文件和bin文件都可以通过Keil直接配置生成 生成hex文件 工程中点击魔术棒,在 Output 中勾选 Create HEX File 选项,OK保存工程配置 编译工程通过后可以看到编译输出窗口有创建hex文件的提示 默认可以在Output文…...
OpenCV 键盘响应来切换图像
一、知识点 1、int waitKey(int delay 0); (1)、等待按键。 等待指定的毫秒数,返回按键的ASCII码。 (2)、返回值: int型,表示按键ASCII码。 若没有按键,指定时间过去,返回-1。 (3)、参数delay: 等待时间,单位毫…...
Java Fork/Join框架:三大核心组件深度解析
ForkJoinTask、ForkJoinWorkerThread 和 ForkJoinPool 构成了 Java 中 Fork/Join 框架的三个核心组件,它们之间形成了紧密的协作关系,共同提供了高效的并行计算能力。 三者关系概述 ForkJoinPool:执行环境,管理工作线程和任务调…...
分布式Session处理的五大主流方案解析
在分布式环境下,Session 处理的核心挑战是确保用户请求在不同服务器间流转时能保持会话状态一致。以下是主流解决方案及优缺点分析: 🔐 一、集中存储方案(主流推荐) Redis/Memcached 存储 原理:将 Session…...

跳转指令四维全解:从【call/jmp 】的时空法则到内存迷宫导航术
一、核心概念:代码世界的空间定位法则 在汇编世界里,我们可以把内存想象成一栋巨大的图书馆: CS(代码段寄存器) 楼层编号 IP(指令指针) 房间编号 当前执行位置 CS:IP(如3楼201…...