Java内存溢出OOM之dump分析

article/2025/11/3 2:21:12

目录

内存泄露

内存溢出

1.Java堆内存异常

报错方式

原因

2.Java栈内存异常

报错方式

原因

3.方法区内存异常

报错方式

原因

解决思路

生成dump文件三种方式

dump生成

jvisualvm本地方式

1.启动jvisualvm

2.应用程序启动

3.从jvisualvm控制台,进入监控应用程序面板

4.模拟OOM

线上模式

1.查找到进程相关:top -c

2.查看堆gc每秒相关信息

3.查找栈相当问题

4.有必要时,使用命令生成jmap文件

5.下载dump文件,使用MAT工具/jhat分析。

其它辅助命令

dump分析

MAT工具分析dump文件

1.安装

2.加载dump文件

3.加载完成

4.分析结果

jhat命令分析dump文件

1.启动jhat

2.访问分析


内存泄露

代码中的某个对象本应该被虚拟机回收,因为GCRoot引用而没有被回收。

内存溢出

虚拟机由于堆中拥有太多不可回收对象没有回收,导致无法继续创建新对象。

有如下三种异常:

1.Java堆内存异常

报错方式

java.lang.OutOfMemoryError: Java heap space

原因

异常导致-Xms或-Xmx配置不足

  • 使用了大量的递归或无限递归对象
  • 使用了大量循环或死循环(循环中用到了大量的新建的对象)
  • 使用了向数据库查询过多,可能会造成内存溢出。
  • 有数组,List,Map中存放的是对象的引用而不是对象,这些引用会让对应的对象不能被释放。会大量存储在内存中。

2.Java栈内存异常

报错方式

Exception in thread "main" java.lang.StackOverflowError

原因

对象过大或过多异常,导致-Xss配置的内存不足

  • 是否有递归调用
  • 是否有大量循环或死循环
  • 全局变量是否过多
  • 数组、List、map数据是否过大

3.方法区内存异常

报错方式

Exception in thread "main" java.lang.OutOfMemoryError: Metaspace

原因

异常导致-XX:MetaspaceSize或-XX:MaxMetaspaceSize配置不足

解决思路

1、当不通过日志文件主观来判断出问题代码时,通过分析dump文件来分析

2、Arthas工具分析-见下篇分析

生成dump文件三种方式

1.jvisualvm控制台,监控时主动生成dump文件

2.使用jmap命令生成dump文件

  • windows环境:jmap -dump:live,format=b,file=heap.hprof <pid>
  • linux环境:./jmap -dump:live,format=b,file=heap.hprof <pid>

3.在应用启动时配置添加 -XX:+HeapDumpOnOutOfMemoryError 参数,

当应用抛出OutOfMemoryError 时自动生成dump文件;目录指定:XX:HeapDumpPath

[zoms@ocs ~]$ jmap -dump:live,format=b,file=heap-vm.hprof 15463
Dumping heap to /home/zoms/heap-vm.hprof ...
Heap dump file created

dump生成

jvisualvm本地方式

1.启动jvisualvm

在jdk1.8安装目录下,${JDK_HOME}\bin\jvisualvm.exe,双击启动Java VisualVM控制台

image.png

2.应用程序启动

模拟OOM代码

/*** @Description* @Auther: huhua* @Date: 2021/3/4*/
@Slf4j
public class TestDump {public static void main(String[] args) throws Exception {Integer size = 1024 * 1024 * 8 ;List<byte[]> list = new ArrayList<byte[]>();for(int a=1; a<1000; a++){Thread.sleep(1000);list.add(new byte[size]);log.info("JMV测试:list写入{}M", a*8);}}
}

3.从jvisualvm控制台,进入监控应用程序面板

可查看到本地运行java应用,选择应用进入

  • 概述

image.png

  • 实时监视

image.png

4.模拟OOM

image.png

  • 点击“堆Dump”或在应用上右击选择生成快照文件。

image.png

  • 可用MAT工具去分析dump文件

线上模式

1.查找到进程相关:top -c

也可jps 或ps -ef|grep java 或 ll /proc/<pid> 找到相关java进程

2.查看堆gc每秒相关信息

调优YGC的次数非常少,FGC更少:jstat -gc <pid> 1000(每隔ms数)

3.查找栈相当问题

使用命令 jstack -l 1346 查看线程栈信息,锁问题

4.有必要时,使用命令生成jmap文件

jmap -dump:live,format=b,file=/xx/xxx/xxx.hprof <pid>

ps:该命令对正在运行应用会产生影响,要谨慎使用,生产环境考虑arthas,具体可参见arthas分析。

5.下载dump文件,使用MAT工具/jhat分析。

