2009-06-11 11 views
40

एक प्रोग्रामर "पता 1a234552 पर java.lang.Object" की तरह लग रही के रूप में मैं इन के बारे में सोच के रूप में याजावा में ऑब्जेक्ट संदर्भ कितना बड़ा है और इसमें क्या जानकारी है?

में s की तरह कुछ के लिए समान
Object s = "hello"; 

यह सही है? इसलिए सभी संदर्भ एक निश्चित आकार हैं?

उत्तर

9

यह JLS या JVM युक्ति का हिस्सा नहीं है, लेकिन व्यवहार में यह एक पता यह होगा: 32 पर बिट 32 बिट सीपीयू, 64 64.

pqism पर: ठीक है, तुम मिल गया क्योंकि संकलन के बाद हम अब घोषित प्रकार की परवाह नहीं करते हैं?

हमें परवाह है। यही कारण है कि कक्षा वस्तुओं वहाँ हैं। असल में, अन्य उत्तरों से आप देख सकते हैं कि हम रनटाइम में प्रकारों के बारे में परवाह करते हैं ताकि हम प्रकार के तरीके को संदर्भ में रखकर उनके साथ काम करने के तरीके को अनुकूलित कर सकें।

+1

32 बिट्स बहुत अधिक प्रतीत नहीं होते हैं यदि इसमें प्रकार की जानकारी शामिल है? –

+2

@pqism - संदर्भ स्वयं वास्तविक वस्तु के लिए सिर्फ एक सूचक है।प्रकार की जानकारी शेष ऑब्जेक्ट डेटा के साथ संग्रहीत की जाएगी। शायद एक बेहतर सवाल होगा "जावा वस्तु के लिए न्यूनतम आकार क्या है, और इसमें क्या शामिल है?" –

+0

ठीक है, क्योंकि संकलन के बाद हम अब घोषित प्रकार की परवाह नहीं करते हैं? तो यह वास्तव में सिर्फ "उस पते पर कुछ" है। –

52

कई वीएम पर संदर्भ के आकार देशी सूचक आकार (यानी 32 बिट जेवीएम के लिए 32 बिट्स और 64 बिट्स के लिए 64 बिट्स) के लिए 32 बिट्स हैं, इसकी गारंटी नहीं है - और विशेष रूप से हॉटस्पॉट या तो अब करता है या जल्द ही समर्थन "Compressed Oops" जो 64 बिट JVM में 32 बिट संदर्भ हैं। (इसका मतलब यह नहीं है कि प्रत्येक संदर्भ संपीड़ित है - अधिक जानकारी के लिए लिंक किए गए आलेख को पढ़ें, और इसके बारे में बहुत सारे ब्लॉग पोस्ट भी हैं।)

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

ऑब्जेक्ट में केवल प्रकार की जानकारी होती है (शायद Class के उदाहरण के संदर्भ में, या कुछ समान - मुझे पर्याप्त विवरण में नहीं पता) साथ ही अन्य ऑब्जेक्ट के लिए उपयोगकर्ता डेटा प्राप्त करने से पहले, हेडर में आवश्यक "सामान"।

+2

अज़ुल कुछ प्रकार की जानकारी ओओपी में डालता है। आईआईआरसी, 48 बिट्स का उपयोग पते के लिए किया जाता है और 16 प्रकार की जानकारी के लिए (मैं वहां थोड़ा सा हो सकता हूं, खासकर यदि 48 के निचले हिस्से में कुछ बिट्स हमेशा शून्य होते हैं)। मेरा मानना ​​है कि यह रेखांकित, गैर-मेगामोर्फिक वर्चुअल विधि कॉल के लिए त्वरित जांच की अनुमति देता है। –

+0

कूल - अपडेट करेगा। –

+0

अन्य स्मृति क्या संग्रहीत है? उदाहरण के लिए: ऑब्जेक्ट टाइप, कास्टिंग जानकारी, पॉलिमॉर्फिक जानकारी इत्यादि। यह नहीं पता कि यह ऑब्जेक्ट "हेडर" में संग्रहीत है या नहीं, लेकिन क्या आपको पता है कि किसी ऑब्जेक्ट से इसके संदर्भों को और क्या संग्रहीत किया जाता है? – santiagobasulto

2

अधिकांश लोग किसी ऑब्जेक्ट का संदर्भ सी-भाषा-जैसी-मेमोरी-पॉइंटर के रूप में देखते हैं। हालांकि यह तकनीकी रूप से सही नहीं है, अधिकांश कार्यान्वयन इसे एक सूचक के रूप में लागू करते हैं। उदाहरण के लिए संपीड़ित ऑब्जेक्ट पॉइंटर्स के मामले में, JVM स्टोर 64 बिट प्लेटफ़ॉर्म पर 64-बिट पॉइंटर के केवल 3 से 34 बिट्स करता है। अन्य कार्यान्वयन भी एक अलग योजना का उपयोग करना चुन सकते हैं: संदर्भ सभी ऑब्जेक्ट्स वाले पॉइंटर सरणी में एक सूचकांक हो सकता है।

+0

क्या आप यह कहना चाहते हैं कि जेएलएस ** ऑब्जेक्ट संदर्भों को संग्रहीत करने के अन्य तरीकों को अस्वीकार नहीं करता है (सी-भाषा-जैसी-स्मृति-सूचक मार्ग के अलावा)? – Pacerier

2

ऑब्जेक्ट संदर्भ का आकार JVM और मशीन आर्किटेक्चर पर निर्भर करता है। आम तौर पर, 32-बिट मशीन पर यह 32 बिट्स और 64-बिट मशीन पर 64 बिट्स होती है। हालांकि, मुझे लगता है कि ओपनजेडीके 7 जेवीएम को "संपीड़ित पॉइंटर्स" के लिए समर्थन मिलेगा जो 64-बिट मशीनों पर कुछ कमरे बचाएगा।

ऑब्जेक्ट के प्रकार के बारे में जानकारी ऑब्जेक्ट में ही संग्रहीत की जाती है; यानी, यदि आप ऑब्जेक्ट में 32-बिट या 64-बिट पॉइंटर (या अधिक संभावना है, हैंडल) का पालन करते हैं, तो आपको Class उदाहरण के लिए एक और पॉइंटर मिलेगा जो कि प्रकार का वर्णन करता है, साथ ही ऑब्जेक्ट के डेटा फ़ील्ड ।

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