jmap的使用以及内存溢出分析

article/2025/8/18 19:36:00

jmap的使用以及内存溢出分析

jmap(java内存映像工具)

jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件)。还有几种方式获取dump文件:使用JVM参数选项-XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在OOM异常出现之后自动生成dump文件,通过-XX:HeapDumpPath=path 设置dump文件路径(有时候dump文件比较大的时候可能无法自动导出,这时候就需要使用jmap -dump手动导出了);通过-XX.+HeapDumpOnCtrlBreak参数则可以使用[Ctrl]+[Break]键让虚拟机生成dump文件;或者在Linux系统下通过Kill -3命令发送进程退出信号,也能拿到dump文件。

jmap的作用并不仅仅是为了获取dump文件,它还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。和jinfo命令一样,jmap有不少功能在Windows平台下都是受限的,除了生成dump文件的-dump选项和用于查看每个类的实例、空间占用统计的-histo选项在所有操作系统都提供之外,其余选项都只能在Linux/Solans下使用。官方文档地址

1.1、查看内存使用情况

[root@localhost /]# jmap -heap 9906
Attaching to process ID 9906, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.221-b11using thread-local object allocation.
Mark Sweep Compact GCHeap Configuration:MinHeapFreeRatio         = 40MaxHeapFreeRatio         = 70MaxHeapSize              = 989855744 (944.0MB)NewSize                  = 20971520 (20.0MB)MaxNewSize               = 329908224 (314.625MB)OldSize                  = 41943040 (40.0MB)NewRatio                 = 2SurvivorRatio            = 8MetaspaceSize            = 21807104 (20.796875MB)CompressedClassSpaceSize = 1073741824 (1024.0MB)MaxMetaspaceSize         = 17592186044415 MBG1HeapRegionSize         = 0 (0.0MB)Heap Usage:
New Generation (Eden + 1 Survivor Space):capacity = 18939904 (18.0625MB)used     = 5314648 (5.068443298339844MB)free     = 13625256 (12.994056701660156MB)28.06058573475346% used
Eden Space:capacity = 16842752 (16.0625MB)used     = 4780064 (4.558624267578125MB)free     = 12062688 (11.503875732421875MB)28.38054018725681% used
From Space:capacity = 2097152 (2.0MB)used     = 534584 (0.5098190307617188MB)free     = 1562568 (1.4901809692382812MB)25.490951538085938% used
To Space:capacity = 2097152 (2.0MB)used     = 0 (0.0MB)free     = 2097152 (2.0MB)0.0% used
tenured generation:capacity = 41943040 (40.0MB)used     = 36145136 (34.47068786621094MB)free     = 5797904 (5.5293121337890625MB)86.17671966552734% used31688 interned Strings occupying 3707776 bytes.

1.2、查看内存中对象数量及大小

#查看所有对象,包括活跃以及非活跃的 
jmap -histo <pid> | more 
#查看活跃对象
jmap -histo:live <pid> | more[root@localhost /]# jmap -histo:live 9906 | morenum     #instances         #bytes  class name
----------------------------------------------1:         72627       10929400  [C2:         12052        2445368  [I3:          3709        1718968  [B4:         71294        1711056  java.lang.String5:         14306        1258928  java.lang.reflect.Method6:          8153         922992  java.lang.Class7:         26390         844480  java.util.HashMap$Node8:         23271         744672  java.util.concurrent.ConcurrentHashMap$Node9:         10490         629792  [Ljava.lang.Object;10:          5128         536080  [Ljava.util.HashMap$Node;
#对象说明 
B byte 
C char 
D double 
F float 
I int 
J long 
Z boolean 
[数组,如[I表示int[] 
[L+类名 其他对象

1.3、将内存使用情况dump到文件中

#用法: 
jmap -dump:format=b,file=dumpFileName <pid>
#示例 
[root@localhost /]# jmap -dump:format=b,file=/cfile/dump.dat 9906
Dumping heap to /cfile/dump.dat ...
Heap dump file created

在这里插入图片描述

1.4、通过jhat对dump文件进行分析

jvm的内存dump到文件中,这个文件是一个二进制的文件,不方便查看,可以借助于jhat工具进行查看。

#用法: 
jhat -port <port> <file>
#示例
[root@localhost cfile]# jhat -port 8888 /cfile/dump.dat
Reading from /cfile/dump.dat...
Dump file created Thu Aug 19 11:31:02 CST 2021
Snapshot read, resolving...
Resolving 476416 objects...
Chasing references, expect 95 dots...............................................................................................
Eliminating duplicate references...............................................................................................
Snapshot resolved.
Started HTTP server on port 8888
Server is ready.

打开浏览器进行访问:ip+端口(8888)
在这里插入图片描述

在最后面有OQL查询功能。

在这里插入图片描述

进入页面,输入下面语句查询字符串大于10000,点击Execute按钮,查询结果:

select s from java.lang.String s where s.value.length >= 10000

在这里插入图片描述

2、通过MAT工具对dump文件进行分析(官网)

MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I9geT1sO-1629355535351)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210819114901423.png)]

2.1、下载安装

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V7GQluyM-1629355535352)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210819134930028.png)]

运行独立版 Memory Analyzer 所需的最低 Java 版本是 Java 11 如果本地安装的JDK是更低版本的可以下载旧版本。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N61htSA0-1629355535352)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210819140452413.png)]