其它辅助命令

  • 查看gc回收统计情况:jstat -gc pid 1000(每隔ms数) 5(输出次数)
  • 查看内存使用情况:jmap -heap pid
  • 查看内存中对象数据:jmap -histo:live <pid> | more

dump分析

MAT工具分析dump文件

1.安装

下载:http://www.eclipse.org/mat/downloads.php

解压后,点击MemoryAnalyzer.exe启动

image.png

2.加载dump文件

image.png

3.加载完成

image.png

4.分析结果

从图看有三个problem,依次往下查看各个problem

image.png

 

点击Details查看problem具体描述

image.png

点击如下图标可切换到Class Name视图

image.png

jhat命令分析dump文件

1.启动jhat

#用法:
jhat -port <port> <file>#示例:[zoms@ocs ~]$ jhat -port 8035 heap-vm.hprof
Reading from heap-vm.hprof...
Dump file created Fri Mar 05 15:30:57 CST 2021
Snapshot read, resolving...
Resolving 239638 objects...
Chasing references, expect 47 dots...............................................
Eliminating duplicate references...............................................
Snapshot resolved.
Started HTTP server on port 8035
Server is ready.

2.访问分析

  1. 通过http://ip:port来访问分析控制台,可以查询到所有的目录下类及对象

image.png

  1. 在页面最下方也提供其它方式查询

image.png

  • 展示堆快照直方图:Show heap histogram

image.png

通过对象,可查询到对象的异常,如大小异常

image.png

  • 使用OQL查询:Execute Object Query Language (OQL) query

可使用特殊语法查询。可以在OQL help处模仿编写

image.png


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

相关文章

Java内存溢出的几个区域,注意避坑

在开发过程中&#xff0c;时常会遇到内存溢出的问题&#xff0c;有可能是在生产环境&#xff0c;有的就在开发中&#xff0c;今天就聊一聊内存溢出。 存在内存的区域&#xff1a; Java堆溢出 虚拟机栈和本地方法栈溢出 方法区和运行时常量池溢出 本机内存溢出 1、Java堆溢出…

Java内存溢出代码实例

1.什么是内存溢出 JVM运行时可分为虚拟机栈&#xff0c;堆&#xff0c;元空间&#xff0c;程序计数器&#xff0c;本地方法栈等等。在虚拟机管理内存自动内存管理机制下&#xff0c;不需要自己来实现释放内存。但是由于某些操作不当&#xff0c;也可能导致虚拟机异常&#xff…

关于java堆内存溢出的几种情况_详解Java内存溢出的几种情况

JVM(Java虚拟机)是一个抽象的计算模型。就如同一台真实的机器,它有自己的指令集和执行引擎,可以在运行时操控内存区域。目的是为构建在其上运行的应用程序提供一个运行环境。JVM可以解读指令代码并与底层进行交互:包括操作系统平台和执行指令并管理资源的硬件体系结构。 1. …

java 内存 溢出_java内存溢出的几种原因和解决办法是什么?

java内存溢出的几种原因和解决办法是什么&#xff1f; java内存溢出的几种原因和解决办法是&#xff1a; 第一类内存溢出&#xff0c;也是大家认为最多&#xff0c;第一反应认为是的内存溢出&#xff0c;就是堆栈溢出&#xff1a; 那什么样的情况就是堆栈溢出呢&#xff1f;当你…

java内存溢出之永久代内存溢出

前言 在实际开发中&#xff0c;我们经常会遇到oom&#xff0c;即所谓的内存溢出情况&#xff0c;对于内存溢出&#xff0c;我们需要搞清楚具体内存的溢出原因&#xff0c;然后对症下药。这里和大家一起学习一下永久代内存溢出。 永久代内存溢出概述 对于JVM的分代策略&#…

常见的Java内存溢出情况和实例

文章目录 内存溢出的原因栈溢出栈溢出的第1种情况&#xff0c;死递归&#xff0c;抛出StackOverflowError栈溢出的第2种情况&#xff0c;线程太多&#xff0c;抛出OutOfMemoryError 堆溢出1.初始对象太大&#xff0c;超过机器内存&#xff0c;抛出OutOfMemoryError: Java heap …

java 如何排查内存溢出_java 内存溢出排查

测试代码&#xff0c;如下示例&#xff1a; import java.util.ArrayList; import java.util.List; /** * Description 测试内存溢出, 启动时设置参数&#xff0c;最大堆内存为1m, 内存溢出时dump出内存文件 -Xmx1m -XX:HeapDumpOutOfMemoryError * Author luzy * Date 2018/10/…

java内存溢出 栈溢出的原因与排查方法

