背景:有个一数据库记录增量更新线程,运行过程中,吃内存较大,打算用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
分享到:
相关推荐
memoryAnalyzer可以分析Java进程内存情况,比如每个对象占用内存情况,对象个数,占用百分比,可依此分析后定位到代码哪里不合理; jemter用作压力测试,就是测试系统能够支撑的并发数 jvisualvm是jdk自带工具,...
一款开源的jvm内存分析工具,也是《深入理解java虚拟机》一书中使用的工具,作用与官方的visualvm类似但要更优秀
https://java.net/projects/tda/downloads/directory/visualvm 官方下载的,附带使用方法,Visualvm的TDA插件,能很好的分析线程Dump日志,吐血推荐!
JVisualVM简介与内存泄漏实战分析,如何分析内存溢出,定位内存溢出问题
可以使用VisualVM生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、 执行内存和CPU分析,同时它还支持在MBeans上进行浏览和操作。
开发人员可以利用它来监控、分析线程信息,浏览内存堆数据。系统管理员可以利用它来监测、控制 Java 应用程序横跨整个网络的情况。Java 应用程序使用人员可以利用它来创建包含所有必要信息的 Bug 报告。
Java内存监控工具Java VisualVM
visualvm143.zip
VisualVM 2.1.5 (visualvm_215.zip)是一个集成了命令行 JDK 工具和轻量级分析功能的可视化工具。 专为开发和生产时间使用而设计。
开发人员可以利用它来监控、分析线程信息,浏览内存堆数据。系统管理员可以利用它来监测、控制Java应用程序横跨整个网络的情况。Java应用程序使用人员可以利用它来创建包含所有必要信息的Bug 报告。
VisualVM 142 For Mac,亲测好用 VisualVM 是一个工具,它提供了一个可视界面,用于查看 Java 虚拟机 (Java ...此外,还可以捕获有关 JVM 软件实例的数据,并将该数据保存到本地系统,以供后期查看或与其他用户共享
性能分析神器VisualVM VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优。
visualvm,java jvm监控工具,可远程调试程序,idea下载-visualvm-launcher插件容易使用
visualvm java 内存查看工具,解压,进入bin目录,运行就OK。
visualvm_144.zip 官网 最新版的Java visualvm 性能监控
可以使用VisualVM生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和CPU分析,同时它还支持在MBeans上进行浏览和操作。尽管VisualVM自身要在JDK6这个版本上运行,但是JDK1.4以上版本的程序它都能监控。
功能包括内存分析、快照功能、转储功能、CPU分析等等,系统管理员可以利用它来监测、控制Java应用程序横跨整个网络的情况。 它集成了多个JDK命令工具的一个可视化工具,它主要用来监控JVM的运行情况,
VisualVM is a visual tool integrating commandline JDK tools and lightweight profiling capabilities. Designed for both development and production time use.
VisualVM简介