我正在調查與tomcat關機過程有關的奇怪問題:在runnig shutdown.sh之後,java進程仍然出現(我通過使用ps -ef|grep tomcat
來檢查它) 這種情況有點複雜,因爲我有對服務器的訪問非常有限(例如,沒有調試)tomcat:等待條件線程
我使用遠程jConsole
和熱點功能執行了線程轉儲(使用kill -3 <PID>
)和堆轉儲。
尋找到線程轉儲後,我發現這一點:
"pool-2-thread-1" #74 prio=5 os_prio=0 tid=0x00007f3354359800 nid=0x7b46 waiting on condition [0x00007f333e55d000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000c378d330> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1081)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
所以,我對這個問題的理解是如下:有是在CachedThreadpool使用的資源(DB連接或別的東西),而這個資源現在被鎖定, 並阻止線程pool-2-thread-1
停止。假設這個線程不是deamon - JVM不能正常停止。
有沒有辦法找出哪些資源被鎖定,鎖定在哪裏以及如何避免這種情況?另一個問題是 - 如何防止這種情況? 另一個是:地址0x00007f333e55d000的用途是什麼?
謝謝!