使用 JMX 控制台分析了在 tomcat 中运行的轻负载 Web 应用程序,结果表明“PS Old Gen”增长缓慢但稳定。它从 200MB 开始,增长到大约 80MB/小时。
CPU 不是问题,它平均以 0-1% 的速度运行,但在某处它会泄漏内存,因此在部署后几天会变得不稳定。
我如何找出堆上分配了哪些对象?你知道有什么好的教程或工具吗?
使用 JMX 控制台分析了在 tomcat 中运行的轻负载 Web 应用程序,结果表明“PS Old Gen”增长缓慢但稳定。它从 200MB 开始,增长到大约 80MB/小时。
CPU 不是问题,它平均以 0-1% 的速度运行,但在某处它会泄漏内存,因此在部署后几天会变得不稳定。
我如何找出堆上分配了哪些对象?你知道有什么好的教程或工具吗?
您可以使用NetBeans 分析器。它有 2 种模式,直接从 ide(对于 localhost)启动配置文件的 tomcat,或者使用提供的 JAR 和一些在服务器上运行配置的远程配置文件。
我在一个项目中使用它来解决内存泄漏问题,它很有用。
我使用IBM 的 alphaWorks 的 HeapAnalyzer 工具取得了很好的成功。它从 Java 的堆配置文件 hprof 中获取输出,并对其进行分析以向您展示最可能的内存泄漏。
你所看到的都是正常的,除非你能证明不是这样。当旧空间中的 GC 发生时,额外的“已消耗空间”消失时,您无需分析堆。在某些时候,当已用空间达到最大堆大小时,您会观察到由您使用的默认 GC 引起的暂停,之后使用的内存应该会下降很多。只有在 GC 后它没有停止时,您可能会对仍然持有这些对象的内容感兴趣。
JRockit Mission Control 可以在连接到 JVM 时分析内存泄漏。无需一直拍摄快照。如果您有一个具有大堆的服务器,这将很有用。
只需将该工具连接到 JVM,它就会为您提供一个趋势表,您可以在其中查看增长最多的对象类型,然后您可以探索对这些对象的引用。您还可以在 JVM 运行时获取分配跟踪,因此您可以查看对象在应用程序中的分配位置。
你可以在这里免费下载