Включение большого количества файлов JSPF в файл JSP приводит к высокому использованию памяти
У нас есть веб-страница, работающая на сервере 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 ответа
С помощью 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.
( источник)
Вы используете JSF. Во время создания представления, если if
Оператор оценивается как true, элементы управления JSF на странице будут добавлены в дерево компонентов. Для сохранения состояния на стороне сервера эти экземпляры UIComponent и их состояние будут (по умолчанию) сохраняться в сеансе пользователя. Чем больше элементов управления вы добавите, тем больше памяти вы собираетесь использовать. По умолчанию ряд старых представлений сохраняется в сеансе.
Вы можете попробовать:
- Не строит большие графы объектов
- Сокращение количества просмотров в сеансе (см.
com.sun.faces.numberOfViewsInSession
а такжеcom.sun.faces.numberOfLogicalViews
или эквивалентные параметры инициализации для вашей реализации) - Использование версии JSF с частичным сохранением состояния, если вы этого еще не сделали (это может включать обновление Glassfish)
- Реализация StateManager для сохранения вашего состояния вне ОЗУ (например, в базе данных, но это приводит к собственным проблемам) или переключение на сохранение состояния на стороне клиента с реализацией по умолчанию (см.
javax.faces.STATE_SAVING_METHOD
- это связано с проблемами безопасности и может изменить поведение приложения)