Java的dump文件分析及JProfiler使用

article/2025/8/31 16:13:46

Java的dump文件分析及JProfiler使用

1 dump文件介绍

从软件开发的角度上,dump文件就是当程序产生异常时,用来记录当时的程序状态信息(例如堆栈的状态),用于程序开发定位问题。

idea配置发生OOM的时候指定路径生成dump文件

# 指定发生OOM异常的时候,在d盘下生成对应的dump文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:\

2 JProfiler介绍

2.1 下载

JProfiler下载:
链接:https://pan.baidu.com/s/1WXCc4FMOC3QQtjkhY4Qeow
提取码:5xrm
版本:JProfiler 12.0.4

2.2 与idea集成

  1. 本地windows下载并安装好JProfiler

  2. idea安装JProfiler插件
    在这里插入图片描述

  3. 指定本地windows的JProfiler路径[settings - tools]

在这里插入图片描述
4. 点击图标启动,JProfiler就默认监控到了指定Java程序
在这里插入图片描述

2.3 基本使用

①JProfiler基本参数

在概览页我们可以清晰的看到内存使用量、垃圾收集活动、类加载数量、线程个数和状态、CPU 使用率等指标随时间变化的趋势。

在这里插入图片描述
通过此图,我们可以作出如下基本判断:

  • 程序在运行过程中会产生大量对象,但这些对象生命周期极短,大部分都能被垃圾收集器及时回收,不会造成内存无限增长。
  • 加载类的数量在程序初始时增长较快,随后保持平稳,符合预期。
  • 在程序运行过程中,有大量线程处于阻塞状态,需要重点关注。
  • 在程序刚启动时,CPU 使用率较高,需要进一步探究其原因。

②测试分析dump文件

  1. 模拟OOM
public class JProfilerTest {public static void main(String[] args) throws InterruptedException {List<byte[]> list = new ArrayList<>();while (true) {byte[] bytes = new byte[1024 * 1024 * 50];list.add(bytes);TimeUnit.SECONDS.sleep(1);}}
}
  1. 程序添加VM Options
# 监控OOM,发生OOM之后指定dump文件生成到d:\
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:\

在这里插入图片描述

  1. JProfiler方式启动程序,观察控制台打印

程序运行一段时间之后,发生OOM异常
在这里插入图片描述
5. 查看dump文件,用JProfiler打开
在这里插入图片描述
6. 分析dump文件
在这里插入图片描述

查看最大对象内部结构

在这里插入图片描述

可以发现是改list中含有了太多的byte[]数组

ps:其他查看方法类似

3 常见JVM问题

3.1 OOM

①堆溢出

原因:

1. 无法在Java堆中分配对象
2. 应用程序保存了无法被GC回收的对象
3. 程序过度使用finalizer

排查思路:

  1. 查看关键报错信息
  2. 使用内存映像分析工具(MAT或JProfiler)分析dump文件,分析是内存泄漏还是内存溢出
  3. 如果是内存泄漏,通过工具查看泄漏对象到GC Roots引用链,修复内存泄漏
  4. 如果不是,检查代码是否有死循环,递归等,再考虑用-Xmx增加堆大小

demo代码JVM配置参数:

  • -Xms20m JVM初始分配的内存20m
  • -Xmx20m JVM最大可用内存为20m
  • -XX:+HeapDumpOnOutOfMemoryError 当JVM发生OOM时,自动生成DUMP文件
  • -XX:HeapDumpPath=/Users/mytest/Desktop/dump/ 生成DUMP文件的路径

②栈溢出

栈:虚拟机栈和本地方法栈,关于栈,Java虚拟机规范中描述了两种异常:

  • StackOverflowError:线程请求的栈深度大于虚拟机所允许的深度
  • OOM:如果虚拟机栈可以动态扩展,当扩展时无法申请到足够的内存时会抛出

原因:

1. 单个线程下,栈帧太大或虚拟机栈容量太小,内存无法分配
2. 不断建立线程

排查思路:

  • 查看关键报错信息,确定是StackOverflow还是OOM
  • 如果是StackOverflow,检查代码是否存在递归
  • 如果是OOM,检查是否有死循环创建线程或调用第三方接口创建线程,通过-Xss降低每个线程栈大小

③方法区溢出

方法区(又叫永久代,JDK8之后元空间替换了永久代),用于存放Class的相关信息,如:类名、访问修饰符、常量池、字段描述、方法描述等。运行时产生大量的类,会填满方法区,造成溢出。

溢出原因:

