जेवीएम कैश जेआईटी संकलित कोड क्यों नहीं है?


107

सन से विहित JVM कार्यान्वयन कोड के कुछ समय चलने के बाद निकट-मूल निष्पादन गति प्राप्त करने के लिए बाईटेकोड पर कुछ बहुत परिष्कृत अनुकूलन लागू करता है।

सवाल यह है कि इस संकलित कोड को उसी फ़ंक्शन / वर्ग के बाद के उपयोग के दौरान डिस्क के लिए कैश नहीं किया गया है?

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


4
एक धागा इस समस्या पर चर्चा: javalobby.org/forums/thread.jspa?threadID=15812
Miku

2
लेकिन एक निश्चित जवाब को आकर्षित करने के लिए एक अप्रत्याशित प्रश्न।

1
मैं एक "महत्वपूर्ण" बूस्ट के बारे में निश्चित नहीं हूं, क्योंकि तब आपको JITted सामान को डिस्क से JITing के बजाय मेमोरी में लोड करना होगा। यह चीजों को गति दे सकता है, लेकिन मामला-दर-मामला आधार पर।
आर। मार्टिनो फर्नांडिस

1
हर किसी के महान जवाब के लिए धन्यवाद! सभी उत्तर समान रूप से मान्य थे, इसलिए मैं इस एक पर समुदाय के साथ चला गया ...
चिन्मय कांची

यह एक अच्छा सवाल है अगर आप मुझसे पूछें :)
अल्फ्रेड

जवाबों:


25

@MYYN द्वारा पोस्ट किए गए लिंक के cut'n'paste का सहारा लिए बिना, मुझे इस पर संदेह है क्योंकि JVM प्रदर्शन करने वाले अनुकूलन डेटा पैटर्न के साथ-साथ कोड पैटर्न के आधार पर स्थिर नहीं हैं, बल्कि गतिशील हैं। यह संभावना है कि ये डेटा पैटर्न अनुप्रयोग के जीवनकाल के दौरान बदल जाएंगे, इष्टतम से कम कैश्ड अनुकूलन का प्रतिपादन करेंगे।

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


6
... या आप सिर्फ एक विकल्प के रूप में दृढ़ता की पेशकश कर सकते हैं , जैसे कि ओरेकल की जेवीएम करता है - उन्नत प्रोग्रामर को अपने आवेदन के प्रदर्शन को अनुकूलित करने के लिए सशक्त बनाता है जब उन्हें पता होता है कि पैटर्न सिर्फ उनकी जिम्मेदारी के तहत नहीं बदल रहे हैं । क्यों नहीं?!
एलेक्स मार्टेली

2
क्योंकि यह शायद इसके लायक नहीं है। यदि न तो SUN, IBM और न ही BEA ने अपने प्रदर्शन JVMs के लिए इसे सार्थक माना, तो इसके लिए एक अच्छा कारण होगा। हो सकता है कि उनका RT ऑप्टिमाइज़ेशन Oracle की तुलना में तेज़ हो, यही वजह है कि Oracle इसे कैश करता है।
skaffman

9
पिछले सत्रों में जो सीखा गया है, उसका उपयोग करने के लिए एक प्रारंभिक बिंदु के रूप में संग्रहीत ऑप्टिमेटेशन क्यों नहीं ले रहे हैं? वहां से जेआईटी सामान्‍य री-ऑप्टिमाइज सामान की तरह काम कर सकता था। शट-डाउन करने पर, उस कोड को फिर से जारी रखा जा सकता है और अगले रन में एक नए शुरुआती बिंदु के रूप में उपयोग किया जा सकता है।
puce

1
@ केवल कारण मैं सोच सकता हूं कि AFAIK आपको अनुकूलित कोड चलाने से कोई रूपरेखा आँकड़े नहीं मिलते हैं। तो आपके पास सुधार करने का कोई तरीका नहीं होगा ...
maaartinus

1
मैं व्यक्तिगत रूप से सभी चेतावनियों के साथ "रन के बीच जेआईटी प्रोफाइलिंग जानकारी को जारी रखता हूं" के साथ व्यक्तिगत रूप से ठीक होगा कि "यह केवल उसी जेवीएम, समान डेटा आदि के साथ मान्य होगा और अन्यथा अनदेखा किया जाएगा"। इसे क्यों लागू नहीं किया गया है, इस संबंध में, मैं उम्मीद करूंगा कि जेआईटी के बीज डेटा को बनाए रखने और इसे वैध बनाने की अतिरिक्त जटिलता अन्य परियोजनाओं से संसाधन लेने के लिए बहुत अधिक थी। इस और जावा 8 lambda + धाराओं के बीच चुनाव को देखते हुए मैं बाद में होगा।
थोरबजोरन रावन एंडरसन

25

ओरेकल का JVM वास्तव में ऐसा करने के लिए प्रलेखित है - ओरेकल के हवाले से,

कंपाइलर Oracle JVM के क्लास रिज़ॉल्यूशन मॉडल का लाभ उठा सकता है, डेटाबेस कॉल, सेशन या इंस्टेंस पर संकलित जावा विधियों को वैकल्पिक रूप से बनाए रखने के लिए। इस तरह की दृढ़ता सत्रों या उदाहरणों में अनावश्यक पुनर्नवीनीकरण के ओवरहेड से बचती है, जब यह ज्ञात होता है कि शब्दार्थतः जावा कोड नहीं बदला गया है।

