Tomcat OutOfMemoryError Пространство кучи Java Arrays.copyOf - PullRequest
0 голосов
/ 26 июля 2010

У нас есть сервлет, который загружает файлы от клиентов и сохраняет их на нашем сервере. Каждые несколько недель сервлет завершается с ошибкой:

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 ]

1 голос
/ 26 июля 2010

Вероятно, утечки памяти нет; я предполагаю, что кто-то пытается написать огромное сообщение в журнале. Проверьте настройки журнала.

Также проверьте, сколько памяти Tomcat использует на странице менеджера и сколько свободно. В зависимости от вашего веб-приложения 256 МБ может быть недостаточно.

Последним объяснением может быть атака типа «отказ в обслуживании» или попытка вызвать ошибку Java для взлома вашего сервера.

1 голос
/ 26 июля 2010

Возможно, у вас есть что-то, что держит некоторые ссылки на объекты и никогда не отпускает.Дело не в том, что регистратор заполняет память, но регистратор, вероятно, запускается наиболее часто и поэтому первым делом замечает, если вы делаете заполняете свою кучу.

...