`
pengtyao
  • 浏览: 401014 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

内存泄漏的监控

阅读更多
    如果有些系统的性能不是很稳定,随着时间的变化而变化,那么就要怀疑系统是否存在内存泄漏了。特别是哪些随时间的推移越来越慢的系统,很大程度上是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
分享到:
评论
1 楼 唐门书生 2011-07-29  
  沙发

相关推荐

    ie内存泄露监控软件

    "ie内存泄露监控软件"是专门针对IE浏览器设计的一种工具,旨在检测和分析IE客户端可能出现的内存泄露情况。内存泄露是指程序在分配内存后未能正确释放,随着时间的推移,会导致系统资源逐渐耗尽,影响应用程序的性能...

    vc++内存泄露监控工具

    标题中的"vc++内存泄露监控工具"指的是在Visual C++环境中使用的特定工具,用于监控和定位程序中的内存泄露。这些工具通常包含在Microsoft Visual Studio的调试器功能中,尤其是当我们在Debug模式下运行程序时,它们...

    sIEve IE内存泄露监控

    `sIEve IE内存泄露监控` 是一款专注于检测和分析Internet Explorer(简称IE)浏览器内存泄漏问题的工具。它作为一个绿色软件,无需安装即可直接运行,为用户提供了一种方便的方式来检测网页在IE浏览器中可能导致性能...

    Drip-0.5,用于查看DOM元素和内存泄漏监控

    **Drip-0.5:DOM元素与内存泄漏监控利器** Drip-0.5是一款专为开发者设计的工具,特别适用于Internet Explorer浏览器插件,它提供了强大的功能,帮助开发者深入理解和诊断DOM(文档对象模型)元素以及浏览器的内存...

    ios-iOS内存泄漏、爆内存监控组件.zip

    OOMDetector是一个iOS内存监控组件,应用此组件可以帮助你轻松实现OOM监控、大内存分配监控、内存泄漏检测等功能。 特性 1.OOM监控:监控OOM,Dump引起爆内存的堆栈 2.大内存分配监控:监控单次大块内存分配,提供...

    【转】Java内存泄露_JVM监控工具介绍jstack_jconsole_jinfo_jmap_jdb_jstat

    此外,jconsole还支持设置告警阈值,当内存使用超过预设值时会触发告警,提醒开发者关注可能存在的内存泄漏。 `jinfo`工具主要用于获取和修改Java进程的配置信息,如JVM参数。例如,我们可以通过`jinfo -flag ...

    Windows内存泄漏排查工具

    LeakDiag的工作原理是监控进程的内存分配和释放操作,当程序结束时,它会报告那些未被释放的内存块,这些通常就是潜在的内存泄漏。 使用LeakDiag,开发者可以: 1. **集成到调试流程**:在Visual Studio或其他IDE...

    AQTime进行内存泄露和资源泄漏监控.pdf

    AQTime是一款强大的代码分析工具,尤其擅长于内存泄漏和资源泄漏的监控,广泛应用于.NET和JAVA应用程序。它由AutomatedQA公司开发,可与Visual Studio或Embarcadero RAD Studio集成,提供全面的性能和资源调试功能。...

    linux下检查内存泄漏的工具+例子

    在Linux系统中,内存泄漏是程序开发中一个严重的问题,会导致系统资源逐渐耗尽,影响程序的稳定性和系统的整体性能。解决这个问题的关键在于能够有效地检测并定位内存泄漏的位置。本资料包提供了一种常用且强大的...

    C++内存泄露检测器

    在C++编程中,内存管理是一项关键任务,而内存泄漏是开发者经常遇到的挑战。内存泄漏指的是程序在分配了内存后未能正确释放,导致这部分内存无法再被程序使用,随着时间推移,大量的内存泄漏可能会耗尽系统资源,...

    jni层内存泄漏检测工具

    JNI层内存泄漏检测工具是针对Android应用开发中的一个重要问题——JNI内存泄漏的解决方案。JNI,全称为Java Native Interface,允许Java代码与其他编程语言(如C++)交互,从而利用其性能优势。然而,由于Java和C/...

    arm环境内存泄漏检测工具valgrind

    它的工作原理是通过插入运行时指令来监控程序的行为,从而能够检测出程序中的内存泄漏、未初始化的内存访问、越界内存访问等问题。 **内存泄漏的定义与危害** 内存泄漏是指程序在申请内存后,无法释放已不再使用的...

    简单的内存读写监控软件。

    监控这些操作有助于发现可能的内存泄漏、异常访问或潜在的安全问题。 该软件的功能主要集中在以下几个方面: 1. **进程监控**:软件能够监控指定的进程,查看其对其他进程的内存访问行为。这有助于分析进程间的...

    android应用内存监控工具

    内存监控工具能够帮助开发者检测和分析应用的内存使用情况,预防和解决内存泄漏等问题。"Emmagee.apk"可能是一个专用于Android设备的内存监控应用,它允许用户直接在手机上查看和分析内存使用状况。 一、Android...

    Lua内存泄露检测工具LuaMonitor下载.rar

    5. 根据监控结果,定位并修复内存泄露问题,优化代码。 总的来说,LuaMonitor是一款强大的Lua内存管理辅助工具,它为开发者提供了详尽的内存使用信息,有助于提高项目的性能和稳定性。通过熟练运用LuaMonitor,可以...

    ios-Tencent开源:内存泄漏、爆内存监控.zip

    OOMDetector是一个iOS内存监控组件,应用此组件可以帮助你轻松实现OOM监控、大内存分配监控、内存泄漏检测等功能。 特性 1.OOM监控:监控OOM,Dump引起爆内存的堆栈 2.大内存分配监控:监控单次大块内存分配...

    如何解决Java内存泄漏

    ### 如何解决Java内存泄漏 #### 1. 背景 Java凭借其垃圾回收机制大大简化了内存管理,使得开发者无需手动管理内存的释放,从而提升了开发效率。然而,这种自动化管理也可能成为一把双刃剑,特别是当开发人员忽视...

    JProfiler对应用服务器内存泄漏问题诊断解决方案.docx

    方法是:经过一段时间的测试、监控,如果某个类的对象数目屡创新高,即使在 JVM Full GC 后仍然数目降不下来,这些对象基本上是属于内存泄漏的对象了。 五、案例分析 通过对 Web 应用服务器的内存回收图形的分析,...

    使用Android Studio检测内存泄露(LeakCanary)

    在应用的Application类中安装LeakCanary,这样每当应用运行时,它就会自动检测内存泄露,并在检测到问题时通过通知栏提供详细的泄漏信息。点击通知可以直接查看泄漏的对象和引用链,极大地简化了内存泄露的诊断过程...

    C 语言检测内存泄露的方法(例子)

    在C语言编程中,内存管理是一项关键任务,尤其是在开发大型软件系统时,内存泄漏问题可能导致程序性能下降甚至崩溃。内存泄漏是指程序分配了内存但未能正确释放,这会导致可用内存逐渐减少,影响程序的稳定性和持久...

Global site tag (gtag.js) - Google Analytics