2013-04-28 9 views
6

मैं बारे में बहुत कुछ सुना है क्या JVM JITs कर सकते हैं करते हैं, लेकिन कैसे प्रोफ़ाइल क्या JIT वास्तव में अपने कार्यक्रम की दी गई समय में क्या कर रहा है के बारे में जानकारी का एक बहुत कुछ नहीं दिख रहा। -XX:+PrintCompilation और -XX:+PrintOptoAssembly का उपयोग करने के बारे में बहुत सारी युक्तियां हैं, लेकिन इसके परिणामस्वरूप वास्तव में कम-स्तर की जानकारी होती है जो व्याख्या करना मुश्किल है।JVM JIT नैदानिक ​​उपकरण अनुकूलन युक्तियाँ

सामान्य रूप से, अनुकूलन के दौरान, मुझे समर्पित जेआईटी वार्मअप समय के साथ सामान्य संचालन का बेंचमार्क सूट होना पसंद है, लेकिन मैं यह देखने में सक्षम होना चाहता हूं कि वास्तव में कौन से अनुकूलन मेरे कोड पर फायरिंग कर रहे हैं। शायद मेरे जेवीएम ने एक विशेष विधि कॉल को रेखांकित करने पर विचार किया लेकिन इसके बारे में कुछ ऐसा करने का फैसला नहीं किया गया, या शायद जेआईटी मेरे लूप में सरणी सीमाओं से बचने में असमर्थ था क्योंकि मैंने अपने आविष्कारों और लूपिंग स्थितियों को भी अस्पष्ट रूप से वाक्यांशित किया था। मैं आपकी किट जैसे टूल को "जेआईटी के साथ क्या चल रहा है" के कुछ रूपों का समर्थन करने की उम्मीद करता हूं लेकिन मैं इसके लिए याकिट में कहीं और इसका समर्थन नहीं पा रहा हूं।

आदर्श रूप से मैं अपने कार्यक्रम के दौरान जेआईटी के अनुकूलक क्या सोच रहा है, उसके बारे में सोचने के लिए एक मस्तिष्क डंप पसंद करूंगा। मान लें कि मैंने अपने काम को बहुत गर्म कर दिया है और उसने अपने आंतरिक लूप में तीन तरीकों को रेखांकित करने का फैसला किया है और लूप को तीन खंडों में तोड़ दिया है, जिसमें मध्य भाग पर कोई सरणी सीमा नहीं है, मुझे उन निर्णयों और प्रेरणा का सारांश चाहिए उनके लिए।

क्या मुझे यहां कुछ स्पष्ट याद आ रही है? क्या चल रहा है यह जानने के लिए तंग आंतरिक लूप को अनुकूलित करते समय JVM प्रदर्शन-जागरूक प्रोग्रामर क्या करते हैं? निश्चित रूप से निम्न स्तर -XX झंडे एकमात्र विकल्प नहीं हो सकते हैं, क्या वे कर सकते हैं? मैं इस बात की सराहना करता हूं कि जेवीएम पर इस प्रकार के निम्न-स्तरीय सामानों से कैसे निपटना है। और नहीं, यह सवाल समयपूर्व अनुकूलन से प्रेरित नहीं है! :)

संपादित करें: मुझे लगता है कि मैं जो कुछ चाहता हूं उसे -XX:+LogCompilation द्वारा दिया गया है, लेकिन अगर मैं इस तरह की गतिविधि के लिए सामान्य सुझाव और टूल रखता हूं तो मैं अभी भी उत्सुक हूं।

+0

यह बात आपको JVM आंतरिकों को विज़ुअलाइज़ करने के बारे में कुछ जानकारी दे सकती है: http://www.infoq.com/presentations/Visualizing-Java-GC – sschaef

उत्तर

3

यदि आप मस्तिष्क डंप चाहते हैं, तो आप परिणामी असेंबली कोड प्रिंट कर सकते हैं, लेकिन यह आपके पहले से ही कम स्तर से कम स्तर है। मुझे संदेह है कि आप जो खोज रहे हैं वह HotSpot JVM के लिए मौजूद नहीं है। मैंने जेआरॉकिट पर आधारित इस तरह की कुछ प्रस्तुति देखी और शायद यह इसे एक दिन हॉटस्पॉट में लाएगा।

