2016-02-24 8 views
19

मैंने पहले से ही -XX:+PrintCompilation के साथ काम किया है, और मैं जेआईटी-कंपाइलर की मूल तकनीक जानता हूं और जेआईटी-संकलन का उपयोग क्यों किया जाता है।जेवीएम ने एक विधि को जेआईटी-संकलित करने का निर्णय कैसे लिया है (एक विधि को "गर्म" के रूप में वर्गीकृत करें)?

फिर भी मुझे यह पता नहीं चला है कि JVM एक विधि को जेआईटी-संकलित करने का निर्णय लेता है, यानी "जब सही समय एक विधि को जेआईटी-संकलित करता है"।

क्या मैं इस धारणा में सही हूं कि प्रत्येक विधि का अर्थ शुरू होता है, और जब तक इसे "हॉट विधि" के रूप में वर्गीकृत नहीं किया जाता है, तब तक इसे संकलित नहीं किया जाएगा? मेरे पास मेरे सिर के पीछे कुछ है जो मैंने पढ़ा है कि इसे विधि "गर्म" माना जाता है जब इसे कम से कम 10.000 बार निष्पादित किया गया था (विधि 10.000 बार व्याख्या करने के बाद, इसे संकलित किया जाएगा), लेकिन मुझे यह मानना ​​है कि मैं हूं इस बारे में निश्चित नहीं है या जहां मैंने इसे पढ़ा है।

तो मेरे सवाल का योग करने के लिए:

(1) है हर विधि जब तक यह 'हॉट' विधि के रूप में वर्गीकृत नहीं किया गया है (और इसलिए संकलित किया गया है) में व्याख्या या वहाँ तरीकों के लिए कारण हैं संकलित करने के लिए भले ही वे "गर्म" न हों?

(2) JVM कैसे "गैर-गर्म" और "गर्म" विधियों में विधियों को वर्गीकृत करता है? निष्पादन की संख्या? और कुछ?

(3) यदि "हॉट" विधियों के लिए कुछ थ्रेसहोल्ड (जैसे निष्पादन की संख्या) हैं, तो क्या इस थ्रेसहोल्ड को सेट करने के लिए जावा फ्लैग (-XX:...) हैं?

+0

'की -XX उत्पादन पर एक नज़र डालें: + PrintFlagsFinal', वहाँ और JIT संकलक से संबंधित झंडे के बहुत सारे अपने स्तरों, इनलाइनिंग, विधियों आकार, संकलक धागे आदि हैं – the8472

उत्तर

36

हॉटस्पॉट संकलन नीति अपेक्षाकृत जटिल है, खासकर टायर्ड संकलन के लिए, जो कि जावा 8 में डिफ़ॉल्ट रूप से चालू है। यह न तो कई निष्पादन है, न ही CompileThreshold पैरामीटर का मामला है।

सबसे अच्छा स्पष्टीकरण (जाहिर है, केवल उचित स्पष्टीकरण) हॉटस्पॉट स्रोतों में पाया जा सकता है, advancedThresholdPolicy.hpp देखें।

मैं इस उन्नत संकलन नीति का मुख्य बिंदु संक्षेप में प्रस्तुत करेंगे:

  • निष्पादन स्तरीय 0 (दुभाषिया) में शुरू होता है।
  • संकलन के लिए मुख्य चलाता हैं
    1. विधि मंगलाचरण काउंटर i;
    2. बैकजेज काउंटर b। पिछड़ा शाखा आमतौर पर कोड में एक लूप को दर्शाती है।
  • हर बार काउंटरों निश्चित आवृत्ति मूल्य (TierXInvokeNotifyFreqLog, TierXBackedgeNotifyFreqLog) तक पहुँचने, एक संकलन नीति वर्तमान में चल रहे विधि के साथ आगे क्या करना है तय करने के लिए कहा जाता है। i, b और C1 और C2 संकलक धागे की वर्तमान लोड के मूल्यों के आधार पर यह करने के लिए

    • जारी रखने दुभाषिया में निष्पादन का फैसला किया जा सकता है;
    • दुभाषिया में प्रोफाइलिंग शुरू करें;
    • चरण 1 पर सी 1 के साथ संकलन विधि पूर्ण प्रोफ़ाइल डेटा के साथ पूर्ण पुन: संकलन के लिए आवश्यक;
    • कोई प्रोफ़ाइल के साथ टायर 2 पर सी 1 के साथ संकलन विधि लेकिन पुन: संकलित करने की संभावना के साथ (असंभव);
    • अंत में कोई प्रोफ़ाइल या काउंटर (भी असंभव) के साथ चरण 1 पर सी 1 के साथ विधि संकलित करें।

    यहां प्रमुख पैरामीटर TierXInvocationThreshold और TierXBackEdgeThreshold हैं। संकलन कतार की लंबाई के आधार पर थ्रेसहोल्ड को किसी दिए गए विधि के लिए गतिशील रूप से समायोजित किया जा सकता है।

  • संकलन कतार फीफो नहीं है, बल्कि प्राथमिकता कतार है।

  • प्रोफ़ाइल डेटा (सीयर 3) के साथ सी 1 संकलित कोड इसी तरह व्यवहार करता है, सिवाय इसके कि अगले स्तर पर स्विच करने के लिए थ्रेसहोल्ड (सी 2, टियर 4) बहुत अधिक हैं। जैसे लगभग 200 आमंत्रणों के बाद एक व्याख्या विधि को टियर 3 पर संकलित किया जा सकता है, जबकि सी 1-संकलित विधि 5000+ आमंत्रण के बाद चरण 4 पर पुनर्मूल्यांकन के अधीन है।

  • विधि विशेष रूप से विधिबद्ध करने के लिए एक विशेष नीति का उपयोग किया जाता है। कॉलर में छोटे तरीकों को रेखांकित किया जा सकता है भले ही वे "गर्म" न हों। थोड़ी बड़ी विधियों को केवल तभी रेखांकित किया जा सकता है जब उन्हें अक्सर बुलाया जाता है (InlineFrequencyRatio, InlineFrequencyCount)।
