我如何找到导致内存泄漏的应用程序

how can i find which application is causing memory leaks

我是 运行 Tomcat-6.0.32,使用 JDK-1.6.0_23 版本的 RHEL 5.4。我运行差不多申请了15个以上。应用程序只是小型应用程序。我的 RAM 是 8GB,swap 是 12GB。我将堆大小从 512Mb 设置为 4GB。

问题是在 运行 的几个小时或几天后,tomcat 虽然已经启动并且 运行 却没有提供服务。虽然我可以看到 catalina.out 日志文件,但它显示内存泄漏问题。

现在,我担心的是我需要展示该问题的解决方案,或者至少我需要突出显示导致内存泄漏的应用程序。

任何人都可以解释我如何发现导致内存泄漏问题的应用程序吗?

一种选择是使用堆转储(参见 How to get a thread and heap dump of a Java process on Windows that's not running in a console)并稍后分析堆转储。

或者另一种选择是使用 jmap、VisualVM 等类似工具直接分析进程。

您可以结合使用 jmap/jhat 工具(从 Java 8 开始不支持这两种工具)来收集堆转储(使用 mmap)并识别堆中的顶部对象(使用 jhat ).尝试将这些对象与应用程序相关联并识别恶意对象。