一尘不染

大型Portlet战争占用了内存,从而导致性能问题?

tomcat

我听说有人说部署包含许多大jar的portlet
war文件(或可能是任何war)会导致性能问题,因为所有这些jar都已加载到内存中。如果您有几次战争,而所有战争都包含大量的jar文件,那么您的系统将陷入瘫痪。

我正在努力弄清为什么这是真的-
而且我还没有找到任何能说明这一点的方法。也许我正在搜索错误的术语,这就是为什么我找不到太多信息的原因。任何人都可以解释当实例化portlet时,如果这些jar开始占用内存,究竟发生了什么?


阅读 269

收藏
2020-06-16

共1个答案

一尘不染

简短的响应是:是的,部署带有大量jar的war文件“可能”会导致性能问题。战争是否包含Portlet或标准Web应用程序都没有关系。但是我认为您不应该过早担心此问题,因为有解决此问题的简便方法。

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

解决问题的方法很简单:

  1. 为您的内存分配更多内存(JVM的参数-Xmx)

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

因此,您不必担心此问题,因为它有解决方案。

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

2020-06-16