+0

यह लिंक वास्तव में सहायक है और इसमें वह सब कुछ शामिल है जिसे मैं जानना चाहता था। आप सही हैं, वहां _reasonable_ जानकारी ढूंढना मुश्किल है, अभी तक कुछ भी नहीं पढ़ा है जो अभी तक टियर किए गए संकलन के बारे में विस्तृत है, शायद अधिकतर कभी नहीं। धन्यवाद! –

+2

मेरे लिए मुख्य अंतर्दृष्टि यह है कि सामान्य पथ 0 (व्याख्या) -> 3 (सी 1, पूर्ण प्रोफाइलिंग) -> 4 (सी 2) है। उस पथ पर, सी 1 वास्तव में सी 2 के लिए काम करने के लिए प्रोफाइल डेटा एकत्र करने के लिए मौजूद है। –

+3

फिर तीन मामूली वैकल्पिक पथ हैं। (1) यदि सी 1 संकलन पाता है कि विधि तुच्छ है, तो इसे 1 (सी 1, कोई प्रोफाइलिंग) पर संकलित नहीं किया गया है क्योंकि 4 (सी 2) कोई तेज़ नहीं होगा। (2) यदि सी 2 कंपाइलर व्यस्त है, तो विधि 2 (सी 1, प्रकाश प्रोफाइलिंग) पर संकलित की जाती है जब तक कि सी 2 कम व्यस्त न हो, उस बिंदु पर इसे 3 सी 1, पूर्ण प्रोफाइलिंग पर पुन: संकलित किया जाता है), इसलिए यह 4 तक (C2)। (3) यदि सी 1 व्यस्त है लेकिन सी 2 नहीं है, तो दुभाषिया में प्रोफाइलिंग किया जाता है, इसलिए विधि सी 1 के माध्यम से सीधे सी 2 तक जा सकती है। –

6

इस जावा 8 के लिए -XX:CompileThreshold=10000

हॉटस्पॉट है नियंत्रित करने के लिए मुख्य पैरामीटर अब 4. करने के लिए स्तर 1 से संकलन के चरणों के एक नंबर का उपयोग कर डिफ़ॉल्ट रूप से एक स्तरीय संकलन का उपयोग करता है मेरा मानना ​​है कि 1 कोई अनुकूलन है। स्तर 3 सी 1 (क्लाइंट क्लाइंट के आधार पर) है और लेवल 4 सी 2 (सर्वर कंपाइलर के आधार पर)

इसका मतलब है कि थोड़ा ऑप्टिमाइज़ेशन आपके अपेक्षा से पहले हो सकता है और यह पहुंचने के बाद लंबे समय तक अनुकूलन रख सकता है 10 के थ्रेसहोल्ड। मैंने जो देखा है, वह एक लाख कॉल के बाद स्ट्रिंगबिल्डर को खत्म करने से बचने का विश्लेषण है।

नोट: कई बार एक लूप फिर से कंपाइलर को ट्रिगर कर सकता है। जैसे 10 के समय का एक लूप पर्याप्त हो सकता है।

1) जब तक कोई विधि पर्याप्त गर्म नहीं माना जाता है, तो इसका अर्थ है। हालांकि कुछ JVMs (उदा। Azul Zing) स्टार्ट अप पर विधियों को संकलित कर सकते हैं और आप एक आंतरिक एपीआई के माध्यम से एक विधि संकलित करने के लिए हॉटस्पॉट JVM को मजबूर कर सकते हैं। जावा 9 में एओटी (समय के आगे) कंपाइलर भी हो सकता है लेकिन इसका अभी भी शोध किया जा रहा है AFAIK

2) कॉल की संख्या, या पुनरावृत्तियों की संख्या।

3) हाँ -XX:CompileThreshold= मुख्य एक होने के नाते।

+0

आप आगे सामग्री जहां है मैं इस पर पढ़ सकता था? मुझे सी 1 और सी 2 के बारे में पता है, फिर भी मैंने संकलन स्तर 1-4 (इंटरपेटर, सी 1, सी 2 3 स्तर होंगे) के बारे में नहीं सुना है। और, आप मूल रूप से कहते हैं कि 'कंपाइलर थ्रेसहोल्ड' के नीचे एक विधि को गर्म माना जा सकता है। तब के लिए यह दहलीज क्या है? क्या मुझे उम्मीद है कि एक विधि को नवीनतम _at माना जाता है जब इसे 'कंपाइलर थ्रेसहोल्ड' टाइम्स कहा जाता था? –

+0

फॉलो-अप प्रश्न के लिए खेद है, लेकिन सिर्फ मेरी शब्दावली सही प्राप्त करने के लिए: क्या मैं एक विधि को "गर्म" के रूप में संदर्भित कर सकता हूं यदि इसे कम से कम एक बार अनुकूलित किया गया है, या यह वास्तव में "हॉट विधि" की परिभाषा है? –

+1

@MarkusWeninger यह कुछ ऐसा है जो अद्यतन से अपडेट में बदल जाता है। यदि आप कोड के एक ही सेट को कई बार कॉल करते हैं (लेकिन प्रत्येक बार) आप देख सकते हैं कि वे सभी एक बार संकलित नहीं होते हैं। वास्तविक अहंकार बहुत जटिल है।मुझे लगता है कि अधिक जानकारी के लिए सबसे अच्छी जगह स्रोत है। लिखित कुछ और मौजूदा जेवीएम के लिए पुराना हो सकता है। –

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