前言
生产环境中,尤其是吃大内存的JVM,一旦出现内存泄露等问题是非常容易引发OutofMemory的,如果没有一个好的工具提供给开发人员定位问题和分析问题,那么这将会是一场 噩梦。目前JDK其实自带有一些内存泄露分析工具专门用于帮助开发人员定位内存泄露等问题,但是这些工具往往并不是能够满足一些现状,这里笔者所指的现状更多是迅速、便捷、高效的定位出问题,方便开发人员迅速进行调整。
造成OutOfMemoryError原因一般有2种:
1、内存泄露,对象已经死了,无法通过垃圾收集器进行自动回收,通过找出泄露的代码位置和原因,才好确定解决方案;
2、内存溢出,内存中的对象都还必须存活着,这说明Java堆分配空间不足,检查堆设置大小(-Xmx与-Xms),检查代码是否存在对象生命周期太长、持有状态时间过长的情况。
注意:生成的dump文件是.hprof文件,设置tomcat一但oom是生成dump和内置内存大小一样,在一个位置,
-server -Xms1024m -Xmx1024m -Xmn384m -XX:+UseParallelOldGC
-XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:+PrintGCDetails
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=c:/heap.bin
首得c盘有heap.bin文件夹
目录
一、使用jmap工具生成dump文件
二、MAT工具的下载和安装
三、使用MAT工具进行内存泄露分析
一、使用jmap工具实现堆转储、
jmap是什么?简单来说,jmap是JDK自带的一种用于生成内存镜像文件的工具,通过该工具,开发人员可以快速生成dump文件。开发人员可以使用命令“jmap -help”查看jmap的常用命令,如下所示:
Usage: jmap [option] <pid> (to connect to running process) jmap [option] <executable <core> (to connect to a core file) jmap [option] [server_id@]<remote server IP or hostname> (to connect to remote debug server) where <option> is one of: <none> to print same info as Solaris pmap -heap to print java heap summary -histo[:live] to print histogram of java object heap; if the "live" suboption is specified, only count live objects -permstat to print permanent generation statistics -finalizerinfo to print information on objects awaiting finalization -dump:<dump-options> to dump java heap in hprof binary format dump-options: live dump only live objects; if not specified, all objects in the heap are dumped. format=b binary format file=<file> dump heap to <file> Example: jmap -dump:live,format=b,file=heap.bin <pid> -F force. Use with -dump:<dump-options> <pid> or -histo to force a heap dump or histogram when <pid> does not respond. The "live" suboption is not supported in this mode. -h | -help to print this help message -J<flag> to pass <flag> directly to the runtime system
在此大家需要注意,jmap工具有一部分命令仅限于Linux和Solaris平台,而Windows平台下能够使用的命令只有“jmap -histo<pid>”和“jmap -dump:<dump-options><pid>”。不过一般来说,使用命令“jmap -dump:<dump-options><pid>”生成dump文件应该是最常用的命令之一,由于生成dump文件时比较耗时的,因此大家需要耐心等待,尤其是大内存镜像生成dump文件则需要耗费更长的时间来完成。
二、MAT工具的下载和安装
MAT(Memory Analyzer Tool)工具是eclipse的一个插件,使用起来非常方便,尤其是在分析大内存的dump文件时,可以非常直观的看到各个对象在堆空间中所占用的内存大小、类实例数量、对象引用关系、利用OQL对象查询,以及可以很方便的找出对象GC Roots的相关信息,当然最吸引人的还是能够快速为开发人员生成内存泄露报表,方便定位问题和分析问题。
MAT工具的下载地址为: http://www.eclipse.org/mat/downloads.php
MAT插件的下载地址为: http://download.eclipse.org/mat/1.3/update-site/
笔者所使用的MAT工具的版本为最新的1.4.0,为了避免在实际使用过程中出现一些不必要的异常情况,笔者建议大家使用与笔者相同版本版本的MAT工具分析dump文件。
只要确保机器上成功装有JDK并配置好相关的环境变量后,运行“MemoryAnalyzer-1.4.0.20140604-win32.win32.x86\mat\”目录下的MemoryAnalyzer.exe即可成功启动MAT工具。
三、使用MAT工具进行内存泄露分析
当大家成功下载和安装好MAT后,接下来要做的事情就是使用jmap+MAT工具一起进行内存泄露工作的分析。首先笔者先准备一段测试代码,如下所示:
/** * -server -Xms1024m -Xmx1024m -Xmn384m -XX:+UseParallelOldGC * -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:+PrintGCDetails * -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=c:/heap.bin */ public class GCTest { public static void main(String[] args) { final int _1mb = 1024 * 1024; byte[] value1 = new byte[_1mb * 100]; byte[] value2 = new byte[_1mb * 100]; byte[] value3 = new byte[_1mb * 100]; new Thread() { public void run() { byte[] value4 = new byte[_1mb * 400]; } }.start(); byte[] value5 = new byte[_1mb * 200]; } }
在上述代码示例中,具体的VM参见类注释,而选项“-XX:+HeapDumpOnOutOfMemoryError ”和-“XX:HeapDumpPath”所代表的含义就是当程序出现OutofMemory时,将会在相应的目录下生成一份dump文件,而如果不指定选项“XX:HeapDumpPath”则在当前目录下生成dump文件。在此大家需要注意,尽管不借助jmap工具,MAT工具也能够直接生成dump文件,但是考虑到生产环境中几乎不可能在线对其进行分析,大都是采用离线分析,因此使用jmap+MAT工具是最常见的组合。
当上述程序执行时,必然会触发OutofMemory,然后在所指定的目录下找到生成的dump文件后,我们便可以通过MAT工具来进行分析了。当成功启动MAT后,通过菜单选项“File->Open heap dump...”打开指定的dump文件后,将会生成Overview选项,如图1-1所示:
图1-1 Overview选项
在Overview选项中,以饼状图的形式列举出了程序内存消耗的一些基本信息,其中每一种不同颜色的饼块都代表了不同比例的内存消耗情况。如果说需要定位内存泄露的代码点,我们可以通过Dominator Tree菜单选项来进行排查(MAT工具仅仅只是一个辅助,分析OutofMemory并不存在一个固定的方式和准则,因此仔细观察和分析才能够找到问题所在),如图1-2所示:
图1-2 Dominator Tree选项
相关推荐
MAT在64位版本下运行,能够处理更大的内存数据,对于处理大型Java应用或Android应用的内存分析尤为适用。 MAT的核心功能包括: 1. **快照分析**:用户可以生成Java虚拟机(JVM)的内存快照,这通常是通过在应用...
在实际使用中,开发者应结合日志、代码审查和其他性能指标,综合分析MAT提供的信息,找出并修复内存问题。此外,定期进行内存分析和优化,是保持应用程序高效运行的关键步骤。记住,MAT虽然强大,但理解Java内存模型...
同时,要检查脚本中的输入参数,如NC文件路径、变量名等,确保与实际文件匹配。如果遇到问题,可以通过MATLAB的错误信息或脚本内部的注释来诊断和解决。 通过这些脚本,用户可以在不熟悉NetCDF格式的情况下,利用...
在实际应用中,用户可能需要根据具体的`.dat`和`.scv`文件格式调整这些转换函数,以确保数据的准确无误地导入到MATLAB环境中。通过这样的转换,用户可以利用MATLAB强大的数学和信号处理能力对数据进行深入分析,从而...
在实际应用中,这些转换功能常常与线性代数中的运算相结合,如矩阵乘法、特征值分解、奇异值分解等。例如,在图像处理领域,向量和矩阵的转换可能用于表示像素数据,而在机器学习中,向量化的特征可以方便地进行模型...
MAT,全称Memory Analyzer Tool,是由Eclipse基金会开发的一款强大的Java内存分析工具。这款工具的主要功能是帮助开发者诊断和...在实际工作中,结合代码审查和性能测试,MAT能够成为优化Java应用内存管理的得力助手。
通过MAT工具,开发者可以有效地定位和解决Android应用中的内存泄漏问题,从而提高应用的运行效率和用户体验。不过,值得注意的是,MAT虽然强大,但并不能完全代替开发者对代码的深入理解和优化,合理的编程习惯和对...
MAT,全称Memory Analyzer Tool...在实际开发中,MAT不仅用于问题排查,也是进行性能调优的重要工具,对于理解和优化Java应用程序的内存管理有着不可或缺的作用。掌握MAT的使用,能显著提升开发者解决内存问题的能力。
《JVM排查工具MAT在JDK 11中的应用与OOME问题解决》 Java虚拟机(JVM)是Java程序运行的基础,然而在复杂的系统环境中,内存管理问题时常出现,其中最典型的便是OutOfMemoryError(OOME)。为了解决这类问题,...
《MAT 1.3.1:语料库多层次分析利器》 MAT 1.3.1.zip是一款专门针对语料库进行多层次分析的软件,它...无论是学术研究还是实际应用,MAT都能帮助用户深入剖析语言数据,揭示隐藏的模式和趋势,推动语言学领域的发展。
MAT,全称Memory Analyzer Tool,是Eclipse基金会提供的一个强大的Java堆内存分析工具。...通过编写测试用例模拟实际问题,结合MAT提供的详尽分析报告,我们可以定位并解决内存泄漏问题,提升应用的稳定性和效率。
理解MAT提供的各种视图和报告后,开发者可以根据实际情况调整代码,优化内存使用。例如,减少不必要的对象创建,正确使用集合类,避免全局静态变量持有大量对象,以及适时地释放不再使用的资源。 总结,MAT作为一款...
LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是美国国家仪器公司(NI)开发的一款图形化编程环境,主要用于创建...在实际应用中,可能还需要根据具体需求进行定制化开发和调试,以达到最佳效果。
《MAT在Linux环境下的应用深度解析》 MemoryAnalyzerTool(MAT),全称为Eclipse Memory ...在实际操作中,结合具体问题和MAT提供的丰富信息,一定能帮助你解决棘手的内存问题,让代码更加健壮,系统更加高效。
MATLAB和LabVIEW是两种广泛应用的工具,MATLAB擅长数值计算和数据分析,而LabVIEW则以其图形化编程界面和强大的硬件集成能力著称。本篇文章将深入探讨如何将MATLAB的.mat文件转换为LabVIEW可读取的波形文件,以便在...
BMP文件分为两部分:位图文件头(BITMAPFILEHEADER)和位图信息头(BITMAPINFOHEADER),后面跟着实际的像素数据。C语言中,我们可以定义结构体来表示这些头部信息,并手动写出写入文件的逻辑。 3. **转换过程**: ...
在实际应用中,我们经常需要处理不同的图像格式和数据类型。Mat支持多种数据类型,包括8位无符号整型(uchar)、16位无符号整型(ushort)、32位浮点型(float)等,可以适应各种图像处理任务。例如,进行颜色空间...
在OpenCV库中,`Mat`是用于存储图像数据的核心数据结构。...在实际项目中,根据需求可能会涉及到错误处理、性能优化、用户交互等方面的内容。理解这些基础操作对于开发图像处理或计算机视觉相关的应用至关重要。
在实际应用中,这种转换工具的使用场景可能包括: - 处理实验或测量数据,例如从传感器设备获取的原始信号。 - 导入其他软件生成的二进制结果,如数值模拟或仿真输出。 - 将已有的二进制格式数据集集成到MATLAB分析...
在实际开发中,当发现应用运行缓慢或频繁重启时,可借助MAT进行分析。例如,一个常见的内存泄漏场景是静态变量或单例模式中持有Activity的引用,导致Activity无法被系统正常回收。MAT可以清晰地展示这些引用关系,...