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

#java #jvm #weblogic #muxer

#java #jvm #weblogic #мультиплексирующий

Вопрос:

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

 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)
  

Ответ №1:

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

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

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

Комментарии:

1. В дополнение к замечаниям Саймона, я думаю, что вам лучше всего отслеживать использование кучи (возможно, с помощью подробной сборки мусора ), а затем, когда куча показывает признаки необратимого роста, используйте инструмент, подобный ‘jmap’ и инструмент eclipse memory analyser, чтобы увидеть, какой объект доминирует в вашей куче.

Ответ №2:

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

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

Ответ №3:

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

Имейте в виду, что когда куча заполнена, следующая операция завершается ошибкой с исключением OutOfMemory, и поэтому эта трассировка стека может не указывать на какую-либо причину сбоя. Это просто указывает на то, что при запуске этого кода кучи было недостаточно, а не на то, что этот код вызвал заполнение кучи.

** Правки…

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

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

Комментарии:

1. Джеффу не удается открыть ссылку на vimeo. Если у вас есть другая ссылка на YouTube, пожалуйста, поделитесь

Ответ №4:

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

Комментарии:

1. у weblogic нет catalina.bat но startweblogic.cmd — просто чтобы указать

2. Спасибо. я не очень разбираюсь в weblogic, но в tomcate должна быть ‘env’ (переменная окружения, которую нужно установить для инструктирования JVM) (starup.sh/bat )

Ответ №5:

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

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