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

JVM 性能分析案列——使用 JProfiler 工具分析 dump.hprof 堆内存快照文件排查内存溢出问题

在 windows 环境下实现。

参考文档

一、配置 JVM 参数

配置两个 JVM 参数:

  • -XX:+HeapDumpOnOutOfMemoryError,配置这个参数,会在发生内存溢出时 dump 生成内存快照文件(xxx.hprof)
  • -XX:HeapDumpPath=F:\logs,指定生成内存快照文件的路径。

为了测试方便,将堆内存设置小一点

  • -Xms512m,设置堆内存空间下限。
  • -Xmx512m,设置堆内存空间上限。
    在这里插入图片描述

经过上述配置,当发生内存溢出时,会生成对应的快照文件,如下:

在这里插入图片描述

发生内存溢出的代码

    public static void main(String[] args) {List<Byte> bytes = new ArrayList<>();while (true) {Byte[] b = new Byte[1024 * 10];bytes.addAll(Arrays.asList(b));}}

二、JProfiler 工具打开 .hprof 文件分析

1、打开.hprof 文件

在这里插入图片描述

2、Current Object Set(当前对象集)页面

打开后显示界面如下。只有堆遍历器是可用的,其他部分都是灰色不可以用状态。在 Heap Walker(堆遍历器)— Current Object Set(当前对象集)— Classes(类)选项下,展示所有类,默认按照类生成实例的数量排序。

在这里插入图片描述

由于分析内存溢出,这里按照占用内存大小进行排序

在这里插入图片描述

通过内存大小排序后,可以看到占用最大内存的类,其占据了大部分内存 181MB,可以大致定位是这个类的对象实例大量产生导致内存溢出,接着往下查找。选中这个类,点击右键 — Use Selected Instances — 选中(incoming references)— 确定,可以得到这个类的所有对象实例的引用关系,如下图:

在这里插入图片描述

可以看到这个类的所有实例大小,第一个实例对象占据大部分内存,可能是因为这个对象实例导致的内存溢出,展开栈内引用链,查看有哪些地方使用了这个对象,从而定位到有问题的调用地方

在这里插入图片描述
在这里插入图片描述

若引用这个对象的地方太多,上面看着不方便,可以通过调用示图查看。选中这个对象,点击右键 — Show In Graph,进入调用关系图,如下图:

在这里插入图片描述

选中某个模块对象,点击右键,基于红框中的三个选项继续寻找调用或被调用的对象图。

  • Show Incoming References:拓展调用者图谱
  • Show Outgoing References:拓展被调用者图谱
  • Show Paths To GC Root:沿着GC Root路径拓展调用者图谱
    在这里插入图片描述
    同样也可以定位到有问题的代码。
    在这里插入图片描述

3、Thread Dump(线程转储)

线程转储记录了快照时的所有线程,可以查看线程运行状态(运行、等待、阻塞等)和线程调用栈(展现线程执行的方法调用路径)。运行出现错误的线程会用一个特殊的图标标记。

在这里插入图片描述

相关文章:

  • Android网络收集和ping封装库
  • AI大眼萌探索 AI 新世界:Ollama 使用指南【1】
  • windows下mysql修改 my.ini的datadir后 `Access denied`
  • Pentest Muse:一款专为网络安全人员设计的AI助手
  • C语言经典例题-19
  • 民生银行信用卡中心金融科技24届春招面经
  • 日期工具类:获取 当前周 | 上一周 | 下一周 的第一天(周一)和最后一天(周天)
  • sherpa-onnx说话人识别+语音识别自动开启(VAD)+语音识别Python API
  • Win11下安装VS2022失败的解决办法
  • Java编程小练习题目
  • 外包IT运维解决方案
  • CATO原理中的数学与魔术(十四)——流程设计思路与升华
  • 强化学习中的自我博弈(self-play)
  • 数据库精选题(三)(SQL语言精选题)(按语句类型分类)
  • 解决 uniapp h5 页面在私有企微iOS平台 间歇性调用uni api不成功问题(uni.previewImage为例)。
  • [deviceone开发]-do_Webview的基本示例
  • 【347天】每日项目总结系列085(2018.01.18)
  • 0基础学习移动端适配
  • css的样式优先级
  • CSS实用技巧
  • CSS相对定位
  • Java超时控制的实现
  • node学习系列之简单文件上传
  • STAR法则
  • Twitter赢在开放,三年创造奇迹
  • web标准化(下)
  • 动态魔术使用DBMS_SQL
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 基于组件的设计工作流与界面抽象
  • 前嗅ForeSpider采集配置界面介绍
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 使用docker-compose进行多节点部署
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 优化 Vue 项目编译文件大小
  • gunicorn工作原理
  • 正则表达式-基础知识Review
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (3)llvm ir转换过程
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (二)linux使用docker容器运行mysql
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (面试必看!)锁策略