我的应用中出现 OutOfMemory 异常。我已经采取了堆转储并通过MAT进行了分析。在分析我的应用程序内存使用情况时,我发现了以下疑我无法理解这些嫌犯背后的主要原因。
请帮助我理解这个泄漏嫌疑人及其相关解决方案。
怀疑1
线程org.apache.tomcat.util.threads.TaskThread @ 0x2bdf5ff8" ajp-bio-9002" -exec-5保留局部变量,总大小为113,973,288(50.72%) )bytes。
内存累积在" org.apache.tomcat.util.threads.TaskThread"的一个实例中。由" org.apache.catalina.loader.StandardClassLoader @ 0x293b4488"加载。
线程堆栈
" AJP-BIO-9002" -exec -5- 在java.util.Arrays.copyOf([CI] [C(Arrays.java:2882)) at java.lang.AbstractStringBuilder.expandCapacity(I)V(AbstractStringBuilder.java:100) at java.lang.AbstractStringBuilder.append(C)Ljava / lang / AbstractStringBuilder; (AbstractStringBuilder.java:572) 在java.lang.StringBuffer.append(C)Ljava / lang / StringBuffer; (StringBuffer.java:320) at org.apache.myfaces.renderkit.html.util.ReducedHTMLParser.consumeString(C)Ljava / lang / String; (ReducedHTMLParser.java:303) at org.apache.myfaces.renderkit.html.util.ReducedHTMLParser.consumeAttrValue()Ljava / lang / String; (ReducedHTMLParser.java:327) 在org.apache.myfaces.renderkit.html.util.ReducedHTMLParser.parse()V(ReducedHTMLParser.java:579) 在org.apache.myfaces.renderkit.html.util.ReducedHTMLParser.parse(Ljava / lang / CharSequence; Lorg / apache / myfaces / renderkit / html / util / CallbackListener;)V(ReducedHTMLParser.java:66) 在org.apache.myfaces.renderkit.html.util.DefaultAddResource.parseResponse(Ljavax / servlet / http / HttpServletRequest; Ljava / lang / String; Ljavax / servlet / http / HttpServletResponse;)V(DefaultAddResource.java:699) 在org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(Ljavax / servlet / ServletRequest; Ljavax / servlet / ServletResponse; Ljavax / servlet / FilterChain;)V(ExtensionsFilter.java:157) 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Ljavax / servlet / ServletRequest; Ljavax / servlet / ServletResponse;)V(ApplicationFilterChain.java:243) 在org.apache.catalina.core.ApplicationFilterChain.doFilter(Ljavax / servlet / ServletRequest; Ljavax / servlet / ServletResponse;)V(ApplicationFilterChain.java:210) 在org.apache.catalina.core.StandardWrapperValve.invoke(Lorg / apache / catalina / connector / Request; Lorg / apache / catalina / connector / Response;)V(StandardWrapperValve.java:240) 在org.apache.catalina.core.StandardContextValve.invoke(Lorg / apache / catalina / connector / Request; Lorg / apache / catalina / connector / Response;)V(StandardContextValve.java:164) 在org.apache.catalina.authenticator.AuthenticatorBase.invoke(Lorg / apache / catalina / connector / Request; Lorg / apache / catalina / connector / Response;)V(AuthenticatorBase.java:462) 在org.apache.catalina.core.StandardHostValve.invoke(Lorg / apache / catalina / connector / Request; Lorg / apache / catalina / connector / Response;)V(StandardHostValve.java:164) 在org.apache.catalina.valves.ErrorReportValve.invoke(Lorg / apache / catalina / connector / Request; Lorg / apache / catalina / connector / Response;)V(ErrorReportValve.java:100) 在org.apache.catalina.valves.AccessLogValve.invoke(Lorg / apache / catalina / connector / Request; Lorg / apache / catalina / connector / Response;)V(AccessLogValve.java:562) 在org.apache.catalina.core.StandardEngineValve.invoke(Lorg / apache / catalina / connector / Request; Lorg / apache / catalina / connector / Response;)V(StandardEngineValve.java:118) 在org.apache.catalina.ha.session.JvmRouteBinderValve.invoke(Lorg / apache / catalina / connector / Request; Lorg / apache / catalina / connector / Response;)V(JvmRouteBinderValve.java:218) 在org.apache.catalina.ha.tcp.ReplicationValve.invoke(Lorg / apache / catalina / connector / Request; Lorg / apache / catalina / connector / Response;)V(ReplicationValve.java:333) 在org.apache.catalina.connector.CoyoteAdapter.service(Lorg / apache / coyote / Request; Lorg / apache / coyote / Response;)V(CoyoteAdapter.java:395) 在org.apache.coyote.ajp.AjpProcessor.process(Lorg / apache / tomcat / util / net / SocketWrapper;)Lorg / apache / tomcat / util / net / AbstractEndpoint $ Handler $ SocketState; (AjpProcessor.java:301) 在org.apache.coyote.ajp.AjpProtocol $ AjpConnectionHandler.process(Lorg / apache / tomcat / util / net / SocketWrapper; Lorg / apache / tomcat / util / net / SocketStatus;)Lorg / apache / tomcat / util / net / AbstractEndpoint $处理器$ SocketState; (AjpProtocol.java:183) 在org.apache.coyote.ajp.AjpProtocol $ AjpConnectionHandler.process(Lorg / apache / tomcat / util / net / SocketWrapper;)Lorg / apache / tomcat / util / net / AbstractEndpoint $ Handler $ SocketState; (AjpProtocol.java:169) at org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run()V(JIoEndpoint.java:302) at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(Ljava / lang / Runnable;)V(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor $ Worker.run()V(ThreadPoolExecutor.java:908) 在java.lang.Thread.run()V(Thread.java:662)
怀疑2
" java.lang.StringBuffer"的一个实例加载""占用59,216,088(26.35%)字节。该实例由org.apache.myfaces.renderkit.html.util.ReducedHTMLParser @ 0x276990e8引用,由" org.apache.catalina.loader.WebappClassLoader @ 0x29592038"加载。内存在" char []"的一个实例中累积。由""。
加载答案 0 :(得分:2)
您可以转到内存分析器(MAT)的“dominator_tree”选项卡并展开TaskThread。这将显示该任务线程中所有对象的保留堆。这可能有助于您到达应用程序中导致问题的部分(代码)。
答案 1 :(得分:0)
看起来像org.apache.myfaces.renderkit.html.util.ReducedHTMLParser是罪魁祸首。 ReducedHTMLParser的javadoc解释了它的工作原理。它将整个HTML响应缓冲在内存中,然后进行处理。看起来它正在尝试 - 并且失败 - 处理一个非常大的响应。