2013-05-04 5 views
15

मैं JVM bytecode instructions देख रहा था और यह देखकर आश्चर्यचकित हुआ कि कक्षाओं (जैसे कास्टिंग, new इत्यादि) के बीच सभी इंटरैक्शन अन्य कक्षाओं की पहचान के लिए निरंतर पूल लुकअप पर भरोसा करते हैं।कक्षा-वर्ग इंटरैक्शन पर जेवीएम बाइटकोड सीमाएं

क्या मैं यह कहने में सही हूं कि इसका मतलब है कि एक वर्ग 64k से अधिक लोगों के अस्तित्व के बारे में नहीं जान सकता है, क्योंकि उन्हें संदर्भित करना असंभव है? अगर किसी को उन लोगों को संदर्भित करने की आवश्यकता होती है, तो किसी को क्या करना चाहिए - कई वर्गों में काम का प्रतिनिधित्व करें जिनमें से प्रत्येक का अपना < 64k इंटरैक्शन हो सकता है?

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

उत्तर

5

हूँ मैं निष्कर्ष निकालते मतलब है कि यह है कि एक वर्ग के बारे में पता नहीं कर सकते में सही कर 64k से अधिक दूसरों का अस्तित्व, क्योंकि उन्हें संदर्भित करना असंभव है?

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

अगर किसी को संदर्भित करने की आवश्यकता होती है, तो किसी को क्या करना चाहिए - कई वर्गों में काम का प्रतिनिधित्व करें जिनमें से प्रत्येक का अपना < 64k इंटरैक्शन हो सकता है?

मुझे ऐसा लगता है।

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

+0

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

+1

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

+0

और यह एक वर्ग में हजारों विधियों को उत्पन्न करने के लिए लागू होता है। लेकिन किसी भी तरह से, यहां सभी प्रकार के "समयपूर्व अनुकूलन" मुद्दे हैं; जैसे विभिन्न आदिम प्रकारों के लिए विभिन्न संस्करणों को उत्पन्न/उपयोग करने का निर्णय। क्या यह वास्तव में परेशानी के लायक होने के लिए पर्याप्त अंतर लाने जा रहा है? और क्या आपको वास्तव में इन चीजों में से कई उत्पन्न करने की आवश्यकता होगी? –

1

ऐसा लगता है कि आपकी समस्या invokedynamic के माध्यम से हल की जा सकती है। यह मूल रूप से जेवीएम पर गतिशील भाषाओं के कार्यान्वयन को कम करने के लिए डिज़ाइन किए गए प्रतिबिंब का एक तेज़ रूप है।

यदि आपको वास्तव में हजारों स्वचालित रूप से जेनरेट की गई कक्षाओं से निपटना है, तो शायद आप इसे सभी को स्थिर रूप से लिंक नहीं करना चाहते हैं। बस invokedynamic का उपयोग करें। यह आपको कुछ कोड पीढ़ी को रनटाइम में स्थगित करने का लाभ भी प्रदान करता है।

ध्यान दें कि आपको कक्षा द्वारा बुलाए गए हर गतिशील विधि के लिए अभी भी एक स्थिर पूल प्रविष्टि की आवश्यकता है, लेकिन अब आपको वास्तविक वर्ग और विधियों को संदर्भित करने की आवश्यकता नहीं है। वास्तव में, आप उन्हें मांग पर बना सकते हैं।

+0

क्या 'invokedynamic' केवल आपके लिए काम नहीं करता है? –

+0

मैंने सुना है कि आप अपने आप पर 'invokedynamic' हैं, बाल आपके कीबोर्ड पर बढ़ता है। – yshavit

+0

@Rex, नहीं, आप इसके साथ किसी भी विधि को कॉल कर सकते हैं। वास्तव में, आप ऑटोबॉक्सिंग और करीइंग के लिए रैपर भी लगा सकते हैं। यह एक संबंधित 'java.lang.invoke.CallSite' उदाहरण को कॉल करके काम करता है जिसे पहली बार बूटस्ट्रैप विधि के माध्यम से निर्देश निष्पादित किया जाता है। तो यह मूल रूप से पारंपरिक प्रतिबिंब की तुलना में कम ओवरहेड के साथ एक फ़ंक्शन पॉइंटर है। – Antimony

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