JVM虚拟机(十)Java内存泄漏的排查思路

目录

    • 一、可能产生内存泄露的地方
    • 二、复现堆内存泄漏
    • 三、如何排查堆内存问题?
      • 3.1 获取对内存快照 dump
      • 3.2 使用 Visual VM 去分析 dump 文件
      • 3.3 定位内存溢出问题

一、可能产生内存泄露的地方

在进行排查 Java 的内存泄漏问题之前,首先我们要知道哪里可能会产生内存泄漏,我们来看看下面这张图:

在这里插入图片描述

在运行时数据区中,有三个地方可能会导致内存溢出或者内存泄漏:

  1. JVM Stacks 虚拟机栈: 报错是 StackOverFlowError,一般指递归造成的问题。
  2. Method Area/MetaSpace 方法区/元空间: OutOfMemoryError: Metaspace,一般指动态加载的类太多了。
  3. Heap 堆空间: 报错最常见的,报错是 OutOfMemoryError: java heap space,面试官一般主要关心的也是堆空间内存泄漏的问题,比如一些比较大的对象,一直存活,一直没有被垃圾回收器回收,这个就有可能会导致内存泄露的问题。

二、复现堆内存泄漏

接下来我们演示一下 Heap 堆空间 内存溢出的情况,代码如下:

public static void main(String[] args) {List<String> list = new ArrayList<>();while (true) {list.add("北京");}
}

这段代码比较简单,就是创建了一个 List,然后不断地向 List 中添加数据。在启动前,为了能够快速的看到我们的测试结果,我们需要添加一个 VM 参数 -Xmx10m,限制最大堆内存为10M:

这时候再去执行代码,报错如下:

  • java.lang.OutOfMemoryError: Java heap space

到目前为止,我们已经成功复现了堆内存泄漏的问题。


三、如何排查堆内存问题?

我们目前是在 IDEA 中进行了堆内存溢出的演示,从控制台可以清楚地看到报错的信息,也提示了具体哪一行代码可能导致内存溢出,我们只要找到这一行代码进行修复就可以了。但是我们的项目一般都是部署在服务器上的,这样的话该怎么排查呢?

举个例子,如下图所示:

比如说我们在服务器中部署了这些服务,这里面的每个微服务都有可能导致内存溢出,严重的话项目可能根本就没有启动起来,或者项目运行一段时间之后宕机了。这些都是有可能的,那这些问题应该怎么排查呢?

针对生产内存溢出问题的排查步骤:

  1. 获取堆内存快照 dump;
  2. 使用 Visual VM 去分析 dump 文件。
  3. 通过查看堆信息的情况,定位内存溢出问题。

下面我们就按照这个步骤去进行排查。

3.1 获取对内存快照 dump

  • 如果项目还在运行,我们可以通过 jmap 命令打印它的内存快照 dump。命令如下:
jmap -dump:format=b,file=heap.hprof <pid>

补充: Dump 文件是 Java 进程的内存镜像。可以把程序的执行状态通过调试器保存到 dump文件中。

  • 如果项目已经闪退了,我们可以通过在启动命令中添加 vm 参数的方式来生成 dump 文件。命令如下:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/app/dumps

举个例子,我们还是使用上面那段代码:

public static void main(String[] args) {List<String> list = new ArrayList<>();while (true) {list.add("北京");}
}

只是这次启动的时候,我们要在启动参数中加入我们上面提到的参数:

设置好 vm 参数之后,再次执行代码,结果如下:

可以看到,堆内存快照dump文件已经被存储下来了:

在这里插入图片描述

3.2 使用 Visual VM 去分析 dump 文件

接下来,我们来到 JAVA_HOME/bin/ 目录下,找到 Visual VM:

在这里插入图片描述

双击打开之后,点击 文件 -> 装入

在这里插入图片描述

首先切换文件类型为:堆 Dump,选择我们刚才导出的 dump 文件,打开。

打开之后,就可以看到导出的堆内存情况了:

在这里插入图片描述

3.3 定位内存溢出问题

从上图中可以看到,Visual VM 已经明确告诉我们程序发生了 OOM 异常,发生在 main 线程中,我们点击 main 就可以看到 main 线程的信息:

在这里插入图片描述

从上图中可以看出,这里已经明确提示了具体是哪一行代码出现了错误。我们只要在代码中找到这一行,检查一下这一行代码的上下文,就可以找到并解决掉问题。

以上就是 Java 内存泄漏的排查思路了。

整理完毕,完结撒花~🌻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/630779.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue接收接口返回的mp3格式数据并支持在页面播放音频

