JRockit застревает

У нас были проблемы с зависанием jvm JRockit с этим стеком:

"[STUCK] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'" id=45 idx=0x94 tid=9944 prio=1 alive, in native, daemon
    at jrockit/vm/Allocator.nativeGetNewTLA()V(Native Method)
    at jrockit/vm/Allocator.getNewTLA(Allocator.java:788)[optimized]
    at jrockit/vm/Allocator.allocLargerThanFreeTLA(Allocator.java:816)[inlined]
    at jrockit/vm/Allocator.allocSlowCaseInner(Allocator.java:930)[inlined]
    at jrockit/vm/Allocator.allocSlowCase(Allocator.java:776)[optimized]
    at oracle/jdbc/driver/T4CMAREngine.unmarshalCLRforREFS(T4CMAREngine.java:2024)[optimized]
    at oracle/jdbc/driver/T4CTTIoer.unmarshal(T4CTTIoer.java:160)[optimized]
    at oracle/jdbc/driver/T4C8Oall.receive(T4C8Oall.java:727)[optimized]
    at oracle/jdbc/driver/T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)[inlined]
    at oracle/jdbc/driver/T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:955)[optimized]
    at oracle/jdbc/driver/OracleStatement.executeMaybeDescribe(OracleStatement.java:1060)[optimized]
    at oracle/jdbc/driver/T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:839)[optimized]
    at oracle/jdbc/driver/OracleStatement.doExecuteWithTimeout(OracleStatement.java:1132)[optimized]
    at oracle/jdbc/driver/OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3316)[optimized]
    at oracle/jdbc/driver/OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3361)[optimized]
    ^-- Holding lock: oracle/jdbc/driver/T4CPreparedStatement@0x1d8f8268[thin lock]
    ^-- Holding lock: oracle/jdbc/driver/T4CConnection@0x14d68fd8[thin lock]
    at weblogic/jdbc/wrapper/PreparedStatement.executeQuery(PreparedStatement.java:97)[optimized]

Кажется, он застрял, пытаясь выделить память. Согласно нашим инструментам мониторинга, использование кучи составляло около 14% и менее 20% до того, как сервер завис.

Это версия Java:

java version "1.5.0_14"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_14-b03)
BEA JRockit(R) (build R27.5.0-110_o-99226-1.5.0_14-20080528-1505-linux-x86_64, compiled mode)

Это настройки JVM, которые мы используем

-Xms256m -Xmx3072m -Xverify:none 

Любые идеи, что может быть причиной этой проблемы?


person Andres Olarte    schedule 25.01.2013    source источник
comment
Возьмите дамп кучи hprof и запустите его с помощью инструмента анализа памяти Eclipse — это может быть утечка памяти из-за того, что некоторые операции пула соединений с базой данных не освобождают ресурс.   -  person JoseK    schedule 28.01.2013
comment
Когда JVM зависает, я даже не могу сделать дамп кучи, к сожалению, только дамп потока.   -  person Andres Olarte    schedule 16.02.2013
comment
Пожалуйста, опубликуйте свои настройки JRockit JVM   -  person Lan    schedule 06.03.2013


Ответы (2)


Похоже, он завис при попытке выделить дополнительные TLA (локальная область потока). Локальная область потока (TLA) — это кусок свободного пространства, зарезервированный в куче или питомнике и предоставленный потоку для его исключительного использования. Поток может размещать небольшие объекты в своем собственном TLA без синхронизации с другими потоками. Когда TLA заполняется, поток просто запрашивает новый TLA. Поток зависает, потому что jrockit не может выделить память.

Из трассировки стека это происходит, когда вы читаете данные из базы данных, поэтому, вероятно, это означает, что для прочитанных объектов не хватило места в TLA. Читает ли этот запрос много записей из базы данных?

Вы можете попытаться решить эту проблему, настроив размер TLA.

person Dror Bereznitsky    schedule 12.03.2013

Скорее всего проблема связана с операцией БД: Holding lock: oracle/jdbc/driver/T4CPreparedStatement@0x1d8f8268[thin lock].

Вы проверили, выполнялась ли операция БД в то время, когда на вашем сервере возникла упомянутая проблема?

Вы можете проверить следующее:

  • Долгий запрос
  • Проблемы, связанные с сервером БД, из-за которых БД медленно отвечает
  • Операция БД, которая пытается загрузить большие куски данных из БД
person Apostolos Emmanouilidis    schedule 27.01.2013
comment
Разве эта блокировка не предотвратит доступ только к базе данных? Прямо сейчас, когда возникает проблема, это единственный поток, застрявший в коде JDBC, никакой другой поток не пытается получить доступ к базе данных. И даже соединения, которым не нужна база данных (например, соединение с консолью weblogic), полностью зависают. - person Andres Olarte; 29.01.2013