如果有些系统的性能不是很稳定,随着时间的变化而变化,那么就要怀疑系统是否存在内存泄漏了。特别是哪些随时间的推移越来越慢的系统,很大程度上是Java内存对象有了泄漏。
不是说Java虚拟机是自动回收内存吗?怎么还存在内存泄漏?
事实上,有些内存泄漏是无法通过其它手段避免的,只能由编程开发人员在编程的时候主动避免。Java虚拟机的确可以将没有用的对象自动回收掉,可是有些泄漏是程序员的疏漏,一直保持了本应该释放的对象,因此Java虚拟机不认为这些对象是没有用的,因为他们跟其它有用的对象没什么区别,还有引用指着这些对象。这种情况就只能从源码着手了,找出内存泄漏的根源。Java虚拟机提供了很多工具来定位内存泄漏的位置。在Sun的Hotspot中,主要有jmap和jhat。
jmap
jmap命令用于查看当前java进程或者core dump文件,显示当前存在与内存中的对象分布情况,包括对象所属的类,对象的个数和所占内存的大小,并且依所占用的内存大小的顺序排列。用下面命令查找java的pid:
ps -ef|grep java
然后查看java进程的内存对象分布:
jmap -histo pid
结果如图:
C:\Documents and Settings\Administrator>jmap -histo 180
num #instances #bytes class name
----------------------------------------------
1: 13352 60321384 [B
2: 108823 13516768 <constMethodKlass>
3: 89912 9476704 [C
4: 108823 8710200 <methodKlass>
5: 152780 6715552 <symbolKlass>
6: 8796 5325984 <constantPoolKlass>
7: 8796 4219536 <instanceKlassKlass>
8: 16753 3896104 [I
9: 7026 2782816 <constantPoolCacheKlass>
10: 109717 2633208 java.lang.String
11: 40391 969384 java.util.HashMap$Entry
12: 13806 932104 [Ljava.lang.Object;
13: 9400 902400 java.lang.Class
14: 8076 854312 [Ljava.util.HashMap$Entry;
15: 11426 794936 [S
16: 13935 685408 [[I
但是有时候光知道对象的数量和内存占用量是不够的,因为这些数据只是提供了有可能泄漏的对象,没有告诉这些对象是什么地方分配的。要定位内存泄漏还需要更多的信息。这时候就需要jhat工具了。
jhat在使用jhat之前,还需要用jmap获得更加详细的数据。一般用下面命令获得一个二进制的输出文件:
C:\Documents and Settings\Administrator>jmap -dump:file=heap.bin 180
Dumping heap to C:\Documents and Settings\Administrator\heap.bin ...
Heap dump file created
然后用下面的命令用jhat来分析这个文件:
C:\Documents and Settings\Administrator>jhat -J-mx512m heap.bin
Reading from heap.bin...
Dump file created Mon Dec 06 23:36:22 CST 2010
Snapshot read, resolving...
Resolving 713062 objects...
.................
Eliminating duplicate references................................................
......................................................................Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
这个命令会启动一个Web服务器,并在7000端口上监听。这时候可以借助浏览器访问http://localhost:7000,这个页面可以看到很多详细的信息,包括哪些对象是哪些类创建的。可以从http://localhost:7000/histo/入手,这个页面不但可以看到当前内存中对象的情况,还可以点击每一种对象来查找哪些正在使用此对象的其它对象,如下图:
另外http://localhost:7000/showInstanceCounts/includePlatform/页面可以想jmap命令一样,提供对象实例的数量和大小的信息,如下图:
此外值得一提的是查询页面http://localhost:7000/oql/,这个页面可以让你输入类似数据库sql查询语句,根据需求定位到相关的信息,如下图:
- 大小: 118.1 KB
- 大小: 162.1 KB
- 大小: 24.4 KB
分享到:
相关推荐
"ie内存泄露监控软件"是专门针对IE浏览器设计的一种工具,旨在检测和分析IE客户端可能出现的内存泄露情况。内存泄露是指程序在分配内存后未能正确释放,随着时间的推移,会导致系统资源逐渐耗尽,影响应用程序的性能...
标题中的"vc++内存泄露监控工具"指的是在Visual C++环境中使用的特定工具,用于监控和定位程序中的内存泄露。这些工具通常包含在Microsoft Visual Studio的调试器功能中,尤其是当我们在Debug模式下运行程序时,它们...
`sIEve IE内存泄露监控` 是一款专注于检测和分析Internet Explorer(简称IE)浏览器内存泄漏问题的工具。它作为一个绿色软件,无需安装即可直接运行,为用户提供了一种方便的方式来检测网页在IE浏览器中可能导致性能...
**Drip-0.5:DOM元素与内存泄漏监控利器** Drip-0.5是一款专为开发者设计的工具,特别适用于Internet Explorer浏览器插件,它提供了强大的功能,帮助开发者深入理解和诊断DOM(文档对象模型)元素以及浏览器的内存...
OOMDetector是一个iOS内存监控组件,应用此组件可以帮助你轻松实现OOM监控、大内存分配监控、内存泄漏检测等功能。 特性 1.OOM监控:监控OOM,Dump引起爆内存的堆栈 2.大内存分配监控:监控单次大块内存分配,提供...
此外,jconsole还支持设置告警阈值,当内存使用超过预设值时会触发告警,提醒开发者关注可能存在的内存泄漏。 `jinfo`工具主要用于获取和修改Java进程的配置信息,如JVM参数。例如,我们可以通过`jinfo -flag ...
LeakDiag的工作原理是监控进程的内存分配和释放操作,当程序结束时,它会报告那些未被释放的内存块,这些通常就是潜在的内存泄漏。 使用LeakDiag,开发者可以: 1. **集成到调试流程**:在Visual Studio或其他IDE...
AQTime是一款强大的代码分析工具,尤其擅长于内存泄漏和资源泄漏的监控,广泛应用于.NET和JAVA应用程序。它由AutomatedQA公司开发,可与Visual Studio或Embarcadero RAD Studio集成,提供全面的性能和资源调试功能。...
在Linux系统中,内存泄漏是程序开发中一个严重的问题,会导致系统资源逐渐耗尽,影响程序的稳定性和系统的整体性能。解决这个问题的关键在于能够有效地检测并定位内存泄漏的位置。本资料包提供了一种常用且强大的...
在C++编程中,内存管理是一项关键任务,而内存泄漏是开发者经常遇到的挑战。内存泄漏指的是程序在分配了内存后未能正确释放,导致这部分内存无法再被程序使用,随着时间推移,大量的内存泄漏可能会耗尽系统资源,...
JNI层内存泄漏检测工具是针对Android应用开发中的一个重要问题——JNI内存泄漏的解决方案。JNI,全称为Java Native Interface,允许Java代码与其他编程语言(如C++)交互,从而利用其性能优势。然而,由于Java和C/...
它的工作原理是通过插入运行时指令来监控程序的行为,从而能够检测出程序中的内存泄漏、未初始化的内存访问、越界内存访问等问题。 **内存泄漏的定义与危害** 内存泄漏是指程序在申请内存后,无法释放已不再使用的...
监控这些操作有助于发现可能的内存泄漏、异常访问或潜在的安全问题。 该软件的功能主要集中在以下几个方面: 1. **进程监控**:软件能够监控指定的进程,查看其对其他进程的内存访问行为。这有助于分析进程间的...
内存监控工具能够帮助开发者检测和分析应用的内存使用情况,预防和解决内存泄漏等问题。"Emmagee.apk"可能是一个专用于Android设备的内存监控应用,它允许用户直接在手机上查看和分析内存使用状况。 一、Android...
5. 根据监控结果,定位并修复内存泄露问题,优化代码。 总的来说,LuaMonitor是一款强大的Lua内存管理辅助工具,它为开发者提供了详尽的内存使用信息,有助于提高项目的性能和稳定性。通过熟练运用LuaMonitor,可以...
OOMDetector是一个iOS内存监控组件,应用此组件可以帮助你轻松实现OOM监控、大内存分配监控、内存泄漏检测等功能。 特性 1.OOM监控:监控OOM,Dump引起爆内存的堆栈 2.大内存分配监控:监控单次大块内存分配...
### 如何解决Java内存泄漏 #### 1. 背景 Java凭借其垃圾回收机制大大简化了内存管理,使得开发者无需手动管理内存的释放,从而提升了开发效率。然而,这种自动化管理也可能成为一把双刃剑,特别是当开发人员忽视...
方法是:经过一段时间的测试、监控,如果某个类的对象数目屡创新高,即使在 JVM Full GC 后仍然数目降不下来,这些对象基本上是属于内存泄漏的对象了。 五、案例分析 通过对 Web 应用服务器的内存回收图形的分析,...
在应用的Application类中安装LeakCanary,这样每当应用运行时,它就会自动检测内存泄露,并在检测到问题时通过通知栏提供详细的泄漏信息。点击通知可以直接查看泄漏的对象和引用链,极大地简化了内存泄露的诊断过程...
在C语言编程中,内存管理是一项关键任务,尤其是在开发大型软件系统时,内存泄漏问题可能导致程序性能下降甚至崩溃。内存泄漏是指程序分配了内存但未能正确释放,这会导致可用内存逐渐减少,影响程序的稳定性和持久...