下载完成后解压MemoryAnalyzer-1.8.1.20180910-win32.win32.x86_64.zip,解压后如图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OU9rJl0G-1629355535353)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210819140912714.png)]

2.2、使用方式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查看对象以及它的依赖:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1WdBhgpu-1629355535355)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210819141903120.png)]

查看可能存在内存泄露的分析:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HSgNBWKc-1629355535355)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210819142008106.png)]

3、内存溢出的定位与分析

引起内存溢出的原因有很多种,常见的有以下几种:

  • 内存中加载的数据量过于庞大,如一次从数据库取出过多数据。
  • 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收。
  • 代码中存在死循环或循环产生过多重复的对象实体。
  • 使用的第三方软件中的BUG。
  • 启动参数内存值设定的过小。

内存溢出在实际的生产环境中经常会遇到,如,不断的将数据写入到一个集合中,出现了死循环或者读取超大的文件等等,都可能会造成内存溢出。如果出现了内存溢出,首先我们需要定位到发生内存溢出的环节,并且进行分析,是正常还是非正常情况,如果是正常的需求,就应该考虑加大内存的设置,如果是非正常需求,那么就要对代码进行修改,修复这个bug。

3.1、模拟内存溢出

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;public class TestJvmOutOfMemory {public static void main(String[] args) {List<Object> list = new ArrayList<>();for (int i = 0; i < 10000000; i++) {String str = "";for (int j = 0; j < 1000; j++) {str += UUID.randomUUID().toString();}list.add(str);}System.out.println("ok");}
}

为了更快的现实效果,这里使用Idea,设置执行的参数

#在每次发生内存溢出时,JVM会自动将堆转储,dump文件存放在-XX:HeapDumpPath指定的路径下。
-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:

在这里插入图片描述

测试结果如下:

在这里插入图片描述
导入到MAT工具中进行分析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N0a7OZ1h-1629355535357)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210819144134395.png)]
可以看到,有87.02%的内存由Object[]数组占有,所以比较可疑。

分析:已经有超过87%的内存都被它占有,这种情况是非常有可能出现内存溢出的

查看详情:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4da6MWYn-1629355535358)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210819144329342.png)]
可以看到集合中存储了大量的uuid字符串。


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

相关文章

Java的jmap命令使用详解

jmap命令简介 jmap&#xff08;Java Virtual Machine Memory Map&#xff09;是JDK提供的一个可以生成Java虚拟机的堆转储快照dump文件的命令行工具。除此以外&#xff0c;jmap命令还可以查看finalize执行队列、Java堆和方法区的详细信息&#xff0c;比如空间使用率、当前使用…

Python Numpy .npy文件打开

首先找到你的npy文件的路径&#xff08;我的npy文件在D盘下&#xff0c;名字叫test.npy&#xff09; 2 打开编写python的软件&#xff08;我的软件是pycharm&#xff09; 3 新建一个python文件&#xff0c;用于后面的编程使用。&#xff08;我先建的python文件名叫test&#xf…

Numpy文件交互:.npy和.npz有什么区别?

文章目录 saveloadsavezsavez_compressed Numpy提供了以.npy为后缀的文件存储方案&#xff0c;与这种文件格式密切相关的读、写函数分别是np.load和np.save。通过savez可以一次性存储多个数组&#xff0c;并可通过load以键值对的形式读取出来&#xff1b;如果觉得文件太大&…

什么是npy文件,为什么要用npy格式保存文件?

文章目录 一、官方文档&#xff08;中文&#xff09;二、官方文档&#xff08;英文&#xff09;三、为什么要用npy文件保存文件四、读取和保存&#xff08;1&#xff09;加载npy文件&#xff0c;并将npy文件写入一个txt文件&#xff08;2&#xff09;保存npy文件&#xff08;3&…

深度学习入门之如何制作npz、npy文件

一、需求 论文《EyeTracking for everyone》中提出了iTracker神经网络,并构建了一个叫GazeCapture的数据库,将其部分数据集下载后,可以看到文件的层次结构如下图所示: 其中,整个数据集的后缀名是npz,内部文件的后缀名是npy。由于该数据集是面向Apple产品系列的,而我的…

tecplot切面

注意要选择Volume Zone

面向切面

面向切面是什么 AOP即面向切面编程。 让你只专注于核心业务功能的实现&#xff0c;而不用花太多精力去管像日志、事务等各个项目通用的功能。 把非核心的业务逻辑抽象成一个切面&#xff0c;在程序运行过程中自动注入该功能&#xff0c;这就是面向切面&#xff0c;其底层是通…

