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