जावा में ऑब्जेक्ट्स / सरणियाँ आवंटित करते समय ओवरहेड क्यों?


9

जावा में एक सरणी कितनी बाइट्स होती है? मान लें कि यह 64 बिट मशीन है और यह भी मान लीजिए कि किसी सरणी में N तत्व हैं, इसलिए ये सभी तत्व विभिन्न प्रकार के सरणी के लिए 2 * N, 4 * N या 8 * N बाइट्स लेंगे।

और कौरसेरा में एक व्याख्यान में कहा गया है कि यह एक एन तत्व सरणी के लिए 2 * N + 24, 4 * N + 24 या 8 * N + 24 बाइट पर कब्जा करेगा और 24 बाइट को ओवरहेड कहा जाता है, लेकिन यह नहीं बताया कि ओवरहेड क्यों है जरूरत है।

इसके अलावा वस्तुओं में ओवरहेड्स होते हैं, जो 16 बाइट्स होते हैं।

वास्तव में ये ओवरहेड्स क्या हैं? ये 24/16 बाइट किससे बनी हैं?

इसके अलावा, क्या ये ओवरहेड केवल जावा में मौजूद हैं? सी, सी ++ और पायथन के बारे में कैसे?


2
बाहर की जाँच करें: stackoverflow.com/a/258150/1029272
Deco

1
@ जीनिज़ोह: क्या आपका मतलब यह पूछना है: यह ओवरहेड किस डेटा से बना है?
FrustratedWithFormsDesigner

@YannisRizos: मुझे लगता है कि ओपी जानना चाहता है कि उन 24 बाइट्स में वास्तव में क्या है, सरणियों के लिए।
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner आह, कि सवाल की एक बेहतर व्याख्या की तुलना में मेरा लगता है।
यानि

@YannisRizos को मेरे बुरे रवैये पर खेद है। लेकिन जब आप उस लिंक को पोस्ट करते हैं तो मैं मदद नहीं कर सकता, लेकिन लगता है कि यह किसी प्रकार का कटाक्ष है। बहुत रक्षात्मक, मुझे लगता है।
Gnijuohz

जवाबों:


16

प्रत्येक जावा ऑब्जेक्ट में एक हेडर होता है जिसमें JVM के लिए महत्वपूर्ण जानकारी होती है। सबसे महत्वपूर्ण वस्तु के वर्ग (एक मशीन शब्द) का संदर्भ है, और कचरा कलेक्टर द्वारा उपयोग किए जाने वाले कुछ झंडे हैं और सिंक्रनाइज़ेशन का प्रबंधन करने के लिए (क्योंकि प्रत्येक वस्तु को सिंक्रनाइज़ किया जा सकता है) जो एक अन्य मशीन शब्द (आंशिक शब्दों का उपयोग करके) लेता है प्रदर्शन के लिए बुरा हो)। तो यह 2 शब्द है, जो कि 32 बिट सिस्टम पर 8 बाइट्स और 64 बिट पर 16 बाइट्स है। अतिरिक्त रूप से सरणी लंबाई के लिए एक अंतर फ़ील्ड की आवश्यकता होती है, जो कि एक और 4 बाइट्स है, संभवतः 64 बिट सिस्टम पर 8।

अन्य भाषाओं के लिए के रूप में:

  • C में ऑब्जेक्ट्स नहीं हैं, इसलिए निश्चित रूप से इसमें ऑब्जेक्ट हेडर नहीं हैं - लेकिन प्रत्येक अलग-अलग आवंटित मेमोरी पर एक हेडर हो सकता है।

  • C ++ में, आपके पास कचरा संग्रह नहीं है और तुल्यकालन के लिए मनमानी वस्तुओं का उपयोग नहीं किया जा सकता है, लेकिन यदि आपके पास ओवरराइड विधियों के साथ कक्षाएं हैं, तो प्रत्येक ऑब्जेक्ट के पास इसकी श्रेणी के लिए जावा ऑब्जेक्ट के संदर्भ की तरह, इसकी व्यवहार्यता के लिए एक संकेतक है। यदि आप स्मार्ट पॉइंटर्स का उपयोग करते हैं जो कचरा संग्रह करते हैं, तो उन्हें हाउसकीपिंग डेटा की आवश्यकता होती है।

  • मैं पायथन के बारे में नहीं जानता, लेकिन मुझे पूरा यकीन है कि इसे क्लास के संदर्भ, और कचरा संग्रहकर्ता के लिए हाउसकीपिंग की जानकारी भी चाहिए।


OpenJDK में इस समय ऑब्जेक्ट हेडर, छोटे लेकिन महत्वपूर्ण चरणों के आकार को कम करने के लिए काम हो रहा है :-)
मार्टिजेन वर्बर्ग

C ++ में, केवल बहुरूपिक वर्गों को vtables की आवश्यकता होती है। std::pair<int, float>एक साधारण वर्ग है, जिसे एक सबमिशन की आवश्यकता नहीं है। नतीजतन, यह 8 बाइट्स में बहुत अच्छी तरह से फिट हो सकता है। इसके अलावा, स्मार्ट पॉइंटर्स को वास्तव में हाउसकीपिंग को जोड़ने की आवश्यकता नहीं है। एक स्पष्ट काउंटर-उदाहरण है std::unique_ptr<T>, जो आम तौर पर कच्चे के रूप में बड़ा होता है T*(यूनिक_प्रटर निश्चित रूप से जीसी नहीं करता है)।
एमएसल्टर्स

4
सी में एक ओवरहेड भी है, प्रत्येक- mallocमेमोरी के ब्लॉक को एक हेडर की आवश्यकता होती है जो freeतब उपयोग करता है।
हबीब

कम से कम एक मॉलोक लाइब्रेरी जिसे मैं 32-बिट सिस्टम पर 8-बाइट हेडर का उपयोग करने के लिए जानता हूं (जो कि 2-बाइट प्रहरी मूल्यों, IIRC के दो सेटों द्वारा ब्रैकेट की गई 4-बाइट लंबाई है)।
डोनाल्ड फेलो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.