JVM常用工具中jmap实现手动进行堆转储(heap dump文件)并使用MAT(Memory Analyzer Tool)进行堆分析-内存消耗分析

场景

JVM-常用工具(jps、jstat、jinfo、jmap、jhat、jstack、jconsole、jvisualvm)使用:

JVM-常用工具(jps、jstat、jinfo、jmap、jhat、jstack、jconsole、jvisualvm)使用_jvm分析工具-CSDN博客

上面讲了jmap的简单使用。

下面记录其常用功能,实现堆转储离线文件,并通过三方工具进行可视化查看和分析。

性能监控之常见 Java Heap Dump 方法

dump heap是诊断与内存相关的问题的重要手段,例如:内存泄漏、垃圾回收问题和java.lang.OutOfMemoryError。

同时也是优化内存消耗的重要手段。有非常多的工具可以dump heap,以及分析转储文件,

例如:visualVM、Eclipse MAT和 Heap Hero等等。

Windows上使用jmap实现手动堆转储到文件

jmap是jdk自带的工具,可以dump heap到文件。例如:

jmap-dump:format=b,file=/opt/tmp/heapdump.bin 37320

注意:

可以添加“live”选项,仅将内存中的活动对象写入堆转储文件。

如果未通过此选项,则所有对象,即使是准备好进行垃圾回收的对象也会打印在堆转储文件中。

它将大大增加堆转储文件的大小。这也将使分析变得乏味。

要解决内存问题或优化内存,仅需使用“ live”选项即可。

jmap-dump:live,format=b,file=myjmapfile.txt 19570

其中file跟的是堆转储文件的存放位置,如果是在windows上,则是形如

jmap-dump:live,format=b,file=D:\test\Jmap.hprof 18700

然后最后面是跟的pid,获取pid的方式可以通过

jps

实现

MAT(Memory Analyzer Tool)

Memory AnalyzerTool是一个快速且功能丰富的Java堆分析器,可帮助您查找内存泄漏并减少内存消耗。

使用Memory Analyzer分析具有数亿个对象的高效堆转储,快速计算对象的保留大小,查看谁阻止垃圾收集器收集对象,

运行报告以自动提取泄漏嫌疑者。

下载地址:

Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation

注意这里的MAT的版本与JDK的版本有对应要求,最新版的要求JDK17,这里使用的JDK1.8,所以下载1.10.0在windows上的安装包。

下载之后直接解压,双击MemoryAnalyzer.exe启动即可,启动之后可以看到下面有个Open a Heap Dump选项。

将上面保存的文件打开即可进行离线分析。

注:

博客:
霸道流氓气质-CSDN博客

实现

下面编写一个简单的测试代码进行演示以上工具的使用

下面以是否使用String的intern()方法占用内存消耗的对比为例

