假设我有一个非常大的Java应用程序部署在Tomcat上。在几周的时间内,服务器将耗尽内存,应用程序性能下降,服务器需要重新启动。
显然,应用程序有一些需要修复的内存泄漏。
我的问题是..如果应用程序部署到不同的服务器,内存利用率会有任何变化吗?
答案 0 :(得分:3)
当然,应用程序服务器提供的服务可能会因内存利用率而异,如果服务器包含自己独特的VM,即,如果您将J9或JRockit与一台服务器和Oracle的JVM与另一台服务器一起使用 - 那么必然是差异。一个重要的相关领域是类加载:一些应用服务器在管理方面比其他应用服务器具有更好的行为。在配置更改后热启动应用程序可能会因某些服务器/ VM组合上的类加载问题而导致严重的内存泄漏。
但是这些都不会真正帮助你解决泄漏的应用程序。这是使用内存而不是服务器的程序,因此更改服务器不会对任何事情产生太大影响。
答案 1 :(得分:2)
内存利用率可能存在轻微的差异,但只有在servlet容器之间的占用空间不同时。还有一个轻微的机会,你遇到了容器的内存泄漏 - 但这是值得怀疑的。
最可能的问题是您的应用程序存在内存泄漏 - 无论如何,原因比快速修复更重要 - 如果'新'容器刚刚发生额外的一周等,您会怎么做?移动问题很少解决它......
您需要开始分析应用程序堆内存,找到问题的根源。如果您的应用程序与OOME崩溃,您可以将其添加到JVM参数。
-XX:-HeapDumpOnOutOfMemoryError
如果在手动重启容器之前性能下降,则应该进入触发定期堆转储的例程。转储的时间表通常是最有帮助的,因为您可以看到哪些对象存储随着时间的推移而增长。
为此,您需要一个堆分析工具:
JHat或IBM Heap Analyser或您的偏好:)
另见这个问题:
Recommendations for a heap analysis tool for Java?
<强>更新强>
这可能会有所帮助(原因很明显):