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
相关产品推荐
相关产品推荐

