3

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

所以我正在构建一个使用 JSF 2.0 在 eclipse helios 中开发并在 Apache Tomcat 服务器上运行的 Java Web 应用程序。我还有一个带有 tomcat 的专用虚拟服务器,我在其中部署这些战争文件。webApp 的大小约为 35MB(它有很多 jars 等)但是当我将它部署到我的 tomcat 网络服务器时,我可以看到它需要大约 300MB 的 RAM,这正常吗?我的专用服务器只有 2GB 的内存,通常有 1 个可以使用。所以我一部署 3 个应用程序就会收到 OOM 错误,我已经收到 permgen OOM 和 out of swamp Memory 错误;为了解决这个问题,我将我的 MaxPermGen 提高到大约一个 gig 并重新启动服务器以取回一些沼泽空间。所以我尝试部署较小的旧应用程序(大约 15MB),它们占用的内存要少得多。

现在我发现这个堆栈溢出问题,可以应用于我的情况吗?如果是这样,tomcat服务器中的常用文件夹是什么?以前有人这样做过,还是有其他更有效、不那么复杂的方法?

任何想法和/或评论都值得赞赏。谢谢!

我的

4

3 回答 3

4

我部署这些战争文件。webApp 的大小约为 35MB(它有很多 jar 等)

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

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

如果您的服务器中有 300 Mb 可用空间,它将全部使用。如果您有 3 GB 的可用空间,它也可能会使用所有这些空间。在实际使用服务器并执行 Full GC 后,您需要查看使用了多少。

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

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

于 2012-08-28T15:36:19.473 回答
3

正常的内存使用取决于 webapp 和它在做什么。正如@Peter Lawrey 所说,WAR 文件的大小与使用的内存量之间没有直接关系。

是的,将通用 JAR 文件从 WAR 中移出并移入共享库文件夹的方法会减少内存,尽管总体上可能不会产生显着差异。有关库文件夹名称,请参阅Tomcat7 文档

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

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

好吧,Java 确实往往会占用大量内存,实际上,在给定的内存量(和努力)下,您可以做的事情是有限的。归根结底,我怀疑您将需要向下修改您的期望……或者购买具有更多内存的虚拟机。


在走这条路之前,我建议您使用 Java 内存分析器来查看您的 webapps 设计和实现是否有一些东西使它们使用大量内存。

于 2012-08-28T16:23:47.377 回答
2

你的war文件的大小并不能决定你的应用程序消耗多少内存。此外,如果您设法在您的 tomcat 中启动 5 个应用程序,这并不意味着它们仍然会在 3 周后运行。

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

为此,您需要:

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

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

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

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

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

于 2012-08-28T16:30:28.460 回答