You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JRocket线程阻塞于jrockit/vm/Locks.park0,方法调用未执行求助

问题排查分析:AbcTimer未执行且无异常的原因及解决方向

我来帮你一步步拆解这个问题,结合你给出的线程Dump、代码片段和日志信息,咱们定位可能的根源并给出排查步骤:

核心现象回顾

  • 代码执行到startMicroSessionTimer的logger.debug("Starting a micro-timer...")后,完全没有进入Util.AbcTimer的迹象(看不到首行日志)
  • 无任何异常抛出,程序没有崩溃或报错
  • 线程Dump显示jaxws-engine-1-thread-2处于parked状态,卡在线程池的任务等待环节

线程Dump深度分析

从你提供的线程栈可以看到:

"jaxws-engine-1-thread-2" id=447 idx=0x73c tid=4031 prio=5 alive, parked, native_blocked, daemon
at jrockit/vm/Locks.park0(J)V(Native Method)
at jrockit/vm/Locks.park(Locks.java:2230)
at sun/misc/Unsafe.park(ZJ)V(Native Method)
at java/util/concurrent/locks/LockSupport.parkNanos(LockSupport.java:196)
at java/util/concurrent/SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:424)
at java/util/concurrent/SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:323)
at java/util/concurrent/SynchronousQueue.poll(SynchronousQueue.java:874)
at java/util/concurrent/ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:955)
at java/util/concurrent/ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:917)

这个线程并没有在执行你的业务代码,而是停留在ThreadPoolExecutor的任务获取逻辑里——它在SynchronousQueue上等待新任务,说明当前线程池没有待处理的任务。

注意:日志里的处理线程是jaxws-engine-1-thread-12,而Dump里的是thread-2,建议你补充捕获thread-12的线程状态,这才是处理你那个请求的核心线程。


可能的根源及排查步骤

1. Util.getAppSession方法阻塞(最高优先级排查)

日志已经打印了Starting a micro-timer,说明startMicroSessionTimer执行到了调用AbcTimer的前一行,但AbcTimer没执行,最大的可能是**Util.getAppSession方法内部发生了阻塞**,线程根本没走到AbcTimer的调用。

排查动作:

  • 在Util.getAppSession方法的首尾添加DEBUG日志,确认方法是否进入、是否正常返回
  • 使用JProfiler/VisualVM等工具监控jaxws-engine-1-thread-12的线程状态,看它是否卡在锁等待、IO操作或远程调用上
  • 检查getAppSession内部逻辑:是否有synchronized块、锁竞争?是否访问了数据库/缓存/远程服务且未设置超时?

2. AbcTimer日志未输出(非执行问题)

如果AbcTimer实际执行了,但日志没显示,可能是以下原因:

  • 日志级别配置问题:Util类的日志级别被设置为INFO或更高,导致DEBUG日志被过滤。可以临时修改日志配置,或在AbcTimer开头添加System.out.println("Inside AbcTimer")验证
  • 代码笔误:你贴的代码里logger.debug("Inside AbcTimer鈥�;存在字符串未闭合和乱码,若实际代码有类似问题,可能导致日志输出异常(但编译会报错,概率较低)

3. 静默异常被吞掉

有可能AbcTimer方法抛出了异常,但被线程池的全局异常处理器静默处理了,没有打印日志。

排查动作:

  • 在AbcTimer方法开头添加全局异常捕获:
    public static void AbcTimer(SipApplicationSession appSession, long timeInMillies, String timerName) {
        try {
            logger.debug("Inside AbcTimer");
            // 原有逻辑
        } catch (Throwable t) {
            logger.error("AbcTimer执行失败", t); // 强制打印异常堆栈
            throw t; // 重新抛出,不影响原有逻辑
        }
    }
    

4. JRockit版本相关bug

你使用的JRockit R28.3.13是基于Java 6u141的老版本,可能存在与SynchronousQueue、线程池相关的已知bug。

排查动作:

  • 查阅该版本的Release Notes,确认是否有线程parked无法唤醒的相关bug
  • 尝试升级到同系列的更高版本(如R28.3.15),或临时切换到HotSpot JVM验证问题是否消失

总结

目前最可能的原因是Util.getAppSession方法内部阻塞,导致线程无法进入AbcTimer。建议优先从这个方向入手排查,补充thread-12的线程状态信息会更有助于定位问题。

内容的提问来源于stack exchange,提问作者VJS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:27:18