1

Web アプリケーションの実行中に、Tomcat ソースで OutOfMemoryError が発生します。

java.lang.OutOfMemoryError: Java ヒープ領域

java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)
at com.source.server.wc.common.SupportAction.execute(SupportAction.java:252)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:507)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.source.server.wc.common.AuthenticationFilter.doFilter(AuthenticationFilter.java:300)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.source.server.wc.common.EncodingFilter.doFilter(EncodingFilter.java:70)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:568)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)    

Thread.currentThread().setDefaultUncaughtExceptionHandler(new OOMEHandler());を追加 しました。 私のメインスレッドでは、webclient からタスクを実行しているときに OOMError を取得していますが、OOMError は UncaughtExceptionHandler によってキャッチされません。

どうすれば捕まえられますか?

4

1 に答える 1

0

UncaughtExceptionHandlerもキャッチしOutOfMemoryErrorます。あなたはそれを正しく設定しているようです。したがって、後で他のプロセスがそれを呼び出しているか (関数のブレークポイントを設定することで確認できます)、または TomCat に独自のプロセスが設定されているThread場合は、 を呼び出すことで確認できますThread.currentThread().getUncaughtExceptionHandler()nullこれは、何も設定されていない場合に返されます。

またsetDefaultExceptionHandler()、静的であるため、クラスではなくオブジェクトで呼び出すべきではないことに注意してください。

Thread.setDefaultUncaughtExceptionHandler(new OOMEHandler());

それ以外の

Thread.currentThread().setDefaultUncaughtExceptionHandler(new OOMEHandler());
于 2012-12-05T09:09:39.230 に答える