代码之家  ›  专栏  ›  技术社区  ›  Tarski

Tomcat OutOfMyComryError Java堆空间Arrays.copyOf

  •  0
  • Tarski  · 技术社区  · 14 年前

    我们有一个servlet可以从客户上传文件并将其存储在我们的服务器上。每隔几周servlet就会失败,并出现以下错误:

    java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:2882)
        at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
        at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390)
        at java.lang.StringBuffer.append(StringBuffer.java:224)
        at java.util.logging.SimpleFormatter.format(SimpleFormatter.java:74)
        at org.apache.juli.FileHandler.publish(FileHandler.java:129)
        at java.util.logging.Logger.log(Logger.java:458)
        at java.util.logging.Logger.doLog(Logger.java:480)
        at java.util.logging.Logger.logp(Logger.java:680)
        at org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:167)
        at org.apache.juli.logging.DirectJDKLog.error(DirectJDKLog.java:135)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:274)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
        at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
        at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
        at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769)
        at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698)
        at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891)
        at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
        at java.lang.Thread.run(Thread.java:619)
    

    Tomcat和 -Xmx256M . 我不知道如何调试这个内存泄漏——这是否与java.util.logger的填充有关?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Aaron Digulla    14 年前

    可能没有内存泄漏;我猜是有人试图写一个巨大的日志消息。检查日志设置。

    还要检查Tomcat在管理器页面上使用了多少内存,以及有多少可用内存。根据你的网络应用,256MB可能不够。

    最后一个解释可能是拒绝服务攻击或者试图触发Java错误来攻击服务器。

        2
  •  1
  •   Greg Hewgill    14 年前

    你可能得到了一些对象引用,并且永远不会放手。这并不是记录器正在填充内存,而是记录器可能最频繁地运行,因此,如果您 填满你的堆。