0

我们正在尝试启动 HP UX 服务器以在 Java 中运行一些批处理作业。简而言之,问题是这样的:

这些批处理作业在 Jeus Application Server(韩国制造的产品)上运行。尽管大多数作业都按时运行,但一些 Batch Jobs 报告了著名的 PermGen Out of Memory Error。我们得到一个堆转储并开始查看 JVM 选项。它们如下: Xms - 2048m Xmx - 2048m PermSize - 512m MaxPermSize - 512m。旧的 GC 收集器是 CMS,而年轻代收集器是 Parallel Collector。

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

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

我有以下问题:

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

阿迪亚。

4

1 回答 1

1

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

了解“用户类加载器”通常用于加载稍后可能需要卸载的类。例如,如果类是作为某种网页生成方案动态生成的,则这些类需要在它们自己的类加载器中加载、使用,然后需要消除对类及其加载器的所有引用痕迹。当这些引用消失时,加载器和加载的类将被收集。

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

于 2012-07-18T03:41:57.297 回答