1. 使用CGLib生成大量代理类
2.Jdk7之前,频繁错误的使用String.intern方法
3. 大量jsp和动态产生jsp
4. 应用长时间运行,没有重启

排查思路:

  • 检查是否永久代空间设置的过小
    -XX:MetaspaceSize=10M -XX:MaxMetaspaceSize=10M
  • 是否频繁错误使用String.intern
  • 是否与jsp有关
  • 是否使用CGLib生成大量代理类
  • 重启JVM

④直接内存溢出

直接内存不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。但是,这部分也被频繁的使用,也可能导致OOM。

原因:

1. 本机直接内存不受到Java堆大小限制,但是受到本机总内存大小限制
2. 直接内存由-XX:MaxDirectMemorySize指定,如果不指定,默认与Java堆最大值一样(-Xmx3. NIO程序中,使用ByteBuffer.allocateDirect(capability)分配的是直接内存,可能导致直接内存溢出

排查思路:

  • 检查代码是否恰当
  • 检查JVM参数-Xmx(java堆最大值),-XX:MaxDirectMemorySize是否合理

参考:https://zhuanlan.zhihu.com/p/95150243


http://chatgpt.dhexx.cn/article/JBYoPNcA.shtml

相关文章

获取和分析Dump的几种工具简介

最近在进一步学习support技能的时候&#xff0c;了解到分析Dump的重要性&#xff0c;经过学习&#xff0c;做一些笔记。 一、什么是Dump文件。 Dump文件时进程的内存镜像。可以把程序的执行状态保存到Dump文件中。Dump文件分为内核模式Dump和用户模式Dump。其中内核模式Dump是…

JVM-通过MAT工具对dump文件进行分析

文章目录 MAT工具介绍下载安装使用OverviewHistogramDominator_TreeOQLThread_OverviewLeak Suspects MAT工具介绍 MAT(Memory Analyzer Tool)&#xff0c;一个基于Eclipse的内存分析工具&#xff0c;是一个快速、功能丰富的JAVA heap分析工具&#xff0c;它可以帮助我们查找内…

错误号码2058:Plugin caching sha2_password could not be loaded

安装SQLyog之后&#xff0c;新建接口&#xff0c;输入密码&#xff0c;点击连接&#xff0c;发现出现了如下的错误&#xff1a; 1.错误的原因 SQLyog加密方式出现了错误&#xff0c;这时由于 插件缓存——sha2_密码无法进行加载所导致的。 2.解决方法 在开始菜单中输入命令…

2023/06/28

文章目录 1.export和export default的区别2.npm和cnpm的区别3.npm run dev/serve的区别4.slice、splice和split的区别 1.export和export default的区别 模块功能主要由两个命令构成&#xff1a;export和import。export命令用于规定模块的对外接口&#xff0c;import命令用于输…

02.07 SQLyog连接MySQL数据库时报2058错误(转载)

使用SQLyog连接MySQL时报了这样一个错 “错误号码2058&#xff0c;Plugin caching——sha2_passward could not be loaded:******** ”(乱码) 将报错信息翻译&#xff1a;“插件缓存——sha2_密码无法进行加载”&#xff0c;这是由于你的SQLyog mysql 密码加密方法变了&#…

【C++】2058:【例3.10】简单计算器(信息学奥赛)

好了&#xff0c;今天的内容就是有简单计算器了&#xff0c;内容的详细意思也就是一个最简单的计算器支持&#xff0c;-&#xff0c;*&#xff0c;/四种运算然后根据输入输出结果。&#xff08;博主正在冲200粉丝&#xff0c;喜欢的赶紧关注&#xff01;&#xff01;&#xff0…

【MySQL2058】MySQL远程连接错误码2058

Docker安装的MySQL&#xff0c;突然服务器登录正常&#xff0c;但是使用SQLyog登录报异常&#xff1a; MySQL错误号码 2058上网上巴拉巴拉半天&#xff0c;各种说法都有&#xff0c;最后综合网上各种教程方案&#xff0c;解决了自己的问题&#xff0c;最后将自己的解决方案罗列…

解决SQLyog连接MySQL出现2058错误

解决SQLyog连接MySQL出现2058错误 1、确定你的mysql命令能运行&#xff0c;像下面这样&#xff1a; 2、如果出现这种情况&#xff1a; 解决方法一&#xff1a; 配置系统环境变量path的值&#xff0c;将安装MySQL路径下的bin路径&#xff1a;MySQL安装目录\bin&#xff0c;配置…

SQLyog连接数据库报错2058

命令符界面登录MySQL然后输入命令 ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 新密码; 修改密码的加密方式即可。

使用sqlyog连接数据库时出现错误(2058)解决方法

出现这个原因是MySQL8之前的版本中加密规则是mysql_native_password&#xff0c;而在MySQL8之后&#xff0c;加密规则 是caching_sha2_password。解决问题方法有两种&#xff1b; &#xff08;1&#xff09;第一种是升级图形界面工具版本 &#xff08;2&#xff09;第二种是把M…

SQLyog出现2058错误的解决方法

① WinR打开终端&#xff0c;输入cmd ②输入 mysql -u root -p 然后输入密码 &#xff08;root&#xff09; ③依次执行以下语句 ALTER USER’root’‘localhost’ IDENTIFIED BY ‘root’ PASSWORD EXPIRE NEVER; #修改加密规则 ALTER USER’root’‘localhost’ IDENTIFIED…

使用sqlyog连接mysql时出现错误号码2058的解决方法

1、使用命令行&#xff08;winR --> cmd&#xff09;登录mysql&#xff0c;需要输入密码&#xff1b;若出现如下界面&#xff0c;登录成功。 2、输入 use mysql&#xff1b;&#xff08;分号要有&#xff09; 3、输入 select user,host from user; 出现如下界面。 4、从上…

SQLyog连接MySQL8.0.24远程服务器 ,报错:2058的解决方法

写在前面&#xff1a; 我热爱技术&#xff0c;热爱分享&#xff0c;热爱生活&#xff0c; 我始终相信&#xff1a;技术是开源的&#xff0c;知识是共享的&#xff01; 博客里面的内容大部分均为原创&#xff0c;是自己日常的学习记录和总结&#xff0c;便于自己在后面的时间里回…

sqlyog连接mysql错误码2058

一、⾸先保证你的MySQL数据库安装成功 cmd命令下mysql -u root -p 连接出错如上&#xff0c;原因是加密⽅式变了&#xff0c;现在是root的授权没刷新&#xff0c;我们重置⼀下密码。sqlyog配置新连接报错&#xff1a;错误号码2058&#xff0c;是因为mysql密码加密⽅法变了。 …

SQLyog连接mysql8.0时报错(错误号码2058)

本文将详细说明解决SQLyog连接mysql8.0时&#xff0c;SQLyog Ultimate显示报错信息并附带乱码&#xff1a;“错误号码2058&#xff0c;Plugin caching——sha2_passward could not be loaded:******** ”(最后一段信息是乱码)。 如下图所示&#xff1a; 将报错信息翻译过来就是…

SQLyog连接MySQL时出现2058错误解决方法

解决方案 第一步 WinR→cmd打开命令提示符&#xff0c; 输入以下命令&#xff1a;mysql -u root -p 1.1 提示Enter password&#xff0c;输入密码即可 1.2 如果提示“mysql不是内部或外部命令&#xff0c;也不是可运行的外部程序或批处理文件。” 如下图 解决此错误有两种…

Mysql出现问题:ERROR 2058: Plugin caching_sha2_passward could not be loaded解决方案

回城传送–》《数据库问题解决方案》 ❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作者🏆,阿里云专家博主🏆,51CTO专家博主🏆 ❤️技术活,该赏 ❤️点赞 👍 收藏 ⭐再看,养成…

mysql出现2058,连接MySQL报“Error No.2058 Plugin caching_sha2_password could not be loaded”

问题重现 使用sqlyog连接linux系统下docker中的mysql8.0.11时报错plugin caching_sha2_password could not be loaded 问题原因 MySQL8.0新版默认使用caching_sha2_password作为身份验证插件&#xff0c;而旧版是使用mysql_native_password 而sqlyog默认是使用mysql_native_…

MySql8.0版本连接sqlyog时出现错误号码2058 和1045错误

错误号码2058乱码 在下载完MySQL8.0.31和sqlyog后&#xff0c;尝试用sqlyog连接数据库 出现了错误号码2058 Plugin caching _sha2_password could not be loaded:乱码问题 原因分析&#xff1a; 出现这个原因是Mysql之前的版本中加密规则是mysqlnative_password&#xff0c…

sqlyog错误号码2058解决方式

新建连接报错&#xff0c;错误号码2058 windows系统打开cmd命令行窗口&#xff0c;输入mysql -uroot -p 输入密码&#xff0c;登录mysql&#xff0c;再输入下面这行代码&#xff0c;password替换成你的密码。 ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_passwo…