2013-01-10 12 views
6

संभव डुप्लिकेट जावा में स्मृति में प्रतिनिधित्व किया है:
What exactly is null in Java memoryकैसे अशक्त

किसी को भी कैसे एक शून्य मान एक वस्तु या कुछ भी के लिए स्मृति में प्रतिनिधित्व किया है पता है। डॉट नेट में यह शून्य संकेतक बूलियन मान और इसी प्रकार के मान (Refer here) द्वारा दर्शाया गया है। तो क्या कोई जानता है कि यह जावा में कैसे किया जाता है ??

+2

सवाल आप के लिए भेजा कुछ भ्रामक है - स्वीकार किए जाते हैं जवाब सब के बारे में 'Nullable ', रिक्त नहीं * संदर्भ * है। –

+0

इस प्रश्न के स्वीकृत उत्तर की जांच करें। आपको यह समझने में मदद मिलेगी कि wt java में शून्य है। Http://stackoverflow.com/questions/2707322/what-is-null-in-java –

उत्तर

9
JVM specification, section 2.4 से

:

जावा आभासी मशीन विनिर्देश एक ठोस मूल्य एन्कोडिंग अशक्त जनादेश नहीं है।

तो यह कुछ भी हो सकता है, लेकिन यह बहुत एक संदर्भ मूल्य है जो सभी शून्यों है होने की संभावना है। संदर्भ खुद सरल पॉइंटर्स हो सकते हैं (यानी आर्किटेक्चर के लिए उचित आकार के मूल सूचक के रूप में एक वर्चुअल एड्रेस), लेकिन फिर भी ऐसा नहीं होना चाहिए। कुछ JVMs में संदर्भों को संभालने के बहुत ही स्मार्ट तरीके हैं - उदाहरण के लिए, हॉटस्पॉट able to use 32-bit values for references in many situations, even when running in an x64 process है।

+0

"जावा आभासी मशीन विनिर्देश एक ठोस मूल्य एन्कोडिंग शून्य को जरूरी नहीं है।" <- हम्म, इस मामले में, यह {de,} serializable कैसे है? – fge

+2

@fge: यह * इन-मेमोरी * प्रतिनिधित्व है, जो धारावाहिक से पूरी तरह से अलग है। –

1

सटीक प्रतिनिधित्व निर्दिष्ट नहीं है, लेकिन मुझे लगता है कि यह केवल 0x0 है जैसे यह अन्य सी भाषाओं की तरह है। यह एक विशेष मूल्य है जो अन्यथा नहीं हो सकता है, अतिरिक्त क्षेत्र या जानकारी का अतिरिक्त टुकड़ा नहीं।

नोट: जब आपके पास String है तो यह संदर्भ ऑब्जेक्ट नहीं है। यह 4-बाइट मान किसी ऑब्जेक्ट को संदर्भित कर सकता है या null के मामले में एक मान है जो मान्य ऑब्जेक्ट नहीं है।

बीटीडब्लू: अधिकांश 64-बिट जेवीएम 32-बिट संदर्भों का उपयोग करते हैं जब तक कि ढेर 32 जीबी या अधिक न हो। यह ओपनजेडीके जेवीएम में संभव है क्योंकि सभी ऑब्जेक्ट्स 8 बाइट (या 16 बाइट) गठबंधन हैं। चूंकि निचले 3 या 4 बिट हमेशा 0 होते हैं, इसलिए उन्हें विशिष्ट 4 जीबी रेंज 8x या 16x तक पता श्रेणी को विस्तारित करने की आवश्यकता नहीं होती है।

+0

@HannesHertach मैंने एक स्पष्टीकरण जोड़ा है 32 बिट संदर्भ के साथ 32 जीबी एड्रेसेबल क्यों है। –

1

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

जब आप की तरह कुछ कार्य करें:

स्ट्रिंग str = बातिल;

आवंटित एकमात्र चीज एक स्ट्रिंग का संदर्भ है (यह उन भाषाओं में स्ट्रिंग-पॉइंटर के समान है जिसमें पॉइंटर-प्रकार होते हैं)। यह संदर्भ 32 या 64 बिट चर (आपके हार्डवेयर आर्किटेक्चर और जावा संस्करण के आधार पर) है जो स्टैक पर रहता है (शायद, सटीक संदर्भ के आधार पर जिसमें आपकी घोषणा दी गई है)।

+0

और आपके गर्भधारण में संदर्भ क्या है? बस अमूर्त संख्या? – Andremoniy

1

सिद्धांत रूप में यह एक जेवीएम रहस्य है, व्यावहारिक रूप से यह 32-बिन वीएम पर 0 (0x00000000) है। यदि आप ओरेकल जेवीएम का उपयोग करते हैं तो आप sun.misc.Unsafe का उपयोग कर सकते हैं, जो किसी भी पते पर मेमोरी सामग्री को सत्यापित करने के लिए पढ़ सकता है।

public class Test { 
    int i1 = 100; 
    String s = null; 
    int i2 = 200; 

    public static void main(String[] args) throws Exception { 
     Test test = new Test(); 
     System.out.println(getInt(test, "i1")); 
     System.out.println(getInt(test, "s")); 
     System.out.println(getInt(test, "i2")); 
    } 

    static int getInt(Test test, String name) throws Exception { 
     Unsafe u = getUnsafe(); 
     long offset = u.objectFieldOffset(Test.class.getDeclaredField(name)); 
     return u.getInt(test, offset); 
    } 

    static Unsafe getUnsafe() throws Exception { 
     Field f = Unsafe.class.getDeclaredField("theUnsafe"); 
     f.setAccessible(true); 
     return (Unsafe) f.get(null); 
    } 
} 

उत्पादन

100 
0 
200 
+0

यह केवल यह साबित करता है कि int के रूप में एक शून्य संदर्भ पढ़ने की कोशिश करते समय 'असुरक्षित' (अंततः) शून्य लौटाता है। और getInt के दस्तावेज के उस टुकड़े पर भी विचार करें "... हालांकि, परिणाम अपरिभाषित हैं यदि वह चर इस विधि द्वारा लौटाए गए प्रकार के तथ्य में नहीं है ..." –

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