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

Java的dump文件分析及JProfiler使用

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基本参数

②测试分析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

相关文章:

Java的dump文件分析及JProfiler使用

Java的dump文件分析及JProfiler使用 1 dump文件介绍 从软件开发的角度上&#xff0c;dump文件就是当程序产生异常时&#xff0c;用来记录当时的程序状态信息&#xff08;例如堆栈的状态&#xff09;,用于程序开发定位问题。 idea配置发生OOM的时候指定路径生成dump文件 # 指定…...

sympy高斯光束模型

文章目录Gauss模型sympy封装实战sympy.phisics.optics.gaussopt集成了高斯光学中的常见对象&#xff0c;包括光线和光学元件等&#xff0c;有了这些东西&#xff0c;就可以制作一个光学仿真系统。Gauss模型 高斯光束的基本模型为 E(r,z)E0ω0ω(z)exp⁡[−r2ω2(z)]exp⁡[−ik…...

Cloudflared 内网穿透 使用记录

Cloudflared 内网穿透前提创建cloudflared tunnel我使用的服务前提 你必须要有一个域名&#xff0c;并且可以改域名的dns解析服务商到cloudflare 1.登录到cloudflare后台&#xff0c;点击添加站点 2.输入自己的域名&#xff0c;下一步选择免费套餐 3.他会搜索这个域名下已有…...

柴油发电机组的调压板

1 概述 柴油发电机组的调压板是一种用于控制发电机输出电压的装置。它通常由一块电子电路板和一个电子电路板上的电位器组成。 当发电机运行时&#xff0c;它会产生电压&#xff0c;然后通过调压板中的电路进行控制。调压板中的电路会检测输出电压的大小&#xff0c;并通过电…...

【MySQL】表操作和库操作

文章目录概念库操作1.创建数据库2.删除数据库3.选择数据库4.显示数据库列表表操作1.创建数据表CREATE2.删除数据表DROP3.插入数据INSERT4.更新数据UPDATE5.修改数据ALTER6.查询数据SELECT7.WHERE子句8.ORDER BY子句9.LIMIT子句10.GROUP BY子句11.HAVING子句使用注意事项概念 M…...

拓扑排序的思想?用代码怎么实现

目录 一、拓扑排序的思想 二、代码实现&#xff08;C&#xff09; 代码思想 核心代码 完整代码 一、拓扑排序的思想 以西红柿炒鸡蛋这道菜为例&#xff0c;其中的做饭流程为&#xff1a; 中间2 6 3 7 4的顺序都可以任意调换&#xff0c;但1和5必须在最前面&#xff0c;这是…...

【Git】码云

目录 5、 Git 团队协作机制 5.1 团队内协作 5.2 跨团队协作 6、 Gitee码云 操作 6.1 创建远程仓库 6.2 远程仓库操作 6.3 SSH 免密登录 5、 Git 团队协作机制 5.1 团队内协作 5.2 跨团队协作 6、 Gitee码云 操作 码云网址&#xff1a; https://githee.com/ 账号验证…...

数据结构与算法(三):栈与队列

上一篇《数据结构与算法&#xff08;二&#xff09;&#xff1a;线性表》中介绍了数据结构中线性表的两种不同实现——顺序表与链表。这一篇主要介绍线性表中比较特殊的两种数据结构——栈与队列。首先必须明确一点&#xff0c;栈和队列都是线性表&#xff0c;它们中的元素都具…...

Spring架构篇--2.5.2 远程通信基础Select 源码篇--window--sokcet.register

前言&#xff1a;通过Selector.open() 获取到Selector 的选择器后&#xff0c;服务端和客户的socket 都可以通过register 进行socker 的注册&#xff1b; 服务端 ServerSocketChannel 的注册&#xff1a; ServerSocketChannel serverSocketChannel ServerSocketChannel.open(…...

ISIS协议

ISIS协议基础简介应用场景路由计算过程地址结构路由器分类邻居Hello报文邻居关系建立DIS及DIS与DR的类比链路状态信息的载体链路状态信息的交互路由算法网络分层路由域![在这里插入图片描述](https://img-blog.csdnimg.cn/9027c43b614a4399ae1f54e87a37f047.png)区域间路由简介…...

CRM系统哪种品牌的好?这五款简单好用!

CRM系统哪种品牌的好&#xff1f;这五款简单好用&#xff01; CRM系统是指利用软件、硬件和网络技术&#xff0c;为企业建立一个客户信息收集、管理、分析和利用的信息系统。CRM系统的基础功能主要包括营销自动化、客户管理、销售管理、客服管理、报表分析等&#xff0c;选择合…...

QT_dbus(ipc进程间通讯)

QT_dbus(ipc进程间通讯) 前言&#xff1a; 参考链接&#xff1a; https://www.cnblogs.com/brt3/p/9614899.html https://blog.csdn.net/weixin_43246170/article/details/120994311 https://blog.csdn.net/kchmmd/article/details/118605315 一个大型项目可能需要多个子程序同…...

华为OD机试 - 数组排序(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…...

字符串转换为二进制-课后程序(JAVA基础案例教程-黑马程序员编著-第五章-课后作业)

【案例5-4】 字符串转换为二进制 【案例介绍】 1.任务描述 本例要求编写一个程序&#xff0c;从键盘录入一个字符串&#xff0c;将字符串转换为二进制数。在转换时&#xff0c;将字符串中的每个字符单独转换为一个二进制数&#xff0c;将所有二进制数连接起来进行输出。 案…...

SpringIOC

一、为什么要使用Spring&#xff1f; Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用&#xff0c;但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发&#xff0c;并通过POJO为基础的编程模型促进良好的编程习惯。 为…...

Debezium系列之:基于数据库信号表和Kafka信号Topic两种技术方案实现增量快照incremental技术的详细步骤

Debezium系列之:基于数据库信号表和Kafka信号Topic两种技术方案实现增量快照incremental技术的详细步骤 一、需求背景二、增量快照技术实现的两种方案三、基于数据库信号表实现增量快照技术的原理1.基于水印的快照2.信令表3.增量快照4.连接起重启四、基于数据库信号表实现增量…...

华为OD机试 - 第 K 个最小码值的字母(Python) | 机试题+算法思路+考点+代码解析 【2023】

第 K 个最小码值的字母 题目 输入一个由n个大小写字母组成的字符串 按照 ASCII 码值从小到大进行排序 查找字符串中第k个最小 ASCII 码值的字母(k>=1) 输出该字母所在字符串中的位置索引(字符串的第一个位置索引为 0) k如果大于字符串长度则输出最大 ASCII 码值的字母所在…...

PointNet++训练自己的数据集(附源码)

本文针对PointNet强大的三维点云分类功能&#xff0c;详细讲解怎么训练自己的数据集&#xff0c;在此之前&#xff0c;需要确保已经能够跑通源码的训练和测试&#xff0c;如果没有&#xff0c;请参考PointNet的源码运行。数据放置1.1. 在mytensor_shape_names.txt中配置自己的分…...

ROS2可视化利器---Foxglove Studio

0. 简介 之前作者已经讲了《ROS1可视化利器—Webviz》&#xff0c;然后就有读者问&#xff0c;ROS2有没有可以使用的可视化工具呢&#xff0c;答案是肯定的&#xff0c;除了plotjuggler这种ROS1和ROS2通用的可视化利器&#xff0c;还有一种全平台通用的软件FoxgloveStudio&…...

python实战应用讲解-【语法基础篇】流程控制-控制流的元素及语句(附示例代码)

目录 控制流的元素 条件 代码块 程序执行 代码块嵌套 控制流语句 if 语句...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...