2012-07-18 66 views
0

我们试图让一台HP UX服务器运行起来,用Java运行一些批处理作业。简而言之,问题在于:Java类加载器泄漏 - 下一步?

这些批处理作业运行在Jeus应用服务器(韩国产品)上。尽管大部分作业都按时运行,但一些批量作业报告了着名的PermGen内存不足错误。我们得到了堆转储并开始查看JVM选项。它们如下:Xms - 2048m Xmx - 2048m PermSize - 512m MaxPermSize - 512m。旧的GC收集器是CMS,年轻一代的收集器是一个平行收集器。

我们注意到实际的堆大小非常好,并且PErm Gen耗尽了它所有的512m内存。 HPJmeter表明,这是一个内存逐渐增加,因此,我们怀疑是内存泄漏。我们查看了所有类加载器,并且大约有168个核心Jeus App Server ClassLoader实例。内存泄漏估计器显示这个Class Loader泄漏内存。它表明所拥有的字节数只有3MB左右。

我们看了一下这个类加载器加载的类/类型的数量,大约有512个项目。内存泄漏还显示一些其他对象涉及内存泄漏。

我有以下问题:

  1. 现在,这是泄漏的类加载器已经确定,我们如何辨别这是造成问题的确切引用(S)?
  2. 如果一个具有特定对象ID的类加载器显示为泄漏内存,那么相同类加载器的其他实例是否有可能泄漏一些不同数量的内存?
  3. 任何关于下一步做什么的指导将不胜感激。

Aditya。

回答

1

你确定它是“泄漏”的类加载器,还是加载器加载的类仍然被引用?

了解“用户类加载器”通常用于加载可能需要在稍后卸载的类。例如,如果类是以某种形式的网页生成方案动态生成的,则这些类需要在它们自己的类加载器中加载并使用,然后需要消除对类和它们加载器的引用的所有跟踪。当这些参考文件消失时,将会收集装载机和加载的类。

如果某种缓存挂在对类的引用上(例如,通过引用类的对象或通过链接到其他加载器中其他类的类),则不会发生收集。

+0

我想有些引用可能仍然挂在一些由类加载器加载的类上。我使用HP Jmeter提供的内存泄漏估计器进行了检查,并将该类加载器显示为“泄漏”之一。我想知道是否有一种可能的方法来确定哪种类型导致泄漏?这个类加载器加载了大约500个类/类型。我猜测,如果同一个类加载器的其他实例会成为一个问题,我们不可能说,因为我们不知道哪个类有一个引用仍然依赖于它。是不是这样? – Aditya 2012-07-18 03:48:45

+0

我不知道用什么工具可以告诉你什么类加载器加载了哪些类。我想大多数“完整的JVM转储”工具会给你这个信息,如果你挖掘它的土墩。使用机器生成的名称(或与某种类型的“脚本”相对应的名称)查找类,并找出如何生成这些类。 – 2012-07-18 11:42:32