2012-04-10 33 views
12

मैं हाल ही में इस दिलचस्प शब्द में आया और नेट के बारे में और जानने के लिए नेट पर खोज की। हालांकि मुझे मिली जानकारी स्केची है। क्या कोई पीएल हो सकता है मुझे कुछ हद तक विस्तृत स्पष्टीकरण दें कि यह क्या है और यह क्यों उपयोगी है?जावा: जेआईटीसी की प्रतिबिंब मुद्रास्फीति क्या है?

मुझे मिली जानकारी से, ऐसा लगता है कि यह तंत्र बहुत गतिशील कक्षाओं और होगिंग परम जेन मेमोरी क्षेत्र बनाने की कीमत पर प्रतिबिंबित विधि निष्पादन को तेज बनाता है, लेकिन मुझे इसके बारे में निश्चित नहीं है।

उत्तर

13

क्या कुछ स्रोत कोड खोदने और इसे समझने के लिए कोडिंग करते थे, और यहां मैंने जो पाया है:

जावा की 'विधि' कक्षा में 'मेथडएक्सेसर' प्रकार का एक सदस्य चर 'विधि प्राप्तकर्ता' है जो विधि के आह्वान के समान एक विधि 'invoke' वाला इंटरफ़ेस है। विधियों के अनुरोध के लिए विधियों का आह्वान किया गया है।

यदि मुद्रास्फीति सक्षम है (कोई इन्फ्लूएंशन गलत है) यह एक्सेसर एक कार्यान्वयन को इंगित करता है जो इस जावा विधि को चलाने के लिए जेएनआई का उपयोग करता है (मुझे लगता है कि एपीआई का उपयोग GetObjectClass, GetMethodID और कॉल * विधि) का उपयोग करना है। यह द्वंद्व प्रेषण की तरह है, और जेएनआई के साथ निष्पादन इस और अन्य कारणों से धीमा है। (What makes JNI calls slow?)

प्रतिबिंब के माध्यम से एक विधि के 15 फांसी के बाद ('15' डिफ़ॉल्ट है और बदला जा सकता है) और noInflation झूठी साथ, JNI आधारित एक्सेसर एक वर्ग मक्खी पर (नाम गतिशील रूप से उत्पन्न होता है, उदाहरण के लिए बनाता है 'GeneratedMethodAccessor1' कहें) जिसमें आवेषण विधि भी है। अब, इस 'invoke' विधि के भीतर, यह अपने संबंधित वर्ग में पहला 'obj' तर्क डालता है, और फिर उस पर लक्षित विधि को कॉल करता है। इसके बाद यह इस वर्ग का एक उदाहरण बनाता है, और विधि को बदलता है एक्सेसर सेटिंग्स जैसे कि विधि के हर निष्पादन को जेएनआई एक्सेसर के बजाय इस उदाहरण में सौंप दिया गया है। इसे मुद्रास्फीति कहा जाता है।

क्योंकि यह उदाहरण जावा क्लास का है जो जावा ऑब्जेक्ट को प्रतिनिधि करता है, प्रतिनिधिमंडल अब एक सामान्य जावा प्रतिनिधिमंडल है। यह कभी भी जेएनआई नहीं जाता है और इसलिए उस ओवरहेड को बचाता है, साथ ही जेआईटीसी उस पर अन्य अनुकूलन भी कर सकता है जिसके कारण यह कुशल हो जाता है।

नकारात्मकता यह है कि, यदि इस तरह से कई तरीकों से फुलाया जाता है, तो उनके वर्ग परमिट स्थान पर कब्जा होता है और संभवतः स्मृति त्रुटि से बाहर हो सकता है।

जानकारी के लिए, देखें:

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/sun/reflect/ReflectionFactory.java

http://java.sun.com/docs/books/jni/html/fldmeth.html

http://anshuiitk.blogspot.com/2010/11/excessive-full-garbage-collection.html

+0

बहुत अच्छा स्पष्टीकरण, धन्यवाद – ozhan

+0

@Ozhan Duz खुशी है कि आप इसे पसंद करते हैं। धन्यवाद। – shrini1000

1
नहीं

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

+0

हां, मैंने इसे भी पढ़ा है, लेकिन कुछ और विवरण चाहते हैं।कुछ ऐसा प्रतिबिंब एक्सेसर कहा जाता है जिसका उपयोग करने के लिए किया जाता है, लेकिन फिर से, बिल्कुल सुनिश्चित नहीं है कि कैसे। – shrini1000

+0

यहां एक ब्लॉग प्रविष्टि मिली: http://buzdin.blogspot.com/2011/01/is-java-reflection-really-slow.html मूल रूप से, सर्वर वीएम में, यदि एक कॉल साइट 15 से अधिक बार बुलाया जाता है प्रतिबिंब, हॉटस्पॉट इसे प्रत्यक्ष विधि कॉल का उपयोग करने के लिए अनुकूलित करेगा। बीटीडब्ल्यू, आकाश, कोई जेएनआई शामिल नहीं है, यह सिर्फ नियमित हॉटस्पॉट अनुकूलन है। – Bill

2

Java InflationJava Reflection API के माध्यम से किया विधि कॉल का अनुकूलन है। यह infrequent सस्ता कॉल करने के लिए विधि कॉल करता है, तत्काल उपलब्ध है लेकिन धीमी Java Native Interface और frequent विधि तेज लेकिन महंगा, रनटाइम generated method accessor पर कॉल करता है।

+0

मेरा [स्पष्ट और संक्षेप] पर ध्यान दें (http://sites.ieee.org/pcs/communication-resources-for-engineers/style/write-clearly-and-concisely/) परिभाषा। –

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