应用程序服务器是否会影响Java内存使用?

时间:2012-05-09 02:18:51

标签: java tomcat memory-leaks jvm

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

内存利用率可能存在轻微的差异,但只有在servlet容器之间的占用空间不同时。还有一个轻微的机会,你遇到了容器的内存泄漏 - 但这是值得怀疑的。

最可能的问题是您的应用程序存在内存泄漏 - 无论如何,原因比快速修复更重要 - 如果'新'容器刚刚发生额外的一周等,您会怎么做?移动问题很少解决它......

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

-XX:-HeapDumpOnOutOfMemoryError

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

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

JHatIBM Heap Analyser或您的偏好:)

另见这个问题:

Recommendations for a heap analysis tool for Java?

<强>更新

这可能会有所帮助(原因很明显):

How do I analyze a .hprof file?