2

假设我有一个部署在 Tomcat 上的非常大的 Java 应用程序。在几个星期的过程中,服务器将耗尽内存,应用程序性能下降,服务器需要重新启动。

显然,应用程序有一些内存泄漏需要修复。

我的问题是.. 如果应用程序部署到不同的服务器,内存利用率会有什么变化吗?

4

2 回答 2

3

当然,应用服务器提供的服务在内存利用率方面可能会有所不同,并且如果服务器包含自己独特的虚拟机——即,如果你在一台服务器上使用 J9 或 JRockit,而在另一台服务器上使用 Oracle 的 JVM——必然会成为差异。一个重要的相关领域是类加载:一些应用服务器在管理方面比其他应用服务器具有更好的行为。在配置更改后热启动应用程序可能会由于某些服务器/VM 组合上的类加载问题而导致严重的内存泄漏。

但是这些都不能真正帮助您处理泄漏的应用程序。它是使用内存的程序,而不是服务器,因此更改服务器不会对任何事情产生太大影响。

于 2012-05-09T02:25:19.877 回答
2

内存利用率可能会略有不同,但只是 servlet 容器之间的占用空间不同。您也有可能遇到容器内存泄漏 - 但这是值得怀疑的。

最可能的问题是您的应用程序存在内存泄漏——无论如何,原因比快速修复更重要——如果“新”容器恰好持续了一周等,你会怎么做?移动问题很少能解决它...

你需要开始分析应用程序的堆内存,找出问题的根源。如果您的应用程序因 OOME 而崩溃,您可以将其添加到 JVM 参数中。

-XX:-HeapDumpOnOutOfMemoryError

如果在您手动重新启动容器之前性能只是下降,您应该进入触发定期堆转储的例程。转储时间线通常是最有帮助的,因为您可以看到哪些对象存储随着时间的推移而增长。

为此,您需要一个堆分析工具:

JHatIBM Heap Analyzer或任何您喜欢的 :)

另请参阅此问题:

Java 堆分析工具的推荐?

更新:

这可能会有所帮助(出于明显的原因):

如何分析 .hprof 文件?

于 2012-05-10T09:20:25.623 回答