Spring AOP 之 多切面

接着上文&#xff1a;https://blog.csdn.net/single_wolf_wolf/article/details/81772837 多切面 相对来说&#xff0c;只是定义多个切面类&#xff0c;同时配置类中设置一下&#xff0c; demo如下&#xff1a; 首先定义一个接口&#xff1a; package com.cmb.multi;public…

spring切面注解失效

在项目中使用切面注解做数据脱敏时,导出的数据也需要脱敏处理,遇到了在一个类里面调用本类的方法切面失效,解决方法如下: 切面注解: package com.t3.ts.driver.resume.aspect;import java.lang.annotation.*;/*** Description: 数据脱敏注解 Filed* Date: 2019/9/10* Author:…

自定义切面类

直接贴入代码 &#xff0c;注释写的很清楚 此处为controller层 方法上加上自定义的切面注解 入参实体 public class TestM extends BaseModel{/****/private static final long serialVersionUID 1L; private String a;public String getA() {return a; }public void setA(S…

java 切面 注解_十、使用注解定义切面

一、本课目标 掌握使用注解实现AOP的方法 二、使用注解定义切面 2.1简介 AspectJ 面向切面的框架,它扩展了Java语言,定义了AOP语法,能够在编译期提供代码的织入。 @AspectJ AspectJ5新增的功能,使用JDK5.0注解技术和正规的AspectJ切点表达式语言描述切面(所以在使用@Aspect…

Spring 创建切面

目录 1、概述 2、切点类型 3、切面类型 4、静态普通方法名匹配切面 5、静态正则表达式方法匹配切面 6、动态切面 7、流程切面 8、复合切点切面 9、总结 1、概述 在前面介绍各类增强时&#xff0c;大家可能没有注意到一个问题&#xff1a;增强被织入到目标类的所有方法…

Spring基础:切面

前言在之前的文章中总结了 AOP 在 Spring 中的作用及地位&#xff0c;在分析 AOP 时涉及到切面的内容&#xff0c;这一节详细的分析切面的知识点。 正题 在开始文章前&#xff0c;有几个问题需要思考一下&#xff1a; 切面到底是神马切面的构成切面有哪些实现类切面有哪些类型…

java使用spring aop切面编程

aop概念 1、切面(Aspect) 首先要理解‘切’字&#xff0c;需要把对象想象成一个立方体&#xff0c;传统的面向对象变成思维&#xff0c;类定义完成之后&#xff08;封装&#xff09;。每次实例化一个对象&#xff0c;对类定义中的成员变量赋值&#xff0c;就相当于对这个立方体…

【Spring】面向切面编程详解(AOP)

文章目录 一、AOP概述什么是AOPAOP应用场景 二、AOP的基本术语术语介绍术语举例详解 三、AOP实例说明四、通知类型详解概述前置通知后置通知环绕通知最终通知 六、AOP实现声明式事务结语 &#x1f315;博客x主页&#xff1a;己不由心王道长&#x1f315;! &#x1f30e;文章说明…

时间序列预测方法

之前一直在看时间序列预测方法的文献&#xff0c;最近终于有点头绪了&#xff0c;然后就花了些时间来做一下整理。时间序列预测方法可分为传统的&#xff0c;基于机器学习的和基于深度学习的&#xff0c;以下每一方面都列举了几个比较经典的模型算法。 目录 1 背景 2 传统的时…

时间序列预处理

数据预处理的主要流程为&#xff1a;数据清洗、特征选择、归一化处理、划分窗口、Shuffle和划分数据集等五个阶段。选用何种方法没有统一的标准&#xff0c;只能根据不同类型的分析数据和业务需求&#xff0c;在对数据特性做了充分的理解之后&#xff0c;再选择与其最适配的数据…

时间序列分析相关概念

1. 在时间序列分析中&#xff0c; 数学模型是什么&#xff1f;数学公式又是什么&#xff1f;数学推导过程又是什么&#xff1f;… … 一句话&#xff1a;用数学公式后者符号来表示现实存在的意义。数学是“万金油”的科学&#xff0c;它是作为工作和分析方法运用到某个学科当中…

时间序列预测方法总结

前言 对时间序列数据预测模型做个简单的分类&#xff0c;方便日后对其进一步研究&#xff0c;理清楚技术更新发展方向。 时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征。 预测场景 单步预测 单步单变量预测 &#xff1a;在时间序…

时间序列的聚类方法

时间序列的聚类方法 时间序列是按照时间排序的一组随机变量&#xff0c;它通常是在相等间隔的时间段内&#xff0c;依照给定的采样率&#xff0c;对某种潜在过程进行观测的结果。 时间序列数据是实值型的序列数据&#xff0c;具有数据量大、数据维度高以及数据是不断更新的等…