2012-04-19 23 views
21

इस विषय पर मैंने कई किताबें/लेख पढ़े हैं, साथ ही साथ 'अनसाफ' का उपयोग करके मैंने लिखा एक छोटा सा प्रोग्राम इंगित करता है कि जावा में 1-डी सरणी हमेशा स्मृति में संगत होती है। तो क्या यह जेएलएस द्वारा निर्धारित है या यह एक कार्यान्वयन सम्मेलन है? इस संकेत की पुष्टि करने के लिए सवाल पूछा जाता है।जावा: स्मृति में 1-डी सरणी हमेशा संगत होती है?

उत्तर

15

नहीं है, JVM विनिर्देश ऐसे किसी भी गारंटी नहीं है: http://docs.oracle.com/javase/specs/jvms/se5.0/html/Concepts.doc.html#16446

व्यवहार में यह शायद मामला है लेकिन आप यह भी शब्द आकार के बारे में कोई गारंटी नहीं है।

असुरक्षित एक मानक जावा वर्ग नहीं है, इसलिए यदि आपके प्रोग्राम इस का उपयोग करता है, तो यह पोर्टेबल वैसे भी

10

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

ध्यान दें कि Unsafe का उपयोग करके बहुत अधिक स्वचालित रूप से इसका अर्थ है कि आप spec के दायरे से बाहर निकल रहे हैं।

कहा जा रहा है कि, मैं यह अनुमान लगाता हूं कि अधिकांश जेवीएम कार्यान्वयन वास्तव में (एक-आयामी) सरणी के लिए एक रैखिक लेआउट का उपयोग करें।

3

को देखते हुए है ... कई JVM के एक आवश्यकता है कि ढेर स्मृति में सतत मैं अपने संभावना नहीं लगता है कि वे स्मृति में विभिन्न स्थानों में प्राइमेटिव्स की 1 डी सरणी रखेंगे।

ऑब्जेक्ट [] द्वारा संदर्भित ऑब्जेक्ट स्मृति में निरंतर होने की संभावना नहीं है और यहां तक ​​कि यदि वे हैं, तो चेतावनी के बिना फिर से व्यवस्थित किया जा सकता है।

नोट: असुरक्षित का उपयोग करके आप int मानों के रूप में संदर्भों को संदर्भित कर सकते हैं यह देखने के लिए कि वे पहले और बाद में जीसी के बाद क्या हैं। कुछ JVMs 64-बिट संदर्भ जो एक लंबे आवश्यकता का उपयोग करें, लेकिन सबसे अधिक 32-BTI संदर्भ (यहां तक ​​कि 64-बिट JVMs के लिए) का उपयोग

+2

सहमत हुए, लेकिन सरणी स्वयं ही संगत होगी, है ना? इस तरह कुछ: 1000-> aa, 1001-> बीबी, 1002-> सीडी इत्यादि – shrini1000

+1

मुझे उम्मीद है कि संदर्भ लगातार संग्रहित किए जाने चाहिए (लेकिन मुझे विश्वास नहीं है कि यह कहीं भी निर्दिष्ट है) यह इस तथ्य के समान है कि स्पेक का कहना नहीं है कि संदर्भ गणना का उपयोग किसी भी जेवीएम में जीसी के लिए नहीं किया जाएगा, लेकिन AFAIK कोई भी नहीं करता है। –

+3

@ shrini1000 यदि ढेर वर्चुअल मेमोरी का एक संगत ब्लॉक नहीं है, तो एक सरणी स्पैनिग दो टुकड़ों में संगत लेआउट नहीं होगा। दूसरी तरफ, ढेर के ढेर का अर्थ यह है कि एरे के बारे में कुछ भी नहीं है, शायद अप्रत्यक्ष रूप से यह अधिक संभावना है क्योंकि जीसी डिजाइन की बाधाएं समान होंगी। –

8

मैं The Java Language Specification, Java SE 8 Edition (JLS) और The Java Virtual Machine Specification, Java SE 8 Edition (JVMS) इसके बारे में क्या कह रहे हैं के साथ इस सवाल को ताज़ा करना चाहते हैं।

हम विकल्प के लिए है इस सवाल का जवाब देने के लिए:

  1. क्या कमी JVM कार्यान्वयन पर लगाया जाता है। यह सबसे विश्वसनीय दृष्टिकोण है क्योंकि किसी भी विनिर्देश के कार्यान्वयन को का स्वाभाविक रूप से मानना ​​है "जो कुछ भी प्रतिबंधित नहीं है उसे अनुमति है" सिद्धांत।
  2. क्या सबसे JVM कार्यान्वयन उचित

मैं विनिर्देश की कमी के बाहर बिंदु होगा सुझाव देते हैं।

अगर हम अध्याय में 10 सरणी की JLS (और सरणियों से संबंधित JLS और JVMs के किसी भी अन्य अध्याय) हम पाते हैं नहीं कर सका स्मृति लेआउट सरणियों करने के लिए लगाए की कमी का कोई उल्लेख है। इस प्रकार यह निश्चित रूप से मतलब है कि सरणी निरंतर नहीं हो सकती है।

इसके अलावा, JLS का कहना है कि सरणियों वस्तुओं हैं:

अध्याय 10 सरणी।

जावा प्रोग्रामिंग भाषा में, सरणियों वस्तुओं (§4.3.1), डायनामिक रूप से तैयार कर रहे हैं, और प्रकार वस्तु का चर को सौंपा जा सकता है (§4.3.2)। कक्षा ऑब्जेक्ट की सभी विधियां किसी सरणी पर आ सकती हैं।
...

4.3.1। वस्तुओं।

एक वस्तु एक वर्ग उदाहरण या एक सरणी है। (और सरणी वस्तु है)

और एक ही समय में JVMs का कहना है कि वस्तुओं और सरणियों ढेर पर जमा हो जाती है:

2.5.3। हीप

जावा वर्चुअल मशीन में एक ही ढेर है जो सभी जावा वर्चुअल मशीन थ्रेड्स के बीच साझा किया जाता है। ढेर रन-टाइम डेटा क्षेत्र है जिसमें से सभी वर्ग के उदाहरणों और सरणी आवंटित किए जाते हैं।

लेकिन JVMs ढेर स्मृति बाध्य नहीं करता निरंतर होने के लिए:

2.5.3। हीप

... ढेर के लिए स्मृति निरंतर होने की आवश्यकता नहीं है।

के रूप में सभी सरणियों ढेर और ढेर में जमा हो जाती निरंतर नहीं हो सकता है, यह इस प्रकार है कि सरणियों भी निरंतर नहीं हो सकता है।

+0

बस एक नोट: [कोड कोड स्वरूपण को गैर-कोड टेक्स्ट के लिए कब उपयोग किया जाना चाहिए?] (Http://meta.stackoverflow.com/a/254995) :)। – Tom

+0

मैं आधिकारिक विनिर्देश से समान उद्धरण कैसे करूं? मैं उन्हें बेहतर पढ़ने के लिए अन्य पाठ से अलग करना चाहता हूं। – likern

+0

कृपया "कोड स्वरूपण" और "ब्लॉकक्वाट" के बीच अंतर को ध्यान में रखें। "जेएलएस", "जेवीएमएस" और "अध्याय 10. Arrays" जैसे शब्द। कोई कोड नहीं है और इस तरह प्रारूपित किया जाना चाहिए :)। उद्धरण सही हैं। – Tom

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