java.lang.OutOfMemoryError: пространство кучи Java

Мое приложение развернуто в кластерной среде. Недавно сервер вышел из строя со следующей трассировкой стека. Похоже, это не из кода. До недавнего времени все работало нормально, пока не появилась эта ошибка. На сервере не было сделано никаких серьезных изменений. Может кто-нибудь посоветовать?

java.lang.OutOfMemoryError: Java heap space
    at java.lang.AbstractStringBuilder.<init>(AbstractStringBuilder.java:44)
    at java.lang.StringBuilder.<init>(StringBuilder.java:69)
    at java.io.ObjectStreamClass$FieldReflectorKey.<init>(ObjectStreamClass.java:2106)
    at java.io.ObjectStreamClass.getReflector(ObjectStreamClass.java:2039)
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:586)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1552)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466)
    at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1591)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
    at weblogic.utils.io.ChunkedObjectInputStream.readObject(ChunkedObjectInputStream.java:195)
    at weblogic.rjvm.MsgAbbrevInputStream.readObject(MsgAbbrevInputStream.java:565)
    at weblogic.utils.io.ChunkedObjectInputStream.readObject(ChunkedObjectInputStream.java:191)
    at weblogic.rmi.internal.dgc.DGCServerImpl_WLSkel.invoke(Unknown Source)
    at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:589)
    at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:479)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363)
    at weblogic.security.service.SecurityManager.runAs(Unknown Source)
    at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:475)
    at weblogic.rmi.internal.BasicServerRef.access$300(BasicServerRef.java:59)
    at weblogic.rmi.internal.BasicServerRef$BasicExecuteRequest.run(BasicServerRef.java:1016)
    at weblogic.work.SelfTuningWorkManagerImpl.schedule(SelfTuningWorkManagerImpl.java:126)
    at weblogic.rmi.internal.BasicServerRef.dispatch(BasicServerRef.java:321)
    at weblogic.rmi.internal.BasicServerRef.dispatch(BasicServerRef.java:918)
    at weblogic.rjvm.RJVMImpl.dispatchRequest(RJVMImpl.java:1084)
    at weblogic.rjvm.RJVMImpl.dispatch(RJVMImpl.java:1001)
    at weblogic.rjvm.ConnectionManagerServer.handleRJVM(ConnectionManagerServer.java:240)
    at weblogic.rjvm.ConnectionManager.dispatch(ConnectionManager.java:877)
    at weblogic.rjvm.MsgAbbrevJVMConnection.dispatch(MsgAbbrevJVMConnection.java:446)
    at weblogic.rjvm.t3.MuxableSocketT3.dispatch(MuxableSocketT3.java:368)
    at weblogic.socket.AbstractMuxableSocket.dispatch(AbstractMuxableSocket.java:383)
    at weblogic.socket.SocketMuxer.readReadySocketOnce(SocketMuxer.java:872)

5 ответов

Решение

Вам не хватает памяти, что предполагает одно из следующих действий:

  • Вы должны дать вашему процессу больше памяти (с -Xmx опция командной строки Java); или же
  • у вас утечка памяти

Без дополнительной информации трудно сказать, в чем дело. Трассировка стека для OutOfMemoryError редко полезен, поскольку показывает только точку, в которой куча была исчерпана; это не показывает вам, почему ваша куча заполняется.

Ответ Саймона Никерсона правильный

Просто добавим, что ваша трассировка стека начинается с weblogic.socket.SocketMuxer.readReadySocketOnce, который является внутренним классом weblogic, который принимает входящие запросы. Таким образом, это означает, что на сервере недостаточно памяти для приема запросов.

Вы используете JVM JRockit? Если вы, вы можете использовать JRockit Mission Control и контролировать использование кучи Java. Вы также можете использовать JRockit Flight Recorder для записи событий JVM для автономного анализа. Об этом есть веб-трансляция Oracle: http://www.vimeo.com/22109838. Вы можете перейти к 4:54, где начинается обзор JRockit, WLDF и JRF.

Имейте в виду, что когда куча заполнена, это СЛЕДУЮЩАЯ операция, которая завершается с OutOfMemory Exception, и, следовательно, эта трассировка стека может не указывать причину сбоя. Это просто указывает на то, что при запуске этого кода не было достаточно кучи, а не то, что этот код вызывал заполнение кучи.

** Редактирует...

Очевидно, что серверу не хватает памяти - во время этой конкретной операции. Вопрос в том... почему? Эта трассировка стека не говорит вам - почему это просто указывает на то, что все, что происходило в то время, не могло завершиться, потому что в то время было недостаточно памяти. Это не значит, что это является причиной проблемы.

Конечно, вы можете добавить больше памяти, но это может не решить проблему - может потребоваться больше времени для ее появления.

Это означает, что JVM исчерпала всю выделенную ему память. Вы можете изменить объем памяти, выделенной для использования вашей JVM, с помощью параметров командной строки -Xms и -Xmx.

OutOfMemoryError в Java является подклассом java.lang.VirtualMachineError, а JVM выдает java.lang.OutOfMemoryError, когда ему не хватает памяти в куче. OutOfMemoryError в Java может появиться в любой момент в куче, в основном, когда вы пытаетесь создать объект, а в куче недостаточно места для размещения этого объекта.

set catalina.sh/bat find set JAVA_OPTS=%JAVA_OPTS%, что бы ни была ваша RAM - отрегулируйте, но не отдавайте больше половины RAMset JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG% -server -Xms512M -Xmx512M -XX:MaxPermSize=256M

Другие вопросы по тегам