0

首先,我撒谎,它不是一个真正的纯jsp网站。它有几个具有数据库访问权限的页面和一个基于 lucene 的搜索引擎……以及大约 400 个独立的 jsp 页面。

问题是我们无法访问的生产服务器上的管理员说该站点消耗了太多内存(200+ Megs),我们可能面临内存泄漏,因为它迫使他们重新启动它。

我不是jsp专家,但我怀疑这不是真正的内存泄漏,并且数据库页面和lucene搜索与这个问题无关。我知道每个jsp页面都被编译成一个java类,然后执行,并保存在内存中供以后访问。

真正的问题是:独立jsp页面的数量增加(我认为是400)会导致内存使用量增加到200M吗?

如果是,您将如何降低内存使用量?将 SSI 用于包含(避免为此目的使用 jsp 页面)可能是一种选择吗?

提前致谢

4

3 回答 3

1

知道什么消耗内存的唯一方法是使用分析器。我们要做的是获取堆转储,然后按以下方式对其进行分析:

  • 使用jmap实用程序(JDK 附带)来获取堆转储。它应该以root身份运行!
  • 将文件下载到语言环境机器
  • 下载并安装Eclipse Memory Analyzer - 还有其他的(比如jhat),但我个人喜欢它。
  • 用它打开文件
  • 查看哪些类占用了大部分内存。

无论如何,在服务器启动之前预编译 JSP 总是好的。

于 2009-09-01T19:08:35.243 回答
1

每个 JSP 半兆字节不是我通常所期望的。显然,可以在 JSP 中编写任何自己喜欢的代码,因此编译后的 jsp 可以很大并且可以分配大量内存,但是假设这些是传统的 JSP,那么我最怀疑的是运行时行为而不是剪切JSP 的数量。

一种可能性是您有很多会话数据。随着用户从一个页面移动到另一个页面,会话大小可能会增加。从数据库中检索到的数据临时放置在会话中以便可以在另一个页面中使用是很常见的。如果没有整理好,您可能会迅速消耗大量内存。

于 2009-09-04T08:23:48.207 回答
0

您需要确定该内存的使用位置。200MB 太多的说法实际上是没有用的,因为它取决于使用情况,应用程序如何使用内存(例如 David 提到的会话数据)。您需要分析应用程序生命周期中不同时间的堆转储和详细 gc 日志,以了解使用情况以及您是否确实存在内存泄漏(如果应用程序稳定在 200MB,则没有。如果它每 x 小时增加一次没有减少的迹象,你可能会这样做)。

于 2009-09-13T08:21:32.250 回答