软件开发的家园,编程爱好者的天地.

现在是:北京时间 2016/4/14 上午11:50:51 星期四

设为首页  |  加入收藏  |  网站地图

当前位置: 第八基地首页 > java > j2ee >
JRockit JVM 中的内存泄漏检测 正确工具所具有的独特功能
发布于:第八基地 来源:互联网 作者:天堂路上 时间:2011-10-20 点击:109

  是什么导致了Java程序中的内存泄漏呢?难道Java虚拟机(JVM)的垃圾收集器不应该管理未使用的内存吗?是的,它会进行管理,但是垃圾收集的对象只能是不再被引用的对象。在Java中,典型的内存泄漏出现在以下情形中:不再需要某些对象,但是系统中仍有某个地方在引用它,这样就不能对这些对象进行垃圾收集。

  在大型企业系统中,Java代码中的内存泄漏是常见而且难于解决的问题。这些泄漏问题通常是在部署之后发现的,难于在测试环境中得到重现。这是为什么呢?理由之一是,已部署的系统需要处理更大量的数据,而且有可能在执行数周之后才会发现Java堆在缓慢地增长。最终,这将导致系统内存耗尽。

  我们怎样发现泄漏呢?市场上有很多可用的工具,但是其中大多数工具,要么是基于创建Java堆转储,并离线分析它,要么是基于JVMPI,而JVMPI会使应用程序的执行变得非常缓慢。在BEA的JVMJRockit1.4.2_05版中,存在一个交互式内存泄漏检测工具的技术预览,JRockitMemoryLeakDetector,它支持在系统全速运行时使用。在本文中,我们将看一看这个试验性的工具以及它可能发生的一些事情。我们还将试着展望一下该工具未来版本的功能,并复习一下内存泄漏的一些常见类型。

MemoryLeakDetector

  设计MemoryLeakDetector的目的是将其用在生产环境中,而不会给系统增加很大的性能负担。许多JVM内部的内存泄漏检测功能直接构建在JRockit垃圾收集器内,以求获得更高的性能。JRockit有一个管理控制台,用于监控和管理一个或多个JVM。内存泄漏检测工具当前被构建在JRockitManagementConsole中,但是在今年的1.5版之后的JRockitJDK中,可以把它当作一个单机工具来使用。其思路是,系统将帮助开发人员理解三件事情:是否有内存泄漏,如果有,泄漏的是什么,以及哪里出现泄漏。

  在我们进行详细分析之前,我想要强调一点,这是一个低级的工具。例如,它不会告诉您泄漏出现在什么EJB中。数据从JVM被直接传递给MemoryLeakDetector,而JVM没有容器、EJB或者任何其他J2EE组件的概念。它只会处理类、数组和实例。只要您可以访问源代码,就应该不会引起任何问题。

方法

  让我们开始吧。第一步是确定系统中是否真的存在内存泄漏。为此,我们首先要在管理控制台中创建一个连接,连接至我们感兴趣的JVM,并确保系统正在运行且没有过载。然后,转到管理控制台中的“MemLeakDetector”选项卡。这里,我们要在JRockit中启用内存泄漏检测系统,这将启动内存增长的一个趋势分析。JVM中每次进行垃圾收集时,JRockit都会把趋势数据发送给位于一个趋势分析表中的MemoryLeakDetector(参见图1)。

实例研究

  趋势分析显示了堆(或者类,如果您更喜欢的话)上最常见的对象类型,以及用于这些类型的内存增长速率。它还给出了各个类型的当前内存使用和实例数量。趋势分析的运行时间越长,趋势就越可靠。各个类型是按照增长速率的顺序排列的,而我们感兴趣的正是增长速率最高的类型——这些就是泄漏的类型。在图1的例子中,显然有三种类型要为内存泄漏负责:DemoLeakDemoObject、HashtableEntry、和HashtableEntry[]。我将使用这个例子作为一次实例研究,以便说明JRockitMemoryLeakDetector的功能。

对我有帮助
(0)
0%
对我没帮助
(0)
0%
返回顶部
在线反馈
在线反馈