JRockit застрять

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

"[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 

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

2 ответа

Решение

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

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

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

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

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

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

  • Долгосрочный запрос
  • Проблемы, связанные с сервером БД, приводящие к медленной реакции БД
  • Операция БД, которая пытается загрузить большие куски данных из БД
Другие вопросы по тегам