मुझे नहीं पता कि सभी परिष्कृत वीएम कार्यान्वयन समान विकल्पों की पेशकश क्यों नहीं करते हैं।


8
क्योंकि अन्य परिष्कृत जेवीएम में सामान रखने के लिए एक बढ़िया उद्यम आरडीबीएमएस नहीं है :)
स्केफमैन

वाह! इसका मतलब है कि संकलन कई बार कैश किया जाता है। यह अच्छी खबर है!
संदीप जिंदल

आईबीएम का J9 भी ऐसा करने के लिए प्रलेखित है।
user314104

9
ध्यान दें कि यह ओरेकल जेवीएम ओरेकल डेटाबेस के अंदर है, न कि डाउनलोड ओरेकल को सन खरीदते समय मिला।
Thorbjørn Ravn Andersen

14

मौजूदा उत्तरों के लिए अपडेट किया गया - जावा 8 में इसे हल करने के लिए समर्पित JEP है:

=> JEP 145: कैश संकलित कोडनया लिंक

उच्च स्तर पर, इसका घोषित लक्ष्य है :

बड़े जावा अनुप्रयोगों के स्टार्टअप समय को बेहतर बनाने के लिए पिछले रनों से संकलित मूल कोड को सहेजें और पुनः उपयोग करें।

उम्मीद है की यह मदद करेगा।


3
सुविधा ने इसे अंतिम रिलीज़ के लिए नहीं बनाया है ।
अस्वस्थ

5

एक्सेलसियर जेईटी में संस्करण 2.0 के बाद से कैशिंग जेआईटी कंपाइलर है, जो 2001 में वापस जारी किया गया था। इसके अलावा, इसके एओटी संकलक सभी अनुकूलन का उपयोग करके कैश को एक एकल DLL / साझा ऑब्जेक्ट में फिर से जोड़ सकते हैं।


3
हां, लेकिन सवाल कैनोनिकल जेवीएम यानी सन जेवीएम के बारे में था। मुझे अच्छी तरह पता है कि जावा के साथ-साथ अन्य कैशिंग जेवीएम के लिए कई एओटी कंपाइलर हैं।
चिन्मय कांची

0

मैं वास्तविक कारणों को नहीं जानता, जेवीएम कार्यान्वयन में किसी भी तरह से शामिल नहीं होना, लेकिन मैं कुछ प्रशंसनीय विचार कर सकता हूं:

  • जावा का विचार एक लिखने-एक बार चलने वाली भाषा कहीं भी होने का है, और प्रीफ़्लेक्स्ड सामान को क्लास फ़ाइल में डालना एक तरह से उल्लंघन करना है (केवल "तरह का" क्योंकि वास्तविक बाइट कोड अभी भी होगा)
  • यह क्लास फाइल साइज़ को बढ़ाएगा क्योंकि आपके पास एक ही कोड कई बार होगा, खासकर यदि आप एक ही प्रोग्राम को कई अलग-अलग JVM के तहत चलाते हैं (जो कि वास्तव में असामान्य नहीं है, जब आप विभिन्न संस्करणों को अलग-अलग JVM मानते हैं, जो आप वास्तव में करना है)
  • कक्षा की फाइलें खुद को लिखने योग्य नहीं हो सकती हैं (हालांकि इसके लिए जांच करना बहुत आसान होगा)
  • JVM अनुकूलन आंशिक रूप से रन-टाइम जानकारी पर आधारित हैं और अन्य रनों पर वे लागू नहीं हो सकते हैं (हालांकि उन्हें अभी भी कुछ लाभ प्रदान करना चाहिए)

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

मेरा पसंदीदा तरीका वास्तव में एक अलग बायोटेक-टू-देशी अनुवादक होना होगा जिसका उपयोग आप कुछ इस तरह से पहले से स्पष्ट रूप से कर सकते हैं, एक विशिष्ट वीएम के लिए स्पष्ट रूप से एक विशिष्ट वीएम के लिए बनाई गई वर्ग फाइलें बना सकते हैं, जिसमें संभवत: उनमें मूल बायोटेक भी है। विभिन्न VMs के साथ भी चला सकते हैं। लेकिन यह शायद मेरे अनुभव से आता है: मैं ज्यादातर जावा एमई कर रहा हूं, जहां यह वास्तव में दर्द होता है कि जावा कंपाइलर संकलन के बारे में अधिक स्मार्ट नहीं है।


1
इस तरह की चीजों के लिए क्लासफाइल में एक जगह होती है, जो कि मूल इरादे की थी (क्लासफाइल में एक विशेषता के रूप में JIT'ed कोड को स्टोर करें)।
टोफूबीर

@ टोफूबीर: पुष्टि के लिए धन्यवाद। मुझे संदेह था कि ऐसा हो सकता है (यही मैंने किया होगा), लेकिन निश्चित नहीं था। संभव कारण के रूप में इसे हटाने का संपादन किया।
जाकोक्को

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

1
स्पष्ट बाइटकोड-टू-देशी कम्पाइलर के बारे में अंतिम पैराग्राफ है जो वर्तमान में आपके पास .NET में NGEN ( msdn.microsoft.com/en-us/library/6t9t5wcf(VS.71).aspx ) के साथ है।
आर। मार्टिनो फर्नांडीस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.