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 内存泄漏的排查思路了。

整理完毕,完结撒花~🌻

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据可视化-ECharts Html项目实战(12)

在之前的文章中&#xff0c;我们深入学习ECharts特殊图表中的矩形树图以及Echarts中高级功能的多图表联动。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 数…

通过IP地理位置阻止网络攻击:有效性与局限性

网络攻击已成为当今互联网世界中的一项常见挑战。黑客和恶意用户利用各种手段对网络系统进行攻击&#xff0c;造成数据泄露、服务中断甚至财产损失。在这种背景下&#xff0c;寻找有效的网络安全解决方案变得至关重要。 IP地理位置阻止是一种基于黑名单的网络安全措施。它的原…

最新SpringBoot项目财务管理系统

采用技术 最新SpringBoot项目财务管理系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 系统登录页面 管理员功能 管理员功能页面 员工管理页面 部…

Python采集海外电影信息,Roxlabs全球IP代理轻松搞定

一、为什么要学会应用 IP 代理技术二、采集海外电影信息爬虫实战2.1 选择目标网站并生成代理2.2 编写爬虫并设置代理2.3 运行爬虫2.4 处理数据2.5 完整代码 三、Roxlabs 代理及优势分析四、快速应用Roxlabs代理功能4.1 领免费流量4.2 代理类型4.3 获取代理4.4 配置代理设置4.5 …

进销存是什么?怎么快速上手制作进销存报表?

在现代商业运营中&#xff0c;进销存管理是企业持续稳健发展的关键组成部分。为了更好地把握库存状况、合理调配资源、提高决策效率&#xff0c;企业采用进销存报表是一种极为有效的手段。本文将从进销存的基本概念、报表的内容和意义&#xff0c;以及如何制作进销存报表等方面…

opencv的cmake报错

opencv编译报错 CMakeDownloadLog.txt #use_cache "D:/opencv/.cache" #do_unpack "ippicv_2021.8_win_intel64_20230330_general.zip" "71e4f58de939f0348ec7fb58ffb17dbf" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/1…

Ctags的安装和使用

ctags 是一个代码跟踪软件 由于在源码中&#xff0c;具有海量的代码&#xff0c;如果我们在源码中找特定的代码&#xff0c;需要大量时间&#xff0c;但是ctags则可以快速寻找 安装&#xff1a; sudo apt-get install ctagsctags使用 ctrl] //代码跟踪 crlT //代码返回我们…

鸿蒙入门06-常见装饰器( 简单装饰器 )

装饰器是鸿蒙开发中非常重要的一个环节因为在很多地方我们都需要用到装饰器并且如果我们想高度的复用, 那么装饰器就是必不可少的一环接下来我们就来介绍一些常见的装饰器注意 : 所有装饰器首字母大写 Entry 用来装饰 struct 使用表示页面的入口 Component 装饰 struct, …

算法课程笔记——常用库函数

memset初始化 设置成0是可以每个设置为0 而1时会特别大 -1的补码是11111111 要先排序 unique得到的是地址 地址减去得到下标 结果会放到后面 如果这样非相邻 会出错 要先用sort排序 O&#xff08;n&#xff09;被O&#xff08;nlogn&#xff09;覆盖

Axure引用ECharts图表 解决火狐浏览器出错

Axure原型添加Echarts图表&#xff0c;没耐心看文章的可以直接下载示例 Axure中使用ECharts图表示例 1. 打开Axure新建页面 2. 页面添加元件 元件类型随意&#xff0c;矩形、动态面板、热区、图片 甚至段落都可以3. 命名元件 随意命名&#xff0c;单个页面用到多个图表时名…

【目标检测】Focal Loss

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

为主机配置IP

第一种方法:nmcli #nmcli connection modify eth0 ipv4.method manual ipv4.addresses 172.25.254.100/24 ipv4.gateway 172.25.254.2 ipv4.dns 114.114.114.114 autoconnect yes #nmcli c up etho //激活网卡命令(网卡早就配好,只是修改ip就不用输入这条命令了) 第二…

SpringMVC(五)【拦截器】

前言 今天来把 SpringMVC 最后一部分学完&#xff0c;虽然课时很短&#xff0c;但是学起来还是很慢的&#xff0c;不过确收获很大。不得不感慨学大数据确实有必要把 SSM、SpringBoot 等各种 JavaEE 技术好好学一学&#xff0c;收获很大&#xff0c;尽管我们到现在 Java 代码写了…

循环双链表的操作

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 每一个裂缝都是为透出光而努力&#…

BIM数据管理快速指南

在我的日常工作中&#xff0c;作为数字协作协调员&#xff0c;我花费大量时间收集、检查和管理各种 BIM 数据。 很多次收到一组数据后我就无奈地举手——质量远远达不到我可以使用的程度。 然后我会开始一个普通的数据清理过程。 我无数次咒骂过这种情况——大多数建设项目的人…

qt 开发 缩放比例问题 修复中

在日常开中&#xff0c;需要开启 高分辨率的支持&#xff0c;windows环境下&#xff0c;不是 字体缩放&#xff0c;就是分辨率模糊&#xff0c;缩放机制&#xff0c;并且开启了150%缩放&#xff0c;有点搞不明白&#xff0c;最后还是不行&#xff0c;先做个记录&#xff0c;在找…

windows部署pgsql

1、下载&#xff1a;Download PostgreSQL Binaries 2、创建data目录作为数据目录 3、初始化 bin目录执行命令&#xff1a; .\initdb.exe -D E:\pgsql\data -E UTF-8 --localechs -U postgres -W 输入密码直到完成 4、启动数据库 .\pg_ctl.exe -D E:\pgsql\data -l logfil…

[大模型]MiniCPM-2B-chat WebDemo部署

MiniCPM-2B-chat WebDemo部署 MiniCPM-2B-chat 介绍 MiniCPM 是面壁智能与清华大学自然语言处理实验室共同开源的系列端侧大模型&#xff0c;主体语言模型 MiniCPM-2B 仅有 24亿&#xff08;2.4B&#xff09;的非词嵌入参数量。 经过 SFT 后&#xff0c;MiniCPM 在公开综合性…

吴恩达机器学习笔记:第 8 周-13 聚类(Clustering)13.1-13.2

目录 第 8 周 13、 聚类(Clustering)13.1 无监督学习&#xff1a;简介 第 8 周 13、 聚类(Clustering) 13.1 无监督学习&#xff1a;简介 在这个视频中&#xff0c;我将开始介绍聚类算法。这将是一个激动人心的时刻&#xff0c;因为这是我们学习的第一个非监督学习算法。我们…

Nexus 私服禁止 release 包覆盖发布

按照 maven 规范&#xff0c;对仓库中的包使用 snapshot 和 release 进行了区分&#xff0c;前者每次可以覆盖发布&#xff0c;会以时间的方式保留之前的包&#xff0c;并将 snapshot 包依赖下载地址指向最新覆盖发布的包&#xff0c;顾名思义快照包是为了解决我们开发测试过程…