performance - 大型 portlet war 占用内存导致性能问题?

标签 performance memory tomcat portlet

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

我正在努力弄清楚为什么这是真的 - 但我还没有找到任何可以以我理解的方式解释它的东西。也许我正在搜索错误的术语,这就是为什么我找不到太多信息的原因。任何人都可以解释当 portlet 被实例化时究竟发生了什么,以及这些 jar 是否确实开始占用内存?

最佳答案

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

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

您的问题的解决方案很简单:

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

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

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

此 PDF Memory Management in the JavaHotSpot™ Virtual Machine解释内存管理在 Java 中是如何工作的。它适用于常规 Java 应用程序和 Web 应用程序。

关于performance - 大型 portlet war 占用内存导致性能问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3855758/

相关文章:

java - Tomcat 创建 WEB-INF/lib 但不分解 war 文件 (GWT)

apache - org.apache.coyote.ajp.AjpMessage.processHeader 收到带有签名 18245 的无效消息

java - 从命令行为 Eclipse 动态 Web 项目创建 WAR 文件

Python:更快的索引操作

iphone - webView 中的简单视频和内存消耗

sql - 我如何优化这个更新每一行的 PostgreSQL 查询?

c - 如何返回一个指向完整数组的指针,也就是 int(*)[] 到主函数

c++ - 当前内存使用显示总是比任务管理器多 ~14MB

java - 什么最适合数组重新初始化: set to null by iteration or simply allocate a new array?

android - 字符串的硬编码会影响性能吗?