java内存溢出 原因与排查方法 1、 内存溢出的原因是什么&#xff1f; 内存溢出是由于没被引用的对象&#xff08;垃圾&#xff09;过多造成JVM没有及时回收&#xff0c;导致剩余的内存不够用&#xff0c;造成的内存溢出。如果出现这种现象可行代码排查&#xff1a; 一&#…

Java内存溢出问题解决办法

Java内存溢出是常见问题&#xff0c;现介绍内存溢出问题的几种解决办法&#xff0c;不仅适用于TongWeb&#xff0c;也适用所有的Java程序。问题具体原因就不再解释了&#xff0c;对于初学者先知道大概解决办法就行了。本文只是举例常见解决办法&#xff0c;实际使用中JDK版本可…

线上java 内存溢出分析

1.Eclipse Memory Analysis Tools (MAT) 是一个分析 Java堆数据的专业工具&#xff0c;用它可以定位内存泄漏的原因。 工具地址 : https://www.eclipse.org/mat/ 2从linxu服务器下载内存溢出文件.hprof&#xff0c;导入到MAT 3.选择”Leak Suspects : includes leak suspect…

docker java 内存溢出_java内存溢出

与此问题类似jmeter Error occurred during initialization of VM Could not reserve enough space_萧木易的博客-CSDN博客 前言 微服务和docker的结合应该是现在服务端的主流技术&#xff0c;随着springboot的出现&#xff0c;有很多公司已经把微服务迁移到了docker容器中&a…

Java 内存溢出(一)原因、复现、排查

目录 一、内存溢出原因二、内存溢出实例1、堆溢出2.虚拟机栈和本地方法栈溢出3.方法区和运行时常量池溢出4.本机直接内存溢出 三、内存溢出排查 内存溢出&#xff1a; 是指应用系统中存在无法回收的内存或使用的内存过多&#xff0c;最终使得程序运行要用到的内存大于虚拟机能提…

Java内存溢出问题排查分析

目录 前言 一、MAT&#xff08;Memory Analyzer Tool&#xff09; 二、软件初识 三、捕获dump文件 1、主动方式 2、被动方式 四、分析dump文件 总结 前言 项目运行过程中&#xff0c;我们可能会遇到Java内存溢出Out Of Memory。此时我们可以借助内存分析工具MAT(Memory Analyz…

ajax书写方式及内部主要参数

书写方式 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> <script src"https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"> </script> <script&…

掌握ajax3:Ajax 中的高级请求和响应

对于很多 Web 开发人员来说&#xff0c;只需要生成简单的请求并接收简单的响应即可&#xff1b;但是对于希望掌握 Ajax 的开发人员来说&#xff0c;必须要全面理解 HTTP 状态代码、就绪状态和 XMLHttpRequest 对象。在本文中&#xff0c;Brett McLaughlin 将向您介绍各种状态代…

Ajax技术简介(http://www.51cto.com)

Ajax技术开发指南Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是结合了Java技术、XML以及JavaScript等编程技术&#xff0c;可以让开发人员构建基于Java技术的Web应用&#xff0c;并打破了使用页面重载的惯例。Ajax是使用客户端脚本与Web服务器交换数据的Web应…

AJAX初级

AJAX介绍 AJAX Asynchronous JavaScript and XML(异步的JavaScript和XML). 同步与异步的区别 同步的理解; 同步就是指一个进程在执行某个请求的时候&#xff0c;若该请求需要一段时间才能返回信息&#xff0c;那么这个进程将会一直等待下去&#xff0c;直到收到返回信息才继…

Ajax学习笔记-get请求参数-3

传统的表单内容会变成请求参数&#xff0c;自动拼接到对应的位置。get会放在请求地址的后面&#xff0c;post会放在请求体当中。 但是在Ajax中&#xff0c; 我们需要自己拼接请求参数&#xff0c;然后根据请求参数的不同&#xff0c;将请求参数放置在不同的位置。 路由&#xf…

【AJAX学习笔记三】ajax的post请求及其请求主体请求头的设置

AJAX的post请求及其请求行请求头的设置 一、POST请求 参照上一节的笔记&#xff0c;我们实现了get请求的方法&#xff0c;而POST方法的简单实现和GET方法类似&#xff0c;只需要在前端中将get请求修改为post。 xhr.open(POST, http://127.0.0.1:8000/server);在后端中将其接受…

Ajax参数对照及Success内容

本文是好久之前参考网上大佬教程&#xff0c;边学习边参考边做笔记&#xff0c;整理的内容&#xff0c;分享下大家学习~ 如果这位大佬看见&#xff0c;请评论留下您的名字和博客地址&#xff0c;我这里修改为【转载】 Ajax参数 jQuery 拥有完整的 Ajax 兼容套件。其中的函数和…