我们试图让一台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个项目。内存泄漏还显示一些其他对象涉及内存泄漏。
我有以下问题:
- 现在,这是泄漏的类加载器已经确定,我们如何辨别这是造成问题的确切引用(S)?
- 如果一个具有特定对象ID的类加载器显示为泄漏内存,那么相同类加载器的其他实例是否有可能泄漏一些不同数量的内存?
- 任何关于下一步做什么的指导将不胜感激。
Aditya。
我想有些引用可能仍然挂在一些由类加载器加载的类上。我使用HP Jmeter提供的内存泄漏估计器进行了检查,并将该类加载器显示为“泄漏”之一。我想知道是否有一种可能的方法来确定哪种类型导致泄漏?这个类加载器加载了大约500个类/类型。我猜测,如果同一个类加载器的其他实例会成为一个问题,我们不可能说,因为我们不知道哪个类有一个引用仍然依赖于它。是不是这样? – Aditya 2012-07-18 03:48:45
我不知道用什么工具可以告诉你什么类加载器加载了哪些类。我想大多数“完整的JVM转储”工具会给你这个信息,如果你挖掘它的土墩。使用机器生成的名称(或与某种类型的“脚本”相对应的名称)查找类,并找出如何生成这些类。 – 2012-07-18 11:42:32