क्या मुझे यहां कुछ स्पष्ट याद आ रही है? क्या चल रहा है यह जानने के लिए तंग आंतरिक लूप को अनुकूलित करते समय JVM प्रदर्शन-जागरूक प्रोग्रामर क्या करते हैं?

आमतौर पर, मैं कचरा उत्पादन को कम करना पसंद करता हूं और यह आमतौर पर पर्याप्त प्रदर्शन करता है। उदाहरण के लिए माइक्रो-सेकंड विलंबता के लिए।

इस प्रकार के माइक्रो-ऑप्टिमाइज़ेशन के लिए वास्तव में मशीन कोड की गहरी समझ की आवश्यकता होती है और सीपीयू वास्तव में कैसे काम करते हैं।

निश्चित रूप से निम्न-स्तर -XX झंडे एकमात्र विकल्प नहीं हो सकते हैं, क्या वे कर सकते हैं?

यदि केवल इतना आसान है, तो यह कहीं अधिक जटिल है। मशीन कोड को डंप करने के लिए आपको एक अतिरिक्त मूल पुस्तकालय की आवश्यकता है जो JVM के साथ शिप नहीं करता है। ;)

मैं इस बात की सराहना करता हूं कि जेवीएम पर इस तरह के निम्न स्तर की सामग्री से निपटने के लिए सबसे अच्छा तरीका है।

ऐसा लगता है कि नहीं है वास्तव में कम स्तर पर काम करने के लिए यदि आप इसे से बचने कर सकते हैं और मेरा मानना ​​है कि यह एक अच्छी बात है, तो आपको पहले ही उच्च स्तर की देखभाल करने के क्योंकि सूक्ष्म अनुकूलन अच्छा है माइक्रो-बेंचमार्क के लिए लेकिन वास्तविक अनुप्रयोगों के लिए शायद ही कभी अच्छा है क्योंकि आपको सिस्टम के अंत में अपने अंत की सभी विलंबता को समझने की आवश्यकता है और यह आप कई मामलों में कोड को देखे बिना भी कर सकते हैं। यानी आपके डेटाबेस, ओएस, डिस्क, या नेटवर्क आईओ में मुख्य देरी है।

मैं अभी भी उत्सुक हूं अगर लोगों के पास इस तरह की गतिविधि के लिए सामान्य सुझाव और उपकरण हैं।

एक प्रोफाइलर का उपयोग करें, और यदि आपको संदेह है कि आपको कम जाने की आवश्यकता है, तो संभवतः आप कुछ और महत्वपूर्ण याद कर चुके हैं।

+1

सही पुस्तकालयों को जोड़ना वास्तव में आपको मशीन कोड प्राप्त करने के लिए हॉटस्पॉट पर आवश्यक है । जेवीएम के डीबग बिल्ड के लिए कोई ज़रूरत नहीं है, डिफ़ॉल्ट बाइनरी ठीक काम करती हैं। – Voo

+0

@Voo यह थोड़ी देर हो गया है क्योंकि मैंने ऐसा किया था। सुधार के लिए धन्यवाद। –

+1

मुझे नहीं लगता कि यह किसी और चीज को और अधिक महत्वपूर्ण याद करने की संभावना है। मैं मुख्य रूप से दिलचस्पी लेता हूं कि कैसे उच्च स्तर की भाषाएं जैसे कि, स्कैला, जेवीएम के मौजूदा अनुकूलन के साथ खेलें। विशेष रूप से, मैं निराश हूं कि स्कैला के बाहर उचित रूप से तंग प्रदर्शन प्राप्त करने का एकमात्र तरीका (उपयोगकर्ता के सामने आने वाली सुविधा के लिए संख्या क्रंचिंग, इतनी कच्ची गति के मामलों) को लूप और इसी तरह से छोड़ना है। इसे बेहतर बनाने के लिए, मैं बेहतर स्कैला अबास्ट्रक्शन के साथ प्रयोग करना और डिजाइन करना चाहता हूं, फिर भी जेआईटी के साथ अच्छी तरह से काम करें, और ऐसा करने के लिए, एक अच्छा जेआईटी डायग्नोस्टिक टूल उपयोगी है। –

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