1

再デプロイするたびに、ログに次のメッセージが表示されます。

INFO: Reloading Context with name [/x1Application] has started
SEVERE: The web application [/x1Application] appears to have started a thread named [Mojarra-WebResourceMonitor-1-thread-1] but has failed to stop it. This is very likely to create a memory leak.
SEVERE: The web application [/x1Application] appears to have started a thread named [Hector.me.prettyprint.cassandra.connection.CassandraHostRetryService-1] but has failed to stop it. This is very likely to create a memory leak.

最終的に 1 ~ 2 回のホット デプロイの後、サーバーが応答を停止し、PermGen スペース エラーが発生します。

17 Mar, 2012 1:40:01 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [jsp] in context with path [] threw exception [The HTTP Monitor server side component intercepted and rethrew an error while processing a JSP or servlet. Please see the stack trace under the root cause message below to identify the problem.] with root cause
java.lang.OutOfMemoryError: PermGen space
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:182)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
17 Mar, 2012 1:40:12 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [jsp] in context with path [] threw exception [The HTTP Monitor server side component intercepted and rethrew an error while processing a JSP or servlet. Please see the stack trace under the root cause message below to identify the problem.] with root cause
java.lang.OutOfMemoryError: PermGen space
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:182)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

バグの原因に関する詳細情報を入手するにはどうすればよいですか?

4

2 に答える 2

2

ヘクターの人たちに報告します。コードが webapp のシャットダウン時に実行中のスレッドを適切にシャットダウンしないのは、彼らのバグです。当面は、より優れた開発サーバーを選択するか (お気に入りはGlassfishです。1 秒未満で hotdeploy します)、JRebel をインストールして、Tomcat を hotrestarter ではなく実際のhotdeployerに変換することを検討できます。

Tomcat のメモリ リーク保護に関する背景情報については、次の wiki を参照してください。

于 2012-03-16T20:47:27.693 に答える
0

まもなく、サーブレット sepc 3.0 を使用する Web アプリで、Mojarra 2.2.12 を使用した Apact Tomcat 8.0.26の「 Mojarra-WebResourceMonitor-1-thread-1 」という名前のリーク スレッドに対処する必要がありました。

根本的な原因は、com.sun.faces.config の2 つのインスタンスでした。ConfigureListenerが ServletContext に追加されました。

最初のインスタンス (A) は org.apache.jasper.servlet.JasperInitializer.onStartup(...) 、javax.faces-2.2.12.jar!/META-INF/jsf_core.tld で構成されているため、Tomcat のコンテナー SCI によって追加されました。

2 番目のインスタンス (B) は
com.sun.faces.config.FacesInitializer.onStartup(...)

回避策は、Web アプリの context.xml を編集して、 containerSciFilter属性をコンテキスト要素に追加することで、JapserInitializer が呼び出されないようにすることでした。

<Context containerSciFilter="org.apache.jasper.servlet.JasperInitializer|org.apache.tomcat.websocket.server.WsSci">

私の Web アプリには両方の SCI は必要ありません。したがって、JSP と JSF に依存している場合、この回避策は役に立ちません。


これはここで間違って起こったことです:

サーブレットの初期化時に、Tomcat が呼び出されました

  • A.contextInitialized(...)
    • JSFの初期化
    • スレッドプールを開始する
  • B.contextInitialized(...)
    • JSFが実行されているため...何もすることはありません

シャットダウン時に、Tomcal 呼び出し:

  • B.contextDestroyed(...)
    • JSFのシャットダウン
    • 私はスレッドプールを開始していないので、スレッドプールについては知りません。
  • A.contextDestroyed(...)
    • JSFが停止しているため、何もする必要はありません。

したがって、As の threadPool は稼働し続け、WebAppClassloader での GC を防ぎます。

しかし、これは誰のせいですか?

  1. Tomcat は同じクラスの複数のリスナーを拒否できませんでしたか?
  2. JSF Mojarra は、JSF が稼働していないときに threadPool が存在しないことを意味するため、threadPool を停止できませんでしたか?
  3. リスナーが2回宣言されているのは間違っていますか:
    • SCI を介したプログラミング
    • コア TLD taglib で宣言されています。

編集: JasperInitializer を完全にスキップするのは問題でした。次のように、containerSciFilter から削除し、javax.faces-*.jar を Tomcat tldSkip フィルターに追加する必要がありました。

<JarScanner>
  <JarScanFilter defaultPluggabilityScan="false"
    pluggabilityScan="${tomcat.util.scan.StandardJarScanFilter.jarsToScan}, javax.faces-*.jar"
    tldSkip="${tomcat.util.scan.StandardJarScanFilter.jarsToSkip}, , javax.faces-*.jar" />
</JarScanner>
于 2015-09-30T11:04:47.577 に答える