eclipse占用内存过大_Java性能调优学习(三)-jmap+mat分析内存溢出问题实战

6dfdc3eb37336acecbb8e279a6c998a7.png

上一节我们讲了jinfo,jstat,jmap的使用,还简单的讲了下如何使用jmap导出内存映像文件,这次,我们来实战一把内存溢出问题。

环境准备

首先我们先模拟一下内存溢出的场景,以下这段代码在访问后肯定会造成堆内存溢出,代码如下:

@RestController@RequestMapping("/section1")public class TestHeapController { private List heapList = new ArrayList<>(); /*** * -Xms16m -Xmx32m */ @GetMapping("/heap") public ResultVO testHeap() { int i = 0; while (true) { Student student = new Student(i++, UUID.randomUUID().toString()); System.out.println(student.toString()); heapList.add(student); } }}

那么我们如何解决这样的问题,在生产环境中,代码肯定不会这么清晰简单,那么我们怎么去分析和解决呢?我们需要导出内存映像文件来分析解决。

有两种方式可以导出内存映像文件,这边我们在重温一下。

有两种方式可以导出映像文件:

1. 配置参数内存溢出自动导出

-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=./

2. 使用jmap命令手动导出

关于jmap如何导出,可以看我的上一篇文章,Java性能调优学习(二)-jinfo,jstat,jmap的使用

下面我们先准备一下需要分析的内存映像文件,配置JVM参数后,启动我们刚刚的实例代码,开多个浏览器多次访问后,很快就会出现异常,这个时候由于配置了参数,会自动导出内存映像文件,我们将这个文件先放好,备用。

5b4c1896a8eb9867431fe4bdd8ab0886.png

参数配置

448b07d5bb70941c777ab0f9661e347a.png

自动导出

下面就轮到我们的内存分析工具MAT登场啦。

MAT

MAT(MemoryAnalyzerTool)工具是eclipse的一个插件(MAT也可以单独使用),使用起来非常方便,尤其是在分析大内存的dump文件时,可以非常直观的看到各个对象在堆空间中所占用的内存大小、类实例数量、对象引用关系、利用OQL对象查询,以及可以很方便的找出对象GCRoots的相关信息,当然最吸引人的还是能够快速为开发人员生成内存泄露报表,方便定位问题和分析问题。

MAT工具的下载地址为:https://www.eclipse.org/mat/downloads.php

下载完成后,直接解压,运行其中的MemoryAnalyzer.exe文件即可启动MAT工具,如下所示:

8091cabb80f6fed47ab5c89787932472.png

mat目录

点击File->Open heap dump 打开之前导出的dump文件,将会生成Overview选项,效果如图:

c6de76b546c259fef3a475111249083c.png

在Overview选项中,以饼状图的形式列举出了程序内存消耗的一些基本信息,其中每一种不同颜色的饼块都代表了不同比例的内存消耗情况。

点击overview右侧的panel,我们可以看到如下图所示的效果,里面列举了可能的泄漏点,并且对泄漏点进行了描述。

472a82e1d257943c6ebd381df675e1cc.png

疑似的泄漏点

再介绍一下我们工具栏上常用的一些功能:Dominator Tree,Histogram

Dominator Tree:

如果需要定位内存泄露的代码点,我们可以通过Dominator Tree菜单选项来进行排查。

Dominator Tree提供了一个列表。可以看到对象之间dominator关系树。从MAT的Dominator tree中可以看到占用内存最大的对象以及每个对象的Dominator。

a5ef743af23df45326cd1f2bcb295efa.png

Dominator Tree

点开“+”符号,可以进一步查看内层应用情况,同时还可以看到对应类对象的属性值,如下所示:

3cd45b895778eb211f5b36df03ded7e1.png

展开图

可以看到,我们这边有一大堆的Studen一直占用着内存,没有被回收,那么肯定是有问题的。

因为咱们的实验代码比较简单,但是在生产环境上肯定是没有这么清晰的,所以通常在排查内存泄漏的时候,我们还需要排除掉虚引用/弱引用/软引用等引用链,查看强引用。(强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。)

那么如何排除掉虚引用/弱引用/软引用等引用链呢?如下图所示,选择exclude all phantom/weak/soft etc.references,意思是查看排除虚引用/弱引用/软引用等的引用链,因为被虚引用/弱引用/软引用的对象可以直接被GC给回收,我们要看的就是某个对象否还存在Strong 引用链(在导出HeapDump之前要手动出发GC来保证),如果有,则说明存在内存泄漏,然后再去排查具体引用。

392695d78201c8f2bfe1a874b1ee214d.png

排除其他引用

