JSP Struts性能/内存提示

时间:2008-12-04 22:20:01

标签: performance jsp java-ee struts

我正在开发一个基于Struts的基本应用程序,它在内存中遇到了重大的峰值。我们有一个监视工具,它会注意到每个用户有一个请求,向JVM堆内存添加3MB。有没有提示鼓励早期垃圾收集,释放内存或提高性能?

应用程序是一个基本的Struts应用程序,但JSP报告中有很多行,因此可能会创建很多对象。但这不是你以前没见过的东西。

  1. 执行一组数据库查询。
  2. 创建一个序列化的POJO对象bean。这代表一排。
  3. 在数组列表中添加一行。
  4. 调用操作时将数组列表设置为表单对象。
  5. JSP逻辑将遍历ActionForm中的列表,并将数据显示给用户。
  6. 注意:
    1.表单在会话范围内,可能是数组的数据列表(可能这是一个问题) 2. POJO bean包含20个左右的字段,混合了StringBigDecimal个数据。

    报告可以有300到1200个左右的行。所以至少创建了很多对象。

3 个答案:

答案 0 :(得分:2)

根据您提供的信息,我估计您通常会为结果加载1到2兆字节的数据:750行* 20个字段*每个字段100个字节= 1.4 Mb。现在考虑数据库和最终标记之间所需的所有临时对象。 3 Mb并不奇怪。

我只关心那个记忆是否已经泄露;也就是说,年轻代空间的下一个垃圾收集不会收集所有这些对象。

答案 1 :(得分:0)

  1. 列表项
  2. 在设计要在Web应用程序中呈现的报表时,请考虑从数据库中提取的记录数。

    如果记录数量很高且整个记录集占用大量内存,请考虑使用报告分页。

    尽可能明确地调用垃圾收集器。这是因为两个原因:

    1. 垃圾收集是一个昂贵的过程 因为它会扫描整个内存。

    2. 大多数生产服务器都会 调整在JVM级别以避免 明确的garabage集合

答案 2 :(得分:0)

我认为问题是ActionForm中的arraylist需要分配大量的内存空间。我会将查询结果直接写入响应:从结果集中读取行,写入响应,读取下一行,写入等等。也许它不是MVC但对你的堆更好: - )

ActionForms适用于CRUD操作,但对于报告......我不这么认为。

注意:如果ActionForm具有scope = session,则实例将处于活动状态(以及巨大的arraylist),直到会话到期。如果scope = request,则实例将可用于GC。