一、背景简介 在实际工作中需要开发一个转音频工具&#xff0c;并且能够在平台页面点击播放按钮播放音频 二、相关知识介绍 2.1 JS内置对象Blob Blob对象通常用于处理大量的二进制数据&#xff0c;可以读取/写入/操作文件、音视频等二进制数据流。Blob表示了一段不可变的二…

AI热潮下,公链基础设施赛道都有哪些变化?

最近在一级市场&#xff0c;最火热的赛道无疑是AI&#xff0c;其次是BTC&#xff0c;每天聊的项目80%都集中在这两个赛道&#xff0c;我个人最多的时候一天可以聊5&#xff0c;6个AI项目。 可以预见的是AI泡沫会在明后年达到顶峰&#xff0c;随着数以百计的AI新项目上线&#…

【EI会议征稿通知】2024年图像处理、机器学习与模式识别国际学术会议(IPMLP 2024)

2024年图像处理、机器学习与模式识别国际学术会议&#xff08;IPMLP 2024) 2024 International Conference on Image Processing, Machine Learning and Pattern Recognition 重要信息 大会官网&#xff1a;www.ipmlp.net&#xff08;点击参会/投稿/了解会议详情&#xff09;…

政安晨:【Keras机器学习示例演绎】(一)—— 利用类 U-Net 架构进行图像分割

目录 下载数据 准备输入图像的路径和目标分割掩码 一幅输入图像和相应的分割掩码是什么样子的&#xff1f; 准备数据集&#xff0c;以加载和矢量化成批数据 准备 U-Net Xception 风格模型 预留验证分割 训练模型 可视化预测 政安晨的个人主页&#xff1a;政安晨 欢迎 &…

京东微服务microApp使用总结

前言 基于现有业务门户进行微服务基础平台搭建 主应用框架&#xff1a;vue3vite 子应用框架&#xff1a;vue2webpack / vue3vite在这里插入代码片 本地调试即可&#xff1a;主应用子应用进行打通&#xff08;注意&#xff1a;两者都是vue3vite&#xff09; 问题总结 1.嵌入…

OpenHarmony多媒体-video_trimmer

简介 videotrimmer是在OpenHarmony环境下&#xff0c;提供视频剪辑能力的三方库。 效果展示&#xff1a; 安装教程 ohpm install ohos/videotrimmerOpenHarmony ohpm环境配置等更多内容&#xff0c;请参考 如何安装OpenHarmony ohpm包 。 使用说明 目前支持MP4格式。 视频…

(51单片机)第十一章-串行口应用提高

11.1 方式0应用 在第6章中&#xff0c;已经对51单片机的串行口结构做过详细介绍&#xff0c;并且通过实例讲解了串行口的4种工作方式中方式1的具体用法&#xff0c;本节详细讲述串行口方式0的用法。 串行口方式0被称为同步移位寄存器的输入/输出方式&#xff0c;主要用于扩展并…

Idea修改【Help->Edit Custom VM Options...】后,导致idea无法正常启动的解决方法

一、错误场景: 二、解决方法&#xff1a; 修改文件路径&#xff1a;C:\Users\tianjm&#xff08;写自己的用户名&#xff09;\AppData\Roaming\JetBrains\IdeaIC2024.1&#xff08;选自己安装的版本&#xff09;

【目标检测】Focal Loss

Focal Loss用来解决正负样本不平衡问题&#xff0c;并提升训练过程对困难样本的关注。 在一阶段目标检测算法中&#xff0c;以YOLO v3为例&#xff0c;计算置信度损失&#xff08;图中第3、4项&#xff09;时有目标的点少&#xff0c;无目标的点多&#xff0c;两者可能相差百倍…

视频质量度量VQM算法详细介绍

视频质量评价 视频质量评价(Video Quality Assessment,VQA)是指通过主观、客观的方式对视频图像的内容、画质等,进行感知、衡量与评价。 ITU definations subjective assessment: the determination of the quality or impairment of programme-like pictures presented…

vscode绿绿主题setting config

下载插件Green Tree Theme 选greentree ctrl shift p找到setting {"workbench.colorTheme": "Green Tree","editor.fontSize": 16.5, // 字号"workbench.colorCustomizations": {"[Green Tree]": {"activityBarBadge.…

编写Spark独立应用程序

执行本文之前&#xff0c;先搭建好spark的开发环境&#xff0c;我目前只搭建了standalone模式&#xff0c;参考链接 &#xff1a; Spark Standalone模式部署-CSDN博客 1. 安装sbt 1&#xff09;下载sbt 网址&#xff1a;https://www.scala-sbt.org/download.html &#xff0c…