背景:有个一数据库记录增量更新线程,运行过程中,吃内存较大,打算用Java VIsualVM与MemoryAnalyzer分析一下原因。
首先启动服务器,用Java VIsualVM监视JVM进程界面如下:
启动增量更新线程
在吃掉1.3G左右内存的时候Dump堆内存,快照如下:
从上面可以看出主要是Oracle读取记录所有消耗的内存较多;
打开byte[]的实例数,查看引用:
从引用看,可以看出byte[]的引用主要是HashMap$Entry
将堆快照另存为heapdump.hprof
再用MemoryAnalyzer分析,首先用打开堆快照文件heapdump.hprof,在这个之前,要保证,MemoryAnalyzer的最大内存要大于,堆快照内存,可以通过修改MemoryAnalyzer的配置文件
MemoryAnalyzer.ini
我的如下:
-startup
plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.300.v20150602-1417
-vmargs
-Xmx2560m
由于我的堆快照的内存有1.3G,所以设置的最大内存为2.5G
MemoryAnalyzer分析完后主界面如下:
我们需要关注的是实例柱状图,内存泄漏报告和大对象
Leak Suspects: includes leak suspects and a system overview
The thread org.apache.tomcat.util.threads.TaskThread @ 0x791e33e50 http-apr-8080-exec-8 keeps local variables with total size 992,879,152 (95.20%) bytes.
The memory is accumulated in one instance of "java.util.Hashtable$Entry[]" loaded by "<system class loader>".
The stacktrace of this Thread is available. See stacktrace.
Keywords
java.util.Hashtable$Entry[]
从上面描述,内存主要被java.util.Hashtable$Entry[]实例所以占
Histogram: Lists number of instances per class
从Histogram来看,主要是Oracle数据占用内存
Dominator Tree: List the biggest objects and what they keep alive.
从上面来看Dominator Tree,主要是Oracle连接线程中的Hashtable$Entry的实例占用着内存;
线程实例图:
总结:
从上面的分析来看主要是Hashtable$Entry的实例占用着内存,这是由于我们把查询出来到的数据库记录放在了HashMap中导致的内存飙升,优化分页查询更新,去除不必要的HashMap对象的引用。
- 大小: 71.7 KB
- 大小: 38.6 KB
- 大小: 91 KB
- 大小: 62.1 KB
- 大小: 77.7 KB
- 大小: 58.5 KB
- 大小: 73.2 KB
- 大小: 73.7 KB
分享到:
相关推荐
MAT通过深入分析堆内存中的对象实例、引用关系以及类的加载情况,为用户提供清晰的报告和建议,从而有效地优化内存管理。 1. **MAT的主要功能**: - **内存泄漏检测**:MAT能够识别出可能导致内存泄漏的对象,通过...
《深入解析MemoryAnalyzer:JVM内存分析利器》 MemoryAnalyzer,简称MAT,是Eclipse基金会推出的一款强大的内存分析工具,其版本号为1.13.0.20220615-win32.win32.x86_64,专为Windows操作系统设计,支持32位和64位...
MemoryAnalyzer,通常简称为MAT,是由Eclipse基金会开发的一款强大的Java堆内存分析工具。它能帮助开发者定位并解决Java应用程序中的内存泄露问题。MAT通过分析heap dump文件(即Java虚拟机的堆内存快照),提供详尽...
Memory Analyzer(MAT)是IBM推出的一款强大的Java堆内存分析工具,它以其高效的性能和详尽的内存泄漏检测功能,成为了Java开发者不可或缺的诊断利器。本文将详细介绍MAT 1.8.1版本,这个独立工具,而非集成在...
6. **碎片分析**:MAT可以分析堆内存的碎片化程度,提供优化内存分配的建议,以提高系统性能。 7. **报告导出**:MAT的结果可以导出为CSV、XML或HTML格式,方便共享和进一步分析。 8. **兼容性**:MAT不仅支持IBM...
此外,MAT还支持与其他工具的集成,例如与JProfiler、VisualVM等结合,形成更完整的性能分析解决方案。 在实际使用中,MAT工具的效率和准确性赢得了广大开发者的认可。但需要注意的是,内存分析是一个复杂的过程,...
MemoryAnalyzer,简称MAT,由Eclipse基金会开发,是一款开源的Java堆内存分析工具。它的主要作用是对Java应用程序的内存使用情况进行深入分析,帮助开发者发现和解决内存泄漏、过度对象创建等问题,从而提高应用程序...
HeapAnalyzer是一款Java内存分析工具,由IBM开发,它可以帮助开发者检查和分析Java堆内存的状态,找出可能存在的内存泄漏或者过度占用内存的对象。通过分析heap dump文件,HeapAnalyzer可以展示对象的分布情况,识别...
《深入理解Java OOM分析与MemoryAnalyzer工具》 在Java编程中,内存管理是至关重要的一个环节,不当的内存使用可能导致程序性能下降,甚至出现“OutOfMemoryError”(简称OOM)异常,严重影响服务的稳定性和可靠性...
MAT,全称为Memory Analyzer Tool,是由IBM开发并开源的一款专业级Java堆内存分析器。这个工具的主要目标是对Java堆转储(Heap Dump)文件进行深入分析,找出内存泄漏的根源,优化内存使用,从而提高应用的运行效率...
今天我们将介绍的主角便是Java OOM分析的得力助手——Memory Analyzer Tool(MAT),它是一个强大的内存分析工具,特别适合于分析JVM的dump日志。 MAT是由Eclipse基金会开发的一款免费开源工具,主要用于分析Java堆...
1. **分析堆转储文件**:使用上述提到的工具,找出内存占用最大的对象和类,以及可能的内存泄漏点。 2. **优化代码**:根据分析结果,修改可能导致内存问题的代码,比如避免创建大量不必要的对象,或者及时释放不再...
6. **碎片分析**:MAT还能分析堆内存的碎片化情况,这对于优化内存分配和垃圾收集策略很有帮助。 7. **比较堆转储**:对比两次不同的heap dump,可以发现内存消耗的变化,有助于追踪内存泄漏的发生过程。 通过...
1. **理解默认值与自定义配置**:每个JVM都有默认的堆内存大小,但这个默认值可能并不适合所有应用。你可以通过JVM启动参数-Xms和-Xmx来分别设置初始堆内存和最大堆内存。例如,`-Xms256m -Xmx1024m`将初始堆设置为...
MAT(Memory Analyzer Tool)是由Eclipse基金会提供的一个强大的Java内存分析工具。它能对heap dump文件进行深入分析,找出可能存在的内存泄漏问题。MAT提供了多种视图和功能,如对象树、支配树、散列映射等,帮助...
IBM提供了强大的内存分析工具,例如VisualVM和MAT (Memory Analyzer Tool),它们能有效地解析heap dump文件,展示内存分配、对象存活状态、类装载信息等关键数据。这些工具不仅支持对IBM J9 JVM产生的heap dump,也...
然后,解压下载的MemoryAnalyzer-1.10.0.20200225.zip文件,运行其中的MAT可执行文件,导入堆转储文件进行分析。 在分析过程中,MAT会计算每个对象的浅堆(Shallow Heap)和保留堆(Retained Heap),前者表示对象...
- **内存分析工具**:例如VisualVM、MAT(Memory Analyzer Tool)、JProfiler等,可以帮助开发者分析堆转储文件,查找长期存在的对象及其引用链。 - **代码审查**:检查是否有未关闭的流、数据库连接、线程池、静态...
长期的内存泄露会导致Java虚拟机(JVM)的堆内存耗尽,引发OutOfMemoryError。 检查Java内存泄露的方法主要包括以下几个步骤: 1. **生成堆转储文件**:在Linux环境中,可以使用JVM提供的`jmap`命令生成堆转储文件...
MAT通过解析JVM生成的hprof文件(内存快照),可以深入分析堆内存的各个部分,包括对象分配、存活状态、引用关系等,帮助定位问题所在。 MAT的主要功能包括: 1. **对象概览**:提供一个整体的内存分配情况,展示...