在jsp文件中包含大量jspf文件会导致内存使用率过高

时间:2011-09-17 06:29:18

标签: jsp glassfish memory-management jspinclude jsp-fragments

我们有一个在glassfish服务器上运行的网页。在我们的jsp文件中,我们有很多包括下面的内容。

<jsp:directive.include file="johndoe/foobar.jspf"/>

根据用户选择包含这些文件。我们的jsp文件基本上是这样的:

<jsp:root version="2.1" xmlns:c="http://java.sun.com/jstl/core_rt"
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:jsp="http://java.sun.com/JSP/Page" 
xmlns:webuijsf="http://www.sun.com/webui/webuijsf">
//some unimportant codes here
<c:if test="${sessionScope.loadAvgTest}">
  //some unimportant codes here
  <f:subview id="reports15">
    <jsp:directive.include file="siforms/sysinfoform.jspf"/>
  </f:subview>
  //some unimportant codes here                                        
  <f:subview id="reports16">
    <jsp:directive.include file="siforms/sysinfoformscheduled.jspf"/>
  </f:subview>
   //some unimportant codes here
</c:if>
//some unimportant codes here
<c:if test="${sessionScope.bandwidthTest}">
  //some unimportant codes here
  <f:subview id="reports17">
    <jsp:directive.include file="mailforms/mailfilter.jspf"/>
  </f:subview>
  //some unimportant codes here
  <f:subview id="reports18">
    <jsp:directive.include file="mailforms/mailfilterscheduled.jspf"/>
  </f:subview>
//some unimportant codes here
</c:if>
....

大约有80个if语句,每个语句包含2个inculdes。当我删除了很多这些if子句并且只留下了一些,如果有几个包括内存使用就没问题了。但随着我使用更多if子句和更多包括内存使用量的增长。有什么想法我可以如何优化代码或如何对servlet配置进行配置更改以降低内存使用量?

2 个答案:

答案 0 :(得分:1)

使用jsp:include代替jsp:directive.include解决了这个问题。 据我所知,我的研究jsp:directive.include(include指令)在编译时将文件包含到JSP页面中,而jsp:include包含运行时的输出。

I have found that, include action (runtime include) runs a bit slower 
yet it is preferred generally because it save a lot of memory of the system. 

source

答案 1 :(得分:0)

您正在使用JSF。在视图创建时,如果if语句的计算结果为true,则页面上的JSF控件将添加到组件树中。对于服务器端状态保存,这些UIComponent实例和their state将(默认情况下)保留在用户的会话中。您添加的控件越多,您将消耗的内存就越多。默认情况下,会话中会保留许多旧视图。

你可以尝试:

  • 不构建大型对象图
  • 减少会话中的观看次数(请参阅com.sun.faces.numberOfViewsInSessioncom.sun.faces.numberOfLogicalViews或实施的等效初始化参数)
  • 如果您还没有使用带有partial state saving的JSF版本(这可能涉及升级Glassfish)
  • 实现StateManager以将状态保存在RAM之外(例如,数据库,但这导致其自身的问题)或使用默认实现切换到客户端状态保存(请参阅javax.faces.STATE_SAVING_METHOD - 这带来安全问题,可能会改变应用程序行为)