2024年5月3日发(作者:)

教你使用JRMC(内存分析工具)

作者:(阮高朋)

发表日期:2010年08月30日

简介

内存溢出是大部分大型java项目都无法避免的问题,为了解决这个历史性难题,内存

分析工具也层出不穷,SUN JDK提供JDKPI和JDKTI、jmap、Quest公司的JProbe等

等,但是很多工具由于资源消耗过大,只能在测试环境使用,无法诊断生产环境内存溢出

的问题。

本文介绍一种内存分析工具:BEA JRockit Mission Control即JRMC,用来诊断内存

溢出并指出根本原因。该工具的开销非常小,因此可以使用它来寻找生产环境中的系统的

内存溢出。

什么是内存溢出

Java虚拟机和垃圾回收器负责管理内存任务,但是Java应用系统中还是有可能出现

内存泄漏,OOM(outofmemory)的现象在许多项目中也是一个常见的问题。避免内存

溢出首先是要弄清楚它是如何发生的,然后对症下药。

Oom的根源基本上分为三种:

一、 内存分配过小,不满足应用的需要,应用无法分配到所需要的内存就会发生

oom。

二、 应用程序逻辑不合理,申请过多的内存,导致内存耗尽,发生oom。例如从数

据库获取大量数据一次性展现在web页面上。

三、 Java程序内存泄露。

前面两条好理解,那什么是内存泄露呢,为什么Java 虚拟机的垃圾收集器不能回收

内存呢?因为垃圾回收器垃圾收集的对象只能是不再被引用的对象。但是,某些不再需要

的对象,却在系统的某个地方仍在引用它,这样就不能对这些对象进行垃圾收集,在日志

中的大量String对象的生成以及编写Java代码时的一些常见的内存泄漏陷阱等等都会造

成内存泄漏,但是要在开发阶段完成找出造成泄漏的代码是非常困难的。Java代码中的内

存泄漏是常见而且难于解决的问题,这些泄漏问题通常是在最不愿意它发生的正式生产环

境中发现的,而且它也很难于在开发与测试环境中得到重现。这是为什么呢?生产环境中

的系统需要处理更大量的数据,而且有可能在运行很长时间后才会发现 Java堆在缓慢地

增长。最终,导致系统内存耗尽。

JRMC详解

它包括三个独立的应用程序:内存泄漏监测器(Memory Leak Detector)、JVM运

行时分析器(Runtime Analyzer)和管理控制台(Management Console)。

➢ JRockit Management Console