इस विषय पर मैंने कई किताबें/लेख पढ़े हैं, साथ ही साथ 'अनसाफ' का उपयोग करके मैंने लिखा एक छोटा सा प्रोग्राम इंगित करता है कि जावा में 1-डी सरणी हमेशा स्मृति में संगत होती है। तो क्या यह जेएलएस द्वारा निर्धारित है या यह एक कार्यान्वयन सम्मेलन है? इस संकेत की पुष्टि करने के लिए सवाल पूछा जाता है।जावा: स्मृति में 1-डी सरणी हमेशा संगत होती है?
उत्तर
नहीं है, JVM विनिर्देश ऐसे किसी भी गारंटी नहीं है: http://docs.oracle.com/javase/specs/jvms/se5.0/html/Concepts.doc.html#16446
व्यवहार में यह शायद मामला है लेकिन आप यह भी शब्द आकार के बारे में कोई गारंटी नहीं है।
असुरक्षित एक मानक जावा वर्ग नहीं है, इसलिए यदि आपके प्रोग्राम इस का उपयोग करता है, तो यह पोर्टेबल वैसे भी
चूंकि जावा में मेमोरी पतों के साथ बातचीत करने का कोई वास्तविक तरीका नहीं है, इसलिए यह भी कल्पना में परिभाषित नहीं किया गया है कि स्मृति में ऑब्जेक्ट का लेआउट कैसा दिखता है।
ध्यान दें कि Unsafe
का उपयोग करके बहुत अधिक स्वचालित रूप से इसका अर्थ है कि आप spec के दायरे से बाहर निकल रहे हैं।
कहा जा रहा है कि, मैं यह अनुमान लगाता हूं कि अधिकांश जेवीएम कार्यान्वयन वास्तव में (एक-आयामी) सरणी के लिए एक रैखिक लेआउट का उपयोग करें।
को देखते हुए है ... कई JVM के एक आवश्यकता है कि ढेर स्मृति में सतत मैं अपने संभावना नहीं लगता है कि वे स्मृति में विभिन्न स्थानों में प्राइमेटिव्स की 1 डी सरणी रखेंगे।
ऑब्जेक्ट [] द्वारा संदर्भित ऑब्जेक्ट स्मृति में निरंतर होने की संभावना नहीं है और यहां तक कि यदि वे हैं, तो चेतावनी के बिना फिर से व्यवस्थित किया जा सकता है।
नोट: असुरक्षित का उपयोग करके आप int
मानों के रूप में संदर्भों को संदर्भित कर सकते हैं यह देखने के लिए कि वे पहले और बाद में जीसी के बाद क्या हैं। कुछ JVMs 64-बिट संदर्भ जो एक लंबे आवश्यकता का उपयोग करें, लेकिन सबसे अधिक 32-BTI संदर्भ (यहां तक कि 64-बिट JVMs के लिए) का उपयोग
मैं The Java Language Specification, Java SE 8 Edition (JLS) और The Java Virtual Machine Specification, Java SE 8 Edition (JVMS) इसके बारे में क्या कह रहे हैं के साथ इस सवाल को ताज़ा करना चाहते हैं।
हम विकल्प के लिए है इस सवाल का जवाब देने के लिए:
- क्या कमी JVM कार्यान्वयन पर लगाया जाता है। यह सबसे विश्वसनीय दृष्टिकोण है क्योंकि किसी भी विनिर्देश के कार्यान्वयन को का स्वाभाविक रूप से मानना है "जो कुछ भी प्रतिबंधित नहीं है उसे अनुमति है" सिद्धांत।
- क्या सबसे JVM कार्यान्वयन उचित
मैं विनिर्देश की कमी के बाहर बिंदु होगा सुझाव देते हैं।
अगर हम अध्याय में 10 सरणी की JLS (और सरणियों से संबंधित JLS और JVMs के किसी भी अन्य अध्याय) हम पाते हैं नहीं कर सका स्मृति लेआउट सरणियों करने के लिए लगाए की कमी का कोई उल्लेख है। इस प्रकार यह निश्चित रूप से मतलब है कि सरणी निरंतर नहीं हो सकती है।
इसके अलावा, JLS का कहना है कि सरणियों वस्तुओं हैं:
अध्याय 10 सरणी।
जावा प्रोग्रामिंग भाषा में, सरणियों वस्तुओं (§4.3.1), डायनामिक रूप से तैयार कर रहे हैं, और प्रकार वस्तु का चर को सौंपा जा सकता है (§4.3.2)। कक्षा ऑब्जेक्ट की सभी विधियां किसी सरणी पर आ सकती हैं।
...4.3.1। वस्तुओं।
एक वस्तु एक वर्ग उदाहरण या एक सरणी है। (और सरणी वस्तु है)
और एक ही समय में JVMs का कहना है कि वस्तुओं और सरणियों ढेर पर जमा हो जाती है:
2.5.3। हीप
जावा वर्चुअल मशीन में एक ही ढेर है जो सभी जावा वर्चुअल मशीन थ्रेड्स के बीच साझा किया जाता है। ढेर रन-टाइम डेटा क्षेत्र है जिसमें से सभी वर्ग के उदाहरणों और सरणी आवंटित किए जाते हैं।
लेकिन JVMs ढेर स्मृति बाध्य नहीं करता निरंतर होने के लिए:
2.5.3। हीप
... ढेर के लिए स्मृति निरंतर होने की आवश्यकता नहीं है।
के रूप में सभी सरणियों ढेर और ढेर में जमा हो जाती निरंतर नहीं हो सकता है, यह इस प्रकार है कि सरणियों भी निरंतर नहीं हो सकता है।
बस एक नोट: [कोड कोड स्वरूपण को गैर-कोड टेक्स्ट के लिए कब उपयोग किया जाना चाहिए?] (Http://meta.stackoverflow.com/a/254995) :)। – Tom
मैं आधिकारिक विनिर्देश से समान उद्धरण कैसे करूं? मैं उन्हें बेहतर पढ़ने के लिए अन्य पाठ से अलग करना चाहता हूं। – likern
कृपया "कोड स्वरूपण" और "ब्लॉकक्वाट" के बीच अंतर को ध्यान में रखें। "जेएलएस", "जेवीएमएस" और "अध्याय 10. Arrays" जैसे शब्द। कोई कोड नहीं है और इस तरह प्रारूपित किया जाना चाहिए :)। उद्धरण सही हैं। – Tom
- 1. क्या वालराय में संगत स्मृति संरेखण है?
- 2. एक संगत स्मृति ब्लॉक क्या है?
- 3. संगत (जावास्क्रिप्ट में) सहयोगी सरणी
- 4. क्या प्राथमिक कुंजी हमेशा क्लस्टर होती है?
- 5. एसक्यूएल जहां स्थिति हमेशा सच होती है
- 6. MySQL Enum में हमेशा संभावनाओं में '' (खाली स्ट्रिंग) होती है
- 7. क्या std :: सरणी में स्मृति है?
- 8. नेस्टेड हमेशा यादृच्छिक स्मृति क्यों करता है?
- 9. क्लोजर के मामले में "पूरी भाषा हमेशा उपलब्ध" होती है?
- 10. जावा संगत cksum फ़ंक्शन
- 11. स्व युक्त सरणी गहरी बराबर होती है
- 12. वीबीस्क्रिप्ट शब्दकोश मौजूद है विधि हमेशा सही होती है
- 13. सी # सी ++ वेक्टर के बराबर, संगत स्मृति के साथ?
- 14. Numpy सरणी स्मृति समस्या
- 15. सी # सूची गणना हमेशा खाली होती है जब सूची खाली होती है
- 16. जावा में, हमेशा नया नया है?
- 17. जावा गतिशील स्मृति आवंटन?
- 18. जावा जावा हमेशा 32 बिट्स है?
- 19. सीमित सीमा के कारण तुलना हमेशा झूठी होती है ... टेम्पलेट्स
- 20. क्या यह मानना सुरक्षित है कि एसटीएल वेक्टर भंडारण हमेशा संगत है?
- 21. मेरी एंड्रॉइड गतिविधि हमेशा नीचे स्क्रॉल क्यों शुरू होती है?
- 22. जावा में स्मृति आकार अनुकूलन
- 23. क्या एक विशेषता की OnActionExecuted विधि हमेशा निष्पादित होती है?
- 24. क्या jQuery हमेशा सरणी लौटाता है?
- 25. आयताकार सरणी स्मृति क्रम में शारीरिक
- 26. क्या जावा में स्थैतिक विधियां हमेशा संकलित समय पर हल होती हैं?
- 27. पीएचपी सरणी प्रदर्शन - स्मृति बुद्धिमान
- 28. रूबी सरणी पाश हमेशा जोड़ी
- 29. स्मृति में जावा एसक्यूएल टेबल डेटा संरचना
- 30. एक सीपीयू कैश लाइन लिखने के बाद स्मृति में फ़्लश कब होती है?
सहमत हुए, लेकिन सरणी स्वयं ही संगत होगी, है ना? इस तरह कुछ: 1000-> aa, 1001-> बीबी, 1002-> सीडी इत्यादि – shrini1000
मुझे उम्मीद है कि संदर्भ लगातार संग्रहित किए जाने चाहिए (लेकिन मुझे विश्वास नहीं है कि यह कहीं भी निर्दिष्ट है) यह इस तथ्य के समान है कि स्पेक का कहना नहीं है कि संदर्भ गणना का उपयोग किसी भी जेवीएम में जीसी के लिए नहीं किया जाएगा, लेकिन AFAIK कोई भी नहीं करता है। –
@ shrini1000 यदि ढेर वर्चुअल मेमोरी का एक संगत ब्लॉक नहीं है, तो एक सरणी स्पैनिग दो टुकड़ों में संगत लेआउट नहीं होगा। दूसरी तरफ, ढेर के ढेर का अर्थ यह है कि एरे के बारे में कुछ भी नहीं है, शायद अप्रत्यक्ष रूप से यह अधिक संभावना है क्योंकि जीसी डिजाइन की बाधाएं समान होंगी। –