2012-06-04 22 views
11

हाल ही में हमारे उत्पादन टोमकैट सर्वर में से एक अप्रतिबंधित हो गया क्योंकि टॉमकैट के व्यस्त धागे 200 तक चले गए। जब ​​हमने पुनरारंभ करने से पहले थ्रेड डंप लिया तो हमें TIMED_WAITING में 100 थ्रेड मिले इन 3 धागे की तरह राज्य:टॉमकैट में 100 धागे TIMED_WAITING, जिससे यह स्टॉल हो जाता है क्योंकि थ्रेड की कुल संख्या 200

""http-bio-7007"-exec-241" daemon prio=10 tid=0x00002aaab107b000 nid=0x59df waiting on condition [0x0000000051239000] 
java.lang.Thread.State: TIMED_WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <0x0000000580d877d0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025) 
    at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:424) 
    at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:86) 
    at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:32) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:945) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) 
    at java.lang.Thread.run(Thread.java:662) 

""http-bio-7007"-exec-237" daemon prio=10 tid=0x00002aaab186e000 nid=0x596d waiting on condition [0x000000004d1f9000] 
java.lang.Thread.State: TIMED_WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <0x0000000580d877d0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025) 
    at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:424) 
    at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:86) 
    at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:32) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:945) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) 
    at java.lang.Thread.run(Thread.java:662) 

""http-bio-7007"-exec-236" daemon prio=10 tid=0x00002aaab1118000 nid=0x596c waiting on condition [0x000000004e50c000] 
java.lang.Thread.State: TIMED_WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <0x0000000580d877d0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025) 
    at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:424) 
    at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:86) 
    at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:32) 
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:945) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) 
    at java.lang.Thread.run(Thread.java:662) 

हम है 4 आवेदन की धागा पूल (जैसे पूल-4-धागा -20 आदि) भी है जो 20 धागे कर रहे हैं प्रत्येक तो मैं नहीं अवरुद्ध, जिस पर ये 100 धागे इंतज़ार कर कतार यकीन ? हम c3P0 कनेक्शन पूल का उपयोग हाइबरनेट के साथ कर रहे हैं जो इस कारण का प्रतीत नहीं होता है।

कोई विचार क्या java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject है?

+0

क्या आपने हेप डंप लेने और इसे [MAT] (http://www.eclipse.org/mat/) के माध्यम से चलाने के लिए क्या ऑब्जेक्ट जमा कर रहे हैं? –

+2

इस समय हमें एक ही समस्या है। यहां तक ​​कि टॉमकैट को पुनरारंभ करने में भी मदद नहीं मिली। फिर से काम करने के बाद evrything काम किया। अजीब! बीमार आगे की जांच करें और अगर मुझे कुछ दिलचस्प लगे तो रिपोर्ट करेंगे। – Janning

+0

इसका हाइबरनेट से कोई लेना-देना नहीं है क्योंकि आज रात हमारे पूरे सर्वर फार्म में इस समस्या का सामना करना पड़ा और उनमें से कुछ बिना किसी हाइबरनेट या डेटाबेस स्टैक के छवि सर्वर हैं। – Janning

उत्तर

5

यह तय किया गया जब हमने अपना कोड तय किया जो सी 3 पी 0 द्वारा प्रबंधित डीबी कनेक्शन लीक कर रहा था। हमारे कोड में कुछ प्रवाह थे जहां हम अंततः ब्लॉक में इकाई प्रबंधक को बंद करने से पहले रोलबैक() विशेष रूप से पकड़ ब्लॉक में नहीं बुला रहे थे, इसलिए अपवाद कनेक्शन के मामले में पूल वापस नहीं आ रहा था और यदि अपवाद की आवृत्ति उच्च है (आकार से अधिक टाइमआउट अंतराल के भीतर पूल का) तो कनेक्शन प्राप्त करने के लिए सभी अन्य प्रक्रिया धागे ढेर हो जाएंगे।

+0

मुझे एक ही समस्या मिल रही है, क्या आप कृपया कनेक्शन का उपयोग करने के तरीके पर मेरी सहायता कर सकते हैं? ताकि यह रिसाव न हो। – Mohanraj

4

कोई विचार क्या java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject है?

कंडीशन ऑब्जेक्ट कतार के अंदर विभिन्न धागे द्वारा कतार तक पहुंच को सिंक्रनाइज़ करने के लिए उपयोग किया जाता है।

यह मानक स्टैकट्रैक है, जब आपके executerpool का धागा निष्क्रिय है और नए कार्यों की प्रतीक्षा कर रहा है।