2017-02-21 54 views
1

У меня есть большая проблема с утечками памяти в моем веб-приложении. Приложение заканчивается из памяти примерно через 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): http://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> 

ответ

0

Мне удалось решить мою проблему.

Моя проблема не была ни в одном из моих фасолью, обработчик, валидаторы, AUTH механизмов и т.д. Реальная проблема заключалась в том, что я включил два LIBS в pom.xml:

<dependency> 
    <groupId>com.sun.faces</groupId> 
    <artifactId>jsf-api</artifactId> 
    <version>2.2.6</version> 
</dependency> 
<dependency> 
    <groupId>com.sun.faces</groupId> 
    <artifactId>jsf-impl</artifactId> 
    <version>2.2.6</version> 
</dependency> 

Я не знаю, как делает TomEE ведет себя, когда он сталкивается с двумя отдельными реализациями (сам Tomice и выше), но кажется, что что-то помешало высвободить ссылки на некоторые ресурсы, из-за которых WebContext всегда увеличивался в размере (он содержал все объекты, которые участвовали в обработке запросов, - на нескольких страницах) , Или, может быть, это ошибка в реализации jsf?

Если кто-то может объяснить, что на самом деле произошло, я бы принял такой ответ, как решение моей проблемы. До тех пор этот ответ (без каких-либо аргументов) является решением.

0

возможно начать, давая попытаться TomEE 7.0.2. Если это не поможет, попробуйте отладить карту WebContext, чтобы проверить, какие компоненты CDI не выпущены, тогда вы сможете узнать, кто (tomee, tomcat, primefaces, other) несет ответственность за это и проверяет, можете ли вы это исправить.

+0

Сначала я попробую с новым TomEE. Это также удивляет меня тем, что я не думал об отладке Tomcat ... Я отдам его и вернусь к вам через ~ 8 часов. – Mithras