【问题标题】:JRockit getting stuckJRockit 卡住了
【发布时间】:2013-01-25 20:27:12
【问题描述】:

我们遇到了 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 

任何想法可能导致此问题?

【问题讨论】:

  • 获取 hprof 堆转储并通过 Eclipse 内存分析器工具运行它 - 这可能是由于某些 db 连接池操作未释放资源而导致的内存泄漏
  • 当JVM卡住时,我什至无法进行堆转储,只能进行线程转储,不幸的是。
  • 请发布您的 JRockit JVM 设置

标签: weblogic jrockit


【解决方案1】:

在尝试分配额外的TLA(线程局部区域)空间时,它似乎被卡住了。线程局部区域 (TLA) 是在堆或托儿所上保留的一块空闲空间,并分配给线程供其独占使用。线程可以在自己的 TLA 中分配小对象,而无需与其他线程同步。当 TLA 满时,线程只请求一个新的 TLA。 由于 jrockit 分配内存失败,线程卡住了。

从堆栈跟踪中,当您从数据库中读取数据时会发生这种情况,因此这可能意味着没有足够的 TLA 空间用于读取的对象。此查询是否从数据库中读取了大量记录?

您可以尝试通过tuning the TLA size解决此问题

【讨论】:

    【解决方案2】:

    问题很可能与数据库操作有关:Holding lock: oracle/jdbc/driver/T4CPreparedStatement@0x1d8f8268[thin lock]

    您是否检查过在您的服务器遇到上述问题时是否正在执行数据库操作?

    您可以检查以下内容:

    • 长时间运行的查询
    • 与 DB 服务器相关的问题导致 DB 响应缓慢
    • 尝试从数据库加载大块数据的数据库操作

    【讨论】:

    • 这个锁不只会阻止对数据库的访问吗?现在,当问题发生时,这是唯一卡在 JDBC 代码中的线程,没有其他线程试图访问数据库。甚至不需要数据库的连接(例如到 weblogic 控制台的连接)也会完全卡住。
    猜你喜欢
    • 2012-06-23
    • 2021-10-08
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多