У меня есть большая проблема с утечками памяти в моем веб-приложении. Приложение заканчивается из памяти примерно через 7 часов, когда его используют несколько человек.Как искать утечки памяти в webapp?
Это как мое приложение работает:
- земли пользователя на странице входа в систему, входит в систему, на объекте входа успешным POJO пользователя добавляется к карте сессии следующим образом:. FacesContext.getCurrentInstance() getExternalContext() .getSessionMap(). put («пользователь», пользователь);
- при каждом последующем запросе страницы AuthFilter проверяет, есть ли «пользовательский» объект в карте сеанса и разрешает дальнейший доступ;
- У меня есть SessionScoped bean (LoggedUserBean), который содержит информацию о пользователе (наряду с привилегиями, инициализированными при входе в систему), поскольку к нему обращаются очень часто. LoggedUserBean вводится в большинстве бобах, и его также можно получить непосредственно с страниц XHTML.
- Существует также несколько других компонентов SessionScoped, которые должны содержать свое состояние. Большинство бобин ввели объекты DAO (@Named, default @Dependent). Очень немногие бобы и весь объект DAO ввели объект DatabaseConnection (@Named с источником данных, созданным в конструкторе, следующим образом:
dataSource = (DataSource) new InitialContext().lookup("java:comp/env/" + "jdbc/MyResName");
). - есть несколько (@Named) валидаторы для Primefaces Диалоги, которые VALIDATE динамически создаваемых компонентов деревьев:
<h:inputHidden value="true"> <f:validator binding="#{someValidator}"/> </h:inputHidden>
и реализация является чем-то вроде этого:
@Named
public class SomeValidator extends ValidatorCommon implements Validator {
private final static Logger LOGGER = Logger.getLogger(SomeValidator.class);
@Override
public void validate(FacesContext fc, UIComponent uic, Object o) throws ValidatorException {...}
{...}
Это мой контекст .xml:
<Resource auth="Container"
driverClassName="org.sqlite.JDBC"
maxTotal="1"
maxIdle="1"
minIdle="1"
maxWaitMillis="5000"
initialSize="1"
name="jdbc/MyResName"
type="javax.sql.DataSource"
removeAbandonedOnBorrow="true"
removeAbandonedTimeout="5"
logAbandoned="true"
validationQuery="SELECT 1"
url="jdbc:sqlite:path/to/db/db.db">
</Resource>
Я создал дамп кучи с VisualVM и MAT показывает эту подозреваемые утечки (https://i.imgur.com/wGsnyt5.png):
Насколько я понимаю, RequestScoped компонент создается каждый раз, когда он запрашивается/доступом, в то время как SessionScoped извлекается из контейнера для конкретного session (или создается, если он не существует), поэтому, даже если между моими компонентами есть перекрестные ссылки, все это должно работать нормально.
Здесь я действительно нуждаюсь в помощи: как анализировать, откуда эти утечки? Есть определенно то, что не позволяет освободить память, но как я могу ее найти?
Я использую Primefaces 6.0, Apache Tomcat (TomEE) /8.5.3 (7.0.1), JDK 1.7.0_80-b15, Mojarra 2.2.6, sqlite-jdbc 3.14.2.1.
Если вам нужны дополнительные файлы, сообщите мне об этом, и я отредактирую эту публикацию, чтобы добавить их.
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<context-param>
<param-name>primefaces.FONT_AWESOME</param-name>
<param-value>true</param-value>
</context-param>
<resource-env-ref>
<resource-env-ref-name>jdbc/MyResName</resource-env-ref-name>
<resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>
<!-- Welcome page -->
<welcome-file-list>
<welcome-file>pages/pub/login.xhtml</welcome-file>
</welcome-file-list>
<!-- Error pages -->
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/pages/pub/err/expired.xhtml</location>
</error-page>
<!-- Prevents comments in xhtml pages to be placed in final html and evaluated -->
<context-param>
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
<!-- JSF mapping -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<!-- Primefaces theme -->
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>cupertino</param-value>
</context-param>
<session-config>
<session-timeout>120</session-timeout>
</session-config>
<filter>
<filter-name>forceUTF8CharSet</filter-name>
<filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>forceUTF8CharSet</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
<mime-mapping>
<extension>ttf</extension>
<mime-type>application/font-sfnt</mime-type>
</mime-mapping>
<mime-mapping>
<extension>woff</extension>
<mime-type>application/font-woff</mime-type>
</mime-mapping>
<mime-mapping>
<extension>woff2</extension>
<mime-type>application/font-woff2</mime-type>
</mime-mapping>
<mime-mapping>
<extension>eot</extension>
<mime-type>application/vnd.ms-fontobject</mime-type>
</mime-mapping>
<mime-mapping>
<extension>eot?#iefix</extension>
<mime-type>application/vnd.ms-fontobject</mime-type>
</mime-mapping>
<mime-mapping>
<extension>svg</extension>
<mime-type>image/svg+xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>svg#latobold</extension>
<mime-type>image/svg+xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>svg#latoblack</extension>
<mime-type>image/svg+xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>svg#latolight</extension>
<mime-type>image/svg+xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>svg#latoregular</extension>
<mime-type>image/svg+xml</mime-type>
</mime-mapping>
<mime-mapping>
<extension>svg#fontawesomeregular</extension>
<mime-type>image/svg+xml</mime-type>
</mime-mapping>
</web-app>
Сначала я попробую с новым TomEE. Это также удивляет меня тем, что я не думал об отладке Tomcat ... Я отдам его и вернусь к вам через ~ 8 часов. – Mithras