2012-06-02 14 views
6

तो मैं विजुअलVM के साथ अपने आवेदन को प्रोफाइल कर रहा था।विजुअलVM सॉकेट.read

मैंने अपने MySQL इंटरैक्शन के बारे में एक हॉटस्पॉट मारा। मेरा पहला विचार था कि गर्म स्थान समय दिखा रहा था कि मेरा आवेदन आईओ के बाद इंतजार कर रहा था। लेकिन प्रोफाइलिंग रिपोर्ट में, विजुअलVM में दो कॉलम "टाइम" और "टाइम (सीपीयू)" हैं। हो सकता है कि इस शब्द का गलत इस्तेमाल किया गया हो, लेकिन मुझे लगता है कि आत्म-समय (सीपीयू) कॉलम आईओ समय को छोड़ रहा था। अधिक डिबगिंग के बाद, हमने निष्कर्ष निकाला कि धारणा गलत थी और आईओ समय दिखा रहा था क्योंकि हॉटस्पॉट java.net पर था। MySQL ड्राइवर और अन्य आईओ चीजों काocketInputStream.read() जो किसी भी cpu की लागत नहीं लेनी चाहिए।

तो, मेरा सवाल यह है कि Visualvm सॉकेटइनपुटस्ट्रीम.read() को cpu समय के रूप में क्यों रिपोर्ट करता है?

Screnshot

+0

शायद कुछ व्यस्त प्रतीक्षा है, उदा। लूप में 'उपलब्ध() 'को कॉल करना? –

+0

मेरी गलती क्षमा करें। यह java.net पर था। सॉकेटइनपुटस्ट्रीम.read() – plcstpierre

उत्तर

4

थ्रेड गतिविधि की निगरानी करते समय देशी कॉल हमेशा रननेबल स्थिति में होती हैं, संभवतः क्योंकि जेवीएम को यह जानने का कोई तरीका नहीं है कि मूल कॉल सो रहा है या वास्तव में कुछ कर रहा है या नहीं। इस प्रकार, रननेबल राज्य में सीपीयू समय के रूप में गणना की गई समय।

+1

धन्यवाद! यही वही है जो मैं ढूंढ रहा था। – plcstpierre

0

SocketInputStream.read() ब्लॉक वहाँ जब तक डेटा दूसरी तरफ से उपलब्ध। तो यह आपके डेटाबेस से धीमी प्रतिक्रिया हो सकती है।

+0

मुझे पता है कि। यह मेरा सवाल नहीं है। मेरा सवाल यह है कि दृश्य वीएम इसे सीपीयू उपयोग के रूप में क्यों ध्वजांकित करता है? – plcstpierre

1

This very long thread का दावा है कि छोटे लिखने से समस्या हो सकती है। यह पढ़ने के लायक है, लेकिन मुझे नहीं पता कि आप इसके बारे में क्या कर सकते हैं। तुम क्या कर सकते थे? आप सुनिश्चित कर सकते हैं कि आप छोटे fetch size का उपयोग नहीं कर रहे हैं। यह आपको छोटे लिखने नहीं देगा, लेकिन छोटे पढ़ता है जो एक ही समस्या का कारण बनता है। आप क्लाइंट या सर्वर के लिए अलग-अलग प्लेटफ़ॉर्म आज़मा सकते हैं। this bug में एक टिप्पणी है कि पढ़ता है:

"हमने देखा है कितनी जल्दी आई/ओ बफ़र्स सोलारिस और लिनुक्स के बीच भरा हो पर बेहद अलग व्यवहार (और इस प्रकार ReadAheadInputStream.fill कॉल की संख्या(), क्योंकि यह जो उपलब्ध है उसे पढ़ता है, यह तब तक अवरुद्ध नहीं होता जब तक कि इसे उपलब्ध होने से अधिक पढ़ने की आवश्यकता न हो)। "

+0

धन्यवाद, वह अंतर्दृष्टिपूर्ण था, लेकिन यह वह जवाब नहीं था जिसे मैं ढूंढ रहा था :( – plcstpierre

संबंधित मुद्दे