import java.util.Random;
import java.util.concurrent.TimeUnit;public class StringInternTest {static final int MAX = 1000 * 10000;static final String[] arr = new String[MAX];public static void main(String[] args) throws InterruptedException {Integer[] DB_DATA = new Integer[10];Random random = new Random(10 * 10000);for (int i = 0; i < DB_DATA.length; i++) {DB_DATA[i] = random.nextInt();}long t = System.currentTimeMillis();for (int i = 0; i < MAX; i++) {arr[i] = new String(String.valueOf(DB_DATA[i % DB_DATA.length]));//arr[i] = new String(String.valueOf(DB_DATA[i % DB_DATA.length])).intern();}System.out.println((System.currentTimeMillis() - t) + "ms");System.gc();TimeUnit.SECONDS.sleep(25);}
}

首先是不使用intern方法,编写如上代码,最后面让线程休眠25的目的是可以获取到pid,并执行jmap的命令

运行以上main方法,然后打开cmd,输入

jps

获取到pid,等待输出耗时多少毫秒后,执行jmap指令

jmap-dump:live,format=b,file=D:\test\Jmap6.hprof 18700

这里的pid获取的是18700,然后将文件转储在D:\test\目录下,文件名叫做Jmap6.hprof

使用MAT打开上面的文件,Actions-Histogram

展示内存中的对象,对象的个数及大小。

Class Name : 类名称,java类名

Objects : 类的对象的数量,这个对象被创建了多少个

Shallow Heap :一个对象内存的消耗大小,不包含对其他对象的引用

Retained Heap :是shallow Heap的总和,也就是该对象被GC之后所能回收到内存的总和;

比如这里查看java.lang.String类,其实例数为1000万个,内存消耗240多M。

把上面示例代码的使用intern()的放开,原先的注释掉,再次执行上面的流程,生成新的dump文件并分析

可以看到在使用了intern方法后示例数仅为7000个,且内存消耗为170K。

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

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

相关文章

sqlite数据库,轻量级数据库的使用

什么是sqlite数据库 sqlite是具有零配置、无服务的特点&#xff0c;遵循 ACID 规则&#xff0c;是一款备受欢迎的轻量级数据库。 tips&#xff1a;ACID 规则即&#xff0c;A&#xff08;原子性&#xff09;、C&#xff08;一致性&#xff09;、I&#xff08;独立性&#xff0…

前端npm下载依赖 idealTree:vue3-demo: sill idealTree buildDeps解决方案

第一步 第二步 第三步 第四步 直接输入npm install就可以安装依赖了

SpringBoot源码(1)ApplicationContext和BeanFactory

1、调用getBean方法 SpringBootApplication public class SpringBootDemoApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext SpringApplication.run(SpringBootDemoApplication.class, args);applicationContext.get…

Java强软弱虚引用的特点以及应用场景(面试重点)

强&#xff1a;即使OOM也不回收软&#xff1a;内存溢出前回收弱&#xff1a;只要垃圾收集就死虚&#xff1a;对垃圾收集没关系&#xff0c;只有得到通知&#xff08;插眼&#xff0c;也操作不了对象、只能看到它还活着&#xff09; 一、软引用 代码示例&#xff1a; public cl…

【C++开源】GuiLite:超轻量UI框架-入门

开发环境说明 使用visual Studio 2022进行开发 下载源码 从如下的网址进行源码和示例代码的下载: GitHub源码网址为:idea4good/GuiLite示例代码路径为:idea4good/GuiLiteExample使用方法 GuiLite是一个仅有头文件的一个库,使用的时候直接include到自己的UIcode.cpp文件…

Linux处理文件sed

一、什么是sed sed全称&#xff08;stream editor&#xff09;流式编辑器&#xff0c;Sed主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等&#xff0c;工作流程如下sed 是一种在线的、非交互式的编辑器&#xff0c;它一次处理一行内容。处理时&#xff…

十七、(正点原子)Linux LCD驱动

一、Framebuffer设备 在 Linux 中应用程序通过操作 RGB LCD 的显存来实现在 LCD 上显示字符、图片等信息。 先来看一下裸机 LCD 驱动如下&#xff1a; ①、初始化 I.MX6U 的 eLCDIF 控制器&#xff0c;重点是 LCD 屏幕宽(width)、高(height)、 hspw、 hbp、 hfp、 vspw…

【Python】连接MySQL数据库:详细教程与示例代码

文章目录 1. 安装必要的库2. 建立与MySQL的连接3. 执行SQL查询4. 插入数据5. 更新数据6. 删除数据7. 错误处理8. 小结 在数据驱动的开发中&#xff0c;连接数据库是一个至关重要的技能。Python作为一门强大的编程语言&#xff0c;提供了多种方式连接并操作MySQL数据库。本文将详…

【时时三省】(C语言基础)函数和数组

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ——csdn时时三省 函数 跟数学里面的函数很相似 数组 一组相同类型的元素的集合 比如把5个整形1-5存起来 int arr&#xff3b;10&#xff3d;&#xff1d;&#xff5b;1&#xff0c;2&#xff0c;3&#x…

转型做产品经理,考NPDP有什么好处?

机会是留给有准备的人的&#xff0c;如果此刻的你想要转岗但又没有方向&#xff0c;建议你可以考虑下产品经理这个岗位&#xff0c;产品经理是一个非技术型的岗位&#xff0c;但是懂一些技术相关的知识会更好的和技术部门沟通&#xff0c;能更好的从技术部门的角度理解需求的可…

浏览器打开抽奖系统html

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>在线抽奖 随机选取 自动挑选</title> <script src"https://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script> <style> body {…

验证跨设备挂载文件系统可行性命令

1.安装服务器端nfs-server-kernel 软件 sudo apt-get install nfs-kernel-server 2.配置服务器端软件路径 sudo vim /etc/default/nfs-kernel-server sudo service nfs-kernel-server statussudo service nfs-kernel-server restartsudo service nfs-kernel-server statu…

用Python爬虫能实现什么?

Python 是进行网络爬虫开发的一个非常流行和强大的语言&#xff0c;这主要得益于其丰富的库和框架&#xff0c;比如 requests、BeautifulSoup、Scrapy 等。下面我将简要介绍 Python 爬虫的基础知识和几个关键步骤。 1. 爬虫的基本原理 网络爬虫&#xff08;Web Crawler&#…

antdesgin table 组件下载成excel

文章目录 发现宝藏一、需求二、报错 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 一、需求 原组件如下&#xff0c;需要添加下载功能 import React, { useState } from rea…

Spring Boot + Spring Cloud 入门

运行配置 java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.profiles.activetest --my1.age32 --debugtrue "D:\Program Files\Redis\redis-server.exe" D:\Program Files\Redis\redis.windows.conf "D:\Program Files\Redis\redis-cli.exe" &q…

Go语言 Import导入

本文主要介绍Go语言import导入使用时注意事项和功能实现示例。 目录 Import 创建功能文件夹 加法 减法 主函数 优化导入的包名 .引入方法 总结 Import 创建功能文件夹 做一个计算器来演示&#xff0c;首先创建test文件夹。 加法 在test文件夹中创建add文件夹&#xff…

别卷模型,卷应用:从李彦宏的AI观点谈起

2024年7月4日&#xff0c;世界人工智能大会暨人工智能全球治理高级别会议在上海世博中心隆重召开。百度创始人、董事长兼首席执行官李彦宏在产业发展主论坛上的发言&#xff0c;引起了广泛关注。他提出&#xff1a;“大家不要卷模型&#xff0c;要卷应用&#xff01;”这一观点…

《简历宝典》17 - 简历中“技术能力”,如何丰满且有层次,前端篇

这一节开始对技术能力模块做讲解&#xff0c;我们身边的这些互联网IT从业者们&#xff0c;前端开发、Java开发、软件测试又或者是其他职位的开发者们&#xff0c;技术能力这个模块是绕不过去的&#xff0c;从简历上看&#xff0c;这个模块体现了我们之前软件工作生涯中的技术功…

大厂面试-基本功

大厂面试第4季 服务可用性多少个9是什么意思遍历集合add或remove操作bughashcode冲突案例BigdecimalList去重复IDEA Debugger测试框架ThreaLocal父子线程数据同步 InheritableThreadLocal完美解决线程数据同步方案 TransmittableThreadLocal 服务可用性多少个9是什么意思 遍历集…

Tensor列表索引本质

张量列表索引本质 单列表索引 将原张量shape对应位置数字更改为索引列表的形状 data torch.randn((9, 512, 30)) index_list [0, 1, 3] print(data[:, index_list].shape)[[9, 3, 30]] # torch.Size([1, 6, 5]) index2_list torch.IntTensor([[[4, 5, 6, 7, 8],[4, 5, 6,…