2017-02-21 11 views
1

私はWebアプリケーションのメモリリークに大きな問題があります。少数の人が使用するとアプリケーションは約7時間後にメモリ不足になります。webappでメモリリークを捜す方法は?

これは私のアプリがどのように働くかある:、ログインページの

  • ユーザーの土地succesfullのログインユーザーPOJOオブジェクトに、ログインする次のようにセッションマップに追加されます。) FacesContext.getCurrentInstance(getExternalContext() .getSessionMap()。put( "user"、user);
  • 次のページ要求ごとに、AuthFilterはセッションマップに「user」オブジェクトがあるかどうかをチェックし、さらにアクセスできるようにします。
  • 非常に頻繁にアクセスされるため、ユーザー情報を保持するSessionScoped Bean(LoggedUserBean)があります(ログイン時に初期化された特権とともに)。 LoggedUserBeanはほとんどのBeanに注入され、XHTMLページから直接アクセスされます。
  • Stateを保持する必要がある他のSessionScoped Beanもほとんどありません。ほとんどの豆はDAOオブジェクトを挿入しています(@Named、デフォルト@Dependent)。非常に少数のBeanとすべてのDAOオブジェクトがDatabaseConnectionオブジェクト(@ Namedにコンストラクタで作成されたデータソースを次のように挿入しました: dataSource = (DataSource) new InitialContext().lookup("java:comp/env/" + "jdbc/MyResName");)。
  • 動的に作成したコンポーネントのツリーを検証Primefacesダイアログのバリ(@Named)いくつかあります。これは私のコンテキストで

    @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 {...} 
    {...} 
    

<h:inputHidden value="true"> <f:validator binding="#{someValidator}"/> </h:inputHidden>

と実装は、このようなものであるが.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のとヒープ・ダンプを作成したマットは、このリーク容疑者(https://i.imgur.com/wGsnyt5.png)を示す:http://i.imgur.com/wGsnyt5.png

SessionScopedが特定のために容器から取り出されている間私の知る限り理解するように、RequestScoped Beanは、それがアクセス/要求されるたびに作成されますセッション(または存在しない場合は作成される)ので、私の豆の間に相互参照があっても、これはうまくいくはずです。

これは私が実際に助けを必要とするところです:その漏れがどこから来たのかを分析する方法は?メモリが解放されないということは間違いありませんが、どうすれば見つけることができますか?

私は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

私は私の問題を解決することができました。

私の問題は、本当の問題は、私がのpom.xmlに2つのlibs含まれていることだったなど、バリ、私の豆のいずれかで認証メカニズムのハンドラではなかった:私はかなりないのか分からない

<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は、2つの別個の実装(TomEE自身以上)に遭遇したときに動作しますが、何らかのリソースへの参照を解放してWebContextのサイズが常に大きくなった(複数のページにわたるリクエスト処理に参加したすべてのオブジェクトを保持していた) 。あるいは、これはjsf実装のバグでしょうか?

誰かが実際に何が起こったのか説明できるなら、私は自分の問題の解決策としてそのような答えを受け入れるだろう。それまでは、この答え(多くの推論なし)が解決策です。

0

多分TomEE 7.0.2に試してみることから始めます。それがWebContextマップをデバッグして、どのCDI Beanが解放されていないかを確認しようとすると、誰(tomee、tomcat、primefaces、other)がそれを担当しているかを知ることができます。

+0

まず、新しいTomEEで試してみましょう。 また、私はTomcatのデバッグについて考えなかったことを嬉しく思っています...私はそれを行って、8時間後にあなたに戻ってきます。 – Mithras

関連する問題