大型portlet战争占用内存导致性能问题?

时间:2010-10-04 13:40:44

标签: performance memory tomcat portlet

我听说有些人说部署包含大量大型jar的portlet war文件(或者任何战争)会导致性能问题,因为所有这些jar都会被加载到内存中。如果你有几场战争,所有这些战争都包含大量的大型文件,那么你的系统就会陷入困境。

我正试着弄清楚为什么这是真的 - 我没有发现任何以我得到它的方式解释它。也许我正在寻找错误的术语,这就是为什么我找不到太多信息。任何人都可以解释当portlet被实例化时究竟发生了什么,以及这些罐子确实开始占用内存吗?

1 个答案:

答案 0 :(得分:2)

简短的回答是:是的,部署带有大量jar的war文件“可能”导致性能问题。战争是否包含portlet或标准Web应用程序并不重要。 但在我看来,你不应该过早地担心这个问题,因为这个问题很容易解决。

当portlet或任何webApp加载到服务器时,它会将主jar的类加载到Web服务器的堆的“永久生成”区域(分配给Java进程的内存)中。该区域存储执行的代码。当这些类使用来自其他jar的代码时,它们的代码也会加载到此区域中。 如果此区域已填满,您将收到OutOfMemoryError异常。

解决问题的方法很简单:

  1. 为内存增加内存(参数-Jmx的JVM)

  2. 如果你有几个包含相同jar文件的.war文件,请从war文件中删除这些jar文件并将它们放在Web服务器所有公共库所在的目录中。此目录的位置取决于您使用的Web App服务器。

  3. 所以,你不应该担心这个问题,因为它有一个解决方案。

    此PDF http://java.sun.com/j2se/reference/whitepapers/memorymanagement_whitepaper.pdf解释了内存管理在Java中的工作原理。它适用于常规Java应用程序和Web应用程序。