如何使war文件占用更少的内存

时间:2012-08-28 15:31:38

标签: java java-ee tomcat7 out-of-memory war

我需要有关如何减少我的网络应用程序的内存使用量的帮助。所以我可以更多地融入我的网络服务器。

所以我正在构建一个java Web应用程序,其中JSF 2.0在eclipse helios中开发并在Apache tomcat Server上运行。我有一个带有tomcat的专用虚拟服务器以及我部署这些war文件的地方。 webApp的大小约为35MB(它有很多罐子等等)但是当我将它部署到我的tomcat webserver时,我可以看到它需要大约300MB的RAM,这是正常的吗?我的专用服务器只有2GB的RAM,通常有1个使用。所以,一旦我部署3个应用程序,我就会收到OOM错误,我已经获得了permgen OOM并且出现了沼泽内存错误;为了解决这个问题,我将我的MaxPermGen提升到一个演出并重新启动服务器以恢复一些沼泽空间。所以我尝试部署较小的旧应用程序(大约15MB),并且它们占用更少的内存。如果我有1 GB的ram,我希望能够将更多应用程序放入我的网络服务器而不会出现任何OOM错误。

现在我找到了this stack overflow Question,这可以适用于我的情况吗?如果是这样,tomcat服务器中的常见文件夹是哪些?有人之前做过这个或者有一个更有效,更复杂的方法吗?

任何想法和/或荣誉都不仅仅是值得赞赏的。谢谢!

MYY

3 个答案:

答案 0 :(得分:4)

  

我部署了这些war文件。 webApp的大小约为35MB(它有很多罐子等)

只有您使用的文件会占用任何内存。删除不使用的类将节省磁盘空间,但不会节省内存。

  

但是当我将它部署到我的tomcat网络服务器时,我发现它需要大约300MB的RAM,这是正常的吗?

如果您的服务器中有300 Mb可用空间,它将全部使用它。如果您有3 GB免费,它也可以使用所有这些。您需要查看以实际方式使用服务器并执行完整GC后使用了多少。

  

如果我有1 GB的内存,我希望能够将更多应用程序放入我的网络服务器而不会出现任何OOM错误。

您需要确定每个应用程序真正需要多少内存。或者您需要购买更多内存,因为1 GB的成本约为20美元。 (我假设它是一个托管解决方案,内存成本更高;)

答案 1 :(得分:3)

正常的内存使用量取决于webapp及其运行情况。正如@Peter Lawrey所说,WAR文件的大小与使用的内存量之间没有直接关系。

是的,将常见JAR文件移出WAR并进入共享库文件夹的方法会减少内存,但总体上可能没有显着差异。有关库文件夹名称,请参阅Tomcat7 documentation

共享库中的类只会为JVM加载一次,而不是为每个使用它的webapp加载一次。但是,如果任何类具有静态,您将发现现在所有Web应用程序共享该状态。这可能导致一个webapp的对象/类型被另一个webapp看到,这可能会导致问题。

  

如果我有1 GB的内存,我希望能够将更多应用程序放入我的网络服务器而不会出现任何OOM错误。

Java确实会让人感到内存饥渴,而且实际上,对于给定数量的内存(和努力),你可以做些什么。在一天结束时,我怀疑你需要向下修改你的期望......或者为更多内存支付虚拟费用。


在沿着这条路走下去之前,我建议您使用Java内存分析器来查看您的webapps设计和实现是否存在大量内存。

答案 2 :(得分:2)

war文件的大小并不能确定应用程序消耗的内存量。此外,如果您设法在您的tomcat中启动5个应用程序,这并不意味着它们仍将继续运行,比如说3个星期。

为此,您需要分别对每个应用程序进行加载测试以确定它的内存占用量(从长远来看需要多少内存)。

为此你需要:

  • 估算将使用您的应用程序的最大并发用户数
  • 为每个用户分配一个测试用例。例如:您可能有最多100个并发用户,其中10个注册,10个搜索某些内容,10个输入某些数据等。
  • 使用JMeterGrinder等工具为每个用例编写/记录测试
  • 使用java内存分析器监视负载测试期间的内存使用情况,垃圾回收等

运行你的负载生成器一段时间后,使用过的内存应稳定在某处:1GB,1.5GB等。这就是你的内存占用。您需要确保您的硬件提供了这么多内存。

如果没有稳定,那么你有内存泄漏,你最终会获得OutOfMemoryError。但这是另一个话题。

您将尝试各种jvm内存配置,并且还要注意应用程序的性能:TPS编号。它由上述工具提供。

我刚刚触及冰山一角,负载和性能测试是一个密集的话题。