2016-08-02 10 views
24

java -XX:+PrintFlagsFinal का उपयोग करके मुझे TieredCompilation ध्वज मिला, और मैंने इसे थोड़ा सा ऑनलाइन पढ़ा।वास्तव में क्या करता है -XX: -TieredCompilation करते हैं?

फिर भी, मुझे अभी भी बिल्कुल पता नहीं है जब इसे false पर सेट करते समय क्या होता है।

मुझे पता है कि संकलन प्रणाली 5 निष्पादन स्तरों का समर्थन करता है, मूल रूप से दुभाषिया में splitted, C1 और C2:

  • स्तर 0 - दुभाषिया
  • स्तर 1 - सी 1 पूर्ण अनुकूलन के साथ (कोई रूपरेखा)
  • स्तर 2 - मंगलाचरण और backedge काउंटरों
  • स्तर 3 के साथ C1 - सी 1 पूर्ण रूपरेखा (स्तर 2 + एमडीओ)
  • स्तर के साथ 4 - सी 2

स्रोत: http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/2b2511bd3cc8/src/share/vm/runtime/advancedThresholdPolicy.hpp#l34

दो सवाल:

(1) -XX:-TieredCompilation की स्थापना करके, इस स्तरों में से कुछ हैं बस अक्षम? यदि हां, कौन सा?

(2) क्या यह तय करने के लिए कुछ ध्वज है कि सी 1 या सी 2 को अक्षम करना है या बिल्कुल संकलित नहीं करना है?

उत्तर

24

-XX:-TieredCompilation के साथ मध्यवर्ती संकलन स्तरों (1, 2 अक्षम करता है, 3), ताकि अधिकतम विधि को अधिकतम अनुकूलन स्तर (सी 2) पर व्याख्या या संकलित किया जा सके।

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

  • कम संकलक धागे होंगे;
  • सरल संकलन नीति (विधि आमंत्रण और बैकेज काउंटर पर आधारित) advanced compilation policy के बजाय चुना जाएगा;
  • डिफ़ॉल्ट आरक्षित कोड कैश आकार 5 times smaller होगा।

सी 2 कंपाइलर को अक्षम करने के लिए और केवल अतिरिक्त सीहेड के साथ सी 1 छोड़ने के लिए, -XX:TieredStopAtLevel=1 सेट करें।

सभी जेआईटी कंपाइलर्स को अक्षम करने और दुभाषिया में सब कुछ चलाने के लिए, -Xint का उपयोग करें।

+0

धन्यवाद! अब मैं थोड़ा उलझन में हूं, क्योंकि मेरे पास अलग-अलग उत्तर हैं: '-XX: -TieredCompilation'' को सेट करना होगा (1.) सी 1 को अक्षम करें और हमेशा अधिकतम (सी 2) या (2.) को संकलित करें, JVM को हेरिस्टिक रूप से तय करने के लिए नेतृत्व करें कौन सी संकलन सीपीयू के आधार पर अक्षम करने के लिए स्तर (जैसा कि @AlBlue द्वारा बताया गया है)? यह मेरे लिए निर्णय लेने में भी मुश्किल बनाता है, जो सही उत्तर के रूप में स्वीकार करना है: पी –

+0

@ मार्कसवेनिंगर मैंने अलब्लू के जवाब के तहत टिप्पणी की है। यह बहुत सटीक नहीं है। – apangin

+0

धन्यवाद, मैंने अभी इसे देखा है। दूसरी टिप्पणी में आप 'TierXCompileTreshold' और' -XX: CompilationPolicyChoice = 2' का उल्लेख करते हैं, दो नई चीजें जिन्हें मैं अभी भी नहीं जानता, लेकिन मैं उनके बारे में पढ़ूंगा। : पी लेकिन पहली टिप्पणी मेरे प्रश्न को बहुत अच्छी तरह बताती है। –

10

जैसा कि आपने देखा है (जेआईटी नहीं चल रहा है) के रूप में जेआईटी के विभिन्न स्तर हैं।

जावा के पुराने संस्करणों में, आप (जैसे -Xint, -client, -server) बस दुभाषिया के साथ, चलाने के लिए पहली बार में उनका चयन करने के लिए इस्तेमाल किया सिर्फ ग्राहक (C1) संकलक, या बस सर्वर (C2) संकलक के साथ ।

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

$ java -XX:+PrintFlagsFinal -version | grep CompileThreshold 
intx Tier2CompileThreshold      = 0 
intx Tier3CompileThreshold      = 2000 
intx Tier4CompileThreshold      = 15000 
openjdk version "1.8.0_92" 
OpenJDK Runtime Environment (Zulu 8.15.0.1-macosx) (build 1.8.0_92-b15) 
OpenJDK 64-Bit Server VM (Zulu 8.15.0.1-macosx) (build 25.92-b15, mixed mode) 

चल -XX:-TieredCompilation अनिवार्य रूप से TieredCompilation=false जिसका मतलब है कि इस संक्रमण नहीं करते है द्वारा विभिन्न स्तरों को देख सकते हैं, और आप सामने है कि क्लाइंट या सर्वर संकलक उपयोग करने के लिए चयन करने के लिए की है। JVM स्वस्थ रूप से निर्णय लेता है कि आपके सीपीयू के आधार पर कौन सा मोड लागू करना है; यदि आपके पास एकाधिक प्रोसेसर या 64-बिट वीएम हैं तो यह एक सर्वर वीएम (सी 2) का उपयोग करेगा, अन्यथा यह क्लाइंट वीएम (सी 1) का उपयोग करेगा।

तो -Xint सिर्फ दुभाषिया के साथ चलेंगे (यानी कोई संकलक) और आप या तो केवल C1 या -client या -server क्रमशः के साथ सी 2 का चयन कर सकते -XX:-TieredCompilation

+1

धन्यवाद, '-Xint', '-client' और' -erver' मैं झंडे थे जिन्हें मैं ढूंढ रहा था। –

+1

मैंने https://speakerdeck.com/alblue/hotspot-under-the-hood में संकलन स्तर के बारे में थोड़ा सा बात की है यदि आप खरगोश छेद को गहराई से जाना चाहते हैं :) – AlBlue

+0

धन्यवाद, मैं इसे देख लूंगा ! :) –

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