2015-06-11 43 views
6

सी malloc कार्यान्वयन आमतौर पर अनुरोध की गई स्मृति की सटीक मात्रा आवंटित नहीं करते हैं बल्कि इसके बजाय स्मृति के निश्चित आकार के रनों का उपयोग करते हैं, उदा। दो आकारों के साथ, ताकि 1025 बाइट्स का आवंटन वास्तव में ढलान के रूप में खोए गए 1023 बाइट के साथ 2048-बाइट सेगमेंट लेता है।जावा सरणी हॉटस्पॉट में कितनी सटीक स्मृति का उपयोग करती है (यानी कितनी ढलान)?

क्या हॉटस्पॉट जावा सरणी के लिए समान आवंटन तंत्र का उपयोग करता है? यदि हां, तो जावा सरणी आवंटित करने का सही तरीका क्या है कि कोई ढलान न हो? (जैसे सरणी लंबाई दो या दो शक्तियों की शक्ति हो सकती है, कुछ निश्चित मात्रा में ओवरहेड?)

+8

के आप एक सरणी की जरूरत है 1025 बाइट्स स्टोर करने के लिए मान लेते हैं। आइए मान लें कि जावा उस सरणी के लिए 2048 बाइट्स मेमोरी आवंटित करता है, जिससे 1023 बाइट अप्रयुक्त होते हैं। 1025 बाइट्स स्टोर करने के लिए 2048 बाइट्स की सरणी बनाने में आपको क्या फायदा होगा? अब आपको अप्रयुक्त 1023 बाइट्स को स्वयं को संभालना होगा, और कहीं भी सरणी की वास्तविक लंबाई को स्टोर करना होगा, और जेवीएम को आपके लिए यह करने की बजाय, सरणी को पार करने के बजाय इसे तर्क के रूप में पास करना होगा। और खपत स्मृति की मात्रा वही होगी। यह एक ब्रेनर है। एक सरणी आवंटित करने का सही तरीका एक सरणी आवंटित करना है जिसकी आपको आवश्यकता है। –

+4

ईमानदारी से, मैं इस बारे में चिंता नहीं करता कि कैसे एक JVM कार्यान्वयन स्मृति को संभालता है। जावा जैसी प्रबंधित भाषा का उपयोग करने की खुशी यह है कि स्मृति केवल एक विशाल सरणी नहीं है, आपको बफर ओवररन्स या मेमोरी भ्रष्टाचार के बारे में चिंता करने की ज़रूरत नहीं है, बाहर की समस्याओं या रास्ते के पॉइंटर्स से, और आपको (लगभग) कभी आवश्यकता नहीं है वस्तु साफ करने के बारे में चिंता करने के लिए। जावा के ज़ेन में खुद को खोलें। – scottb

+2

'मॉलोक 'में बाधाओं का एक गुच्छा है कचरा-एकत्रित भाषा को चिंता करने की ज़रूरत नहीं है। मुझे लगता है कि जावा को उन चीजों के बारे में चिंता करने की ज़रूरत नहीं है। –

उत्तर

5

यदि आप भाषा के बारे में पूछ रहे हैं, तो जवाब है: यह निर्दिष्ट नहीं है (सी के लिए समान)

यदि आप एक विशिष्ट कार्यान्वयन के बारे में पूछ रहे हैं, तो उस कार्यान्वयन को देखें। मैं हॉटस्पॉट के लिए 8 बाइट ग्रैन्युलरिटी के लिए विश्वास करता हूं; ऑब्जेक्ट आकार अगले ग्रैन्युलरिटी सीमा तक गोल होते हैं। यदि सवाल पर्याप्त ढेर के ढेर के ढेर के आकार के बारे में है, तो यह कार्यान्वयन, जीसी सेटिंग्स, ढेर आकार के पैराम पर निर्भर करता है और इसी तरह; सटीक जवाब देने के लिए यह अव्यवहारिक बनाते हैं।

संपादित करें: एक छोटे प्रतिबिंब हैक का उपयोग करके, sun.misc.Unsafe क्लास (केवल ओरेकल जेआरई) तक पहुंचने, ऑब्जेक्ट संदर्भों को स्मृति पते में परिवर्तित किया जा सकता है; अपने आप को जांचने के लिए लगातार दो आवंटित सरणी के पते आउटपुट करें।

और मैं मूलतः एक ही प्रश्न पूछा यहाँ: Determine the optimal size for array with respect to the JVM's memory granularity (उत्तर वस्तु के आकार के लिए जाँच करने के लिए असुरक्षित वर्ग उपयोग का एक उदाहरण शामिल हैं)

+0

मैंने वास्तव में कोशिश की जावा के बजाए हॉटस्पॉट के बारे में पूछने के लिए मेरे प्रश्न को तैयार करने के लिए। और दूसरे प्रश्न के उत्तर को देखते हुए, ऐसा लगता है कि निकटतम 8-बाइट सीमा तक गोल करना उत्तर है। धन्यवाद। – hsivonen

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