Dominator Tree讲完了,下面我们来讲一下工具栏上还有一个好用的功能Histogram

Histogram

Histogram清晰的列出了每个类的Objects,Shallow Heap,Retained Heap,关于Shallow Heap和Retained Heap的具体意义,在有空的时候我会单独讲解,现在可以先理解为对象本身占用的内存大小和该对象被回收时可以释放的内存大小。

365f2f17917cd76f3539b4c8a04d7ef6.png

Histogram通过正则过滤

当我们找到疑似存在泄漏的类之后,我们可以进行进一步分析,排除引用。

f5e89c5e75bff8aa0cfb732946c8511b.png

排除引用

还有一些会在平时用到的右键菜单中的按钮:

List objects :

with incoming references 引用到该对象的对象

with outcoming references 被该对象引用的对象

Show objects by class :

incoming references 引用到该对象的对象

outcoming references 被该对象引用的对象

总结

今天为大家带来了jmap+mat内存分析,感兴趣的小伙伴们可以收藏并关注我,为大家持续带来干货。

cc403135bf8e7e8ee493b1836bb890f2.png

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

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

相关文章

spring boot自测_将测微仪与Spring Boot 2一起使用

spring boot自测这是快速入门&#xff0c;介绍了如何使用出色的Micrometer库来检测基于Spring Boot 2的应用程序并在Prometheus中记录指标 介绍 Micrometer在不同监视工具提供的客户端库上提供了基于Java的外观。 以Prometheus为例&#xff0c;如果我要将Java应用程序与Prome…

arch linux界面优化,Archlinux 启动优化

内核参数优化修改/boot/grub/grub.cfg 添加libahci.ignore_sss1 #禁用sssraidnoautodetectipv6.disable1 #禁用ipv6nomodeset #不使用kms&#xff0c;plymouth.enable0 #禁用plymouthrootfstypeext4 #root分区类型selinux0#禁用selinux 完成后&#xff1a;linux /vmlinuz-lin…

微软和 Windows 的发展简史

20世纪60年代中期&#xff0c;美国达特茅斯学院院长、匈牙利人约翰凯梅尼&#xff08;J. Kemeny&#xff09;和数学系教授托马斯卡茨&#xff08;Thomas E. Kurtz&#xff09;认为&#xff0c;像FORTRAN&#xff08;世界上最早出现的计算机高级程序设计语言&#xff09;那样的语…

elaseticsearch 配置ik分词器的热更新_Elasticsearch从入门到放弃:分词器初印象

Elasticsearch 系列回来了&#xff0c;先给因为这个系列关注我的同学说声抱歉&#xff0c;拖了这么久才回来&#xff0c;这个系列虽然叫「Elasticsearch 从入门到放弃」&#xff0c;但只有三篇就放弃还是有点过分的&#xff0c;所以还是回来继续更新。之前我们聊过了 Elasticse…

java api限流_Java 9:流API的增强

java api限流Java 9向Stream接口添加了4种新方法&#xff1a; 1. dropWhile dropWhile方法类似于skip方法&#xff0c;但使用Predicate而不是固定的整数值。 当Predicate为true时&#xff0c;它将从输入流中删除元素。 然后将所有剩余的元素传递到输出流。 例如&#xff1a; …

服务器windows模拟linux环境,科学网—Windows不用虚拟机或双系统,轻松实现shell环境:gitforwindows - 刘永鑫的博文...

windows缺少shell命令支持用过Linux服务器分析数据的小伙伴&#xff0c;一定对Linux强大Shell命令所折服&#xff0c;经常会感觉windows缺少这些命令而感觉不方便。还有想学习Linux Shell命令的小伙伴&#xff0c;一直没有一个很好的学习环境。双系统安装涉及分区改变对硬盘数据…

Mac OS 系统的发展历史

文章目录System 1.0&#xff08;1984&#xff09;System 2.0&#xff08;1985&#xff09;System 3.0&#xff08;1986&#xff09;System 4.0&#xff08;1987&#xff09;System 5.0&#xff08;1987&#xff09;System 6.0 &#xff08;1988&#xff09;System 7 (1991 )Sys…

pythonselenium兼容性_对于旧版Google Chrome,无法在Python中使用Selenium找到Chrome

出于兼容性原因&#xff0c;我更喜欢将Chrome版本55.0.2883.75与Chromedriver v.2.26一起使用。我从https://www.slimjet.com/chrome/google-chrome-old-version.php和Chromedriver 2.26从https://chromedriver.storage.googleapis.com/index.html?path下载了较旧版本的chrome…

弱投影模型_通过投影增强数据模型

弱投影模型介绍 数据模型可能很棘手。 建模可能会更加困难。 有时候&#xff0c;应该放入数据库表中的信息不一定是我们要在每段代码中使用的信息。 和其他许多次一样&#xff0c;Spring来了。 一个称为投影的小功能可以帮助我们在普通界面中仅用几行数据映射数据。 在本文中…

苹果公司的电脑发展史——硬件篇

文章目录一、Apple I&#xff08;1976&#xff09;二、Apple II&#xff08;1977&#xff09;三、Lisa&#xff08;1983&#xff09;四、Macintosh&#xff08;1984&#xff09;五、PowerBook&#xff08;1991&#xff09;六、iMac&#xff08;1998&#xff09;七、iBook&#…

linux attach 指令,以太坊实战-attach命令详解

在前面的实战教程中我们经常提到attach这个命令&#xff0c;今天就针对此命令做更深一步的介绍。官方对此参数的解释如下&#xff1a;attach Start an interactive JavaScript environment (connect to node)也就是说它是一个连接到节点的JavaScript环境的交互窗口。通过它我们…

my.ini修改后服务无法启动_Spring Cloud Eureka 服务实现不停机(Zero-downtime)部署

问题互联网产品高速迭代&#xff0c;通常伴随着高频次的版本发布。部署新版上线需要重启服务&#xff0c;直接 kill 服务进程可能会造成服务短暂不可用&#xff0c;从而影响到正在使用的用户。Spring Cloud 项目中一般会用到 Ribbon 作为负载均衡&#xff0c;那么是不是只要保证…

苹果电脑 Mac OS X 系统诞生的故事和发展历史

文章目录CoplandNeXTRhapsodyOS XPublic Beta (Kodiak)Mac OS X v10.0 (Cheetah)Mac OS X v10.1 (Puma)Mac OS X v10.2 (Jaguar)Mac OS X v10.3 (Panther)Mac OS X v10.4 (Tiger)Mac OS X v10.5 (Leopard)Mac OS X v10.6 (Snow Leopard)Mac OS X Lion2001 年 3 月 24 日&#x…

linux系统普通用户ssh不能登陆,关于CentOS普通用户无法登录SSH问题

Linux命令的返回码列表转自:http://blog.chinaunix.net/uid-10347480-id-3263127.html 在 Linux 下,不管你是启动一个桌面程序也好,还是在控制台下运行命令,所有的程序 ...iOS开发 GET、POST请求方法(NSURLConnection篇)Web Service使用的主要协议是HTTP协议,即超文本传输协议.…

sap打勾选项记录_记录意外的开关选项

sap打勾选项记录Java开发人员可以做很多事情来使自己的生活以及维护该代码的其他人的生活更加轻松。 在本文中&#xff0c;我将探讨开发人员可以采用的一种非常简单的方法&#xff0c;以使每个人都更轻松。 对于每个阅读这篇文章的人来说&#xff0c;这篇文章的要点似乎都很明显…

Mac OS 的历史

文章目录概述1980年代前20世纪80年代20世纪90年代2000年以后概述 纵观电脑之历史&#xff0c;操作系统与计算机硬件的发展息息相关。 操作系统之本意原为提供简单的工作排序能力&#xff0c;后为辅助更新更复杂的硬件设施而渐渐演化。 从最早的批处理模式开始&#xff0c;分…

linux升级tls,为CentOS升级OpenSSL 让Nginx支持TLS 1.2

最近在调试微信小程序时&#xff0c;发现wx.request请求总是无法正确获取服务器端的数据&#xff0c;经过检查发现是因为服务器端https不支持微信要求的TLS 1.2版本。登录到服务器上&#xff0c;用openssl version -a命令查询&#xff0c;发现版本是0.9.8e&#xff0c;查阅文档…

java 反射 速度_Java反射,但速度更快

java 反射 速度在编译时不知道Java类的最快方法是什么&#xff1f; Java框架通常会这样做。 很多。 它可以直接影响其性能。 因此&#xff0c;让我们对不同的方法进行基准测试&#xff0c;例如反射&#xff0c;方法句柄和代码生成。 用例 假设我们有一个简单的Person类&#x…

macOS 内核之 OS X 系统的起源

文章目录一、苹果公司早期(1972-1991)二、苹果在操作系统上的尝试(1991-1997)2.1 Star Trek 项目 (1992-1993)2.2 Copland-Mac OS 8 (1994-1996)三、收购与转折(1996-1997)四、NeXT 篇章4.1 NEXTSTEP(1985-1997)4.2 OpenStep(1993-1997)五、Mach 的历史5.1 Rochester’s Intell…