Включение большого количества файлов JSPF в файл JSP приводит к высокому использованию памяти - PullRequest
0 голосов
/ 17 сентября 2011

У нас есть веб-страница, работающая на сервере 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 и несколько включений, использование памяти было нормальным.Но по мере того, как я использую больше if, и даже больше включает использование памяти, растет.Любые идеи, как я могу оптимизировать код или как я могу внести изменения в конфигурацию сервлетов, чтобы уменьшить использование памяти?

Ответы [ 2 ]

1 голос
/ 19 сентября 2011

Использование 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))

0 голосов
/ 17 сентября 2011

Вы используете JSF. Во время создания представления, если оператор if оценивается как true, элементы управления JSF на странице будут добавлены в дерево компонентов. Для сохранения состояния на стороне сервера эти UIComponent экземпляры и их состояние будут (по умолчанию) сохраняться в сеансе пользователя. Чем больше элементов управления вы добавите, тем больше памяти вы собираетесь использовать. По умолчанию в сеансе сохраняется несколько старых представлений.

Вы можете попробовать:

  • Не строит большие графы объектов
  • Сокращение количества представлений в сеансе (см. com.sun.faces.numberOfViewsInSession и com.sun.faces.numberOfLogicalViews или эквивалентные параметры инициализации для вашей реализации)
  • Использование версии JSF с частичное сохранение состояния , если вы этого еще не сделали (это может включать обновление Glassfish)
  • Реализация StateManager для сохранения вашего состояния из ОЗУ (например, в базе данных, но это приводит к собственным проблемам) или переключение на сохранение состояния на стороне клиента с реализацией по умолчанию (см. javax.faces.STATE_SAVING_METHOD - это связано с проблемами безопасности и может изменить поведение приложения)
...