2009-09-18 10 views
13

क्या यह मानना ​​सही है कि जावा ऑब्जेक्ट केवल ऑब्जेक्ट संदर्भ के लिए 8 बाइट्स लेता है जब तक कि इसके सभी सदस्य null पर सेट हो या सदस्यों की परिभाषा किसी कारण से पहले से ही स्थान का उपयोग कर लेती है?जावा ऑब्जेक्ट का उपयोग कितना मेमोरी करता है जब उसके सभी सदस्य शून्य होते हैं?

दूसरे शब्दों में, यदि मेरे पास ऑब्जेक्ट्स का एक बड़ा संग्रह है जो मैं अंतरिक्ष कुशल बनना चाहता हूं, तो क्या मैं अप्रयुक्त सदस्यों को स्मृति पदचिह्न को कम करने के लिए null पर सेट करने पर भरोसा कर सकता हूं?

उत्तर

17

नहीं, आपको फ़ील्ड में स्टोर करने वाले प्रत्येक नल के लिए या तो 4 या 8 बाइट्स (यह 32 या 64 बिट सिस्टम है या नहीं) की आवश्यकता है। वस्तु को पता चलेगा कि इसका क्षेत्र शून्य था अगर ऐसा कुछ कहने के लिए कहीं संग्रहीत नहीं किया गया था?

+0

हाँ, अच्छा सवाल है। :) तो एक क्षेत्र एक सी सूचक के बराबर है (जिसके लिए भी स्मृति की आवश्यकता है)? –

+0

हां, संदर्भ प्रकारों (कक्षाओं) के चर ढेर पर ऑब्जेक्ट्स के संदर्भ हैं, सी पॉइंटर्स के बराबर। पॉइंटर के लिए मेमोरी ली जाएगी और ऑब्जेक्ट के लिए यह इंगित करेगा। आदिम प्रकार, जैसे कि int को सीधे संग्रहीत किया जाता है और हमेशा एक ही आकार होते हैं। – Joe

6

नहीं, शून्य भी जानकारी है और इसे भी संग्रहीत किया जाना है।

0

कक्षा, वस्तु और विधि नामों के बारे में क्या? जैसा कि आप जावा प्रतिबिंबित करके उन्हें कॉल, एक्सेस या तत्काल कर सकते हैं, नाम कहीं भी संग्रहीत किए जाने चाहिए, है ना? लेकिन सीएमआईआईडब्ल्यू।

Kage

+1

वे प्रति-उदाहरण संग्रहीत नहीं हैं। – CPerkins

+0

सच है। मूल प्रश्न वस्तुओं की अंतरिक्ष लागत के बारे में था। धन्यवाद :-)। – Kage

1

वस्तु का संदर्भ खुद को अभी भी कुछ स्मृति का समय लग जाएगा, इसलिए केवल वास्तविक स्मृति बचत ढेर वस्तुओं है कि करने के लिए भेजा गया है से किया जाएगा।

इसलिए, यदि आप

MyClass { 
    public Object obj; 
    MyClass(Object o) { obj = o; } 
} 

MyClass a = new MyClass(new HashMap()); 
MyClass b = new MyClass(null); 

दो वस्तुओं a और b है खुद को स्मृति का एक ही राशि (वे दोनों एक संदर्भ पकड़), लेकिन वस्तु obja से संबोधित किया जाता का समय लग पर स्मृति तक ले जाता है ढेर, तो इस स्मृति को शून्य के संदर्भ को सेट करके सहेजा जा सकता था।

1

Java Language Specification और Java Virtual Machine Specification स्मृति में जावा ऑब्जेक्ट्स के आकार के बारे में कुछ भी नहीं कहें - जानबूझकर अनिर्धारित छोड़ दिया गया है, क्योंकि यह JVM के कार्यान्वयन पर निर्भर करता है। इसका अर्थ यह है कि आप इस बात पर कोई धारणा नहीं बना सकते कि जावा ऑब्जेक्ट सामान्य रूप से कितनी मेमोरी का उपयोग करता है या स्मृति में जावा ऑब्जेक्ट का मेमोरी लेआउट क्या है।

जैसा कि अन्य ने पहले ही कहा है: एक संदर्भ (चर) स्मृति लेता है, भले ही संदर्भ null है या नहीं। जब आप सदस्य चर को null पर सेट करते हैं तो आपकी ऑब्जेक्ट्स कम नहीं हो जाती हैं और कम मेमोरी लेती हैं।

0

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

ढेर एक जावा वस्तु द्वारा प्रयुक्त स्मृति उनके आकार के अनुसार, आदिम क्षेत्रों के लिए

  • स्मृति भी शामिल है।

  • संदर्भ फ़ील्ड के लिए स्मृति (प्रत्येक 4 बाइट्स)।

  • एक ऑब्जेक्ट हेडर, जिसमें "हाउसकीपिंग" जानकारी के कुछ बाइट शामिल हैं।

  • जावा में

वस्तुओं भी इस तरह के जैसे कि वस्तु वर्तमान में, पहुंच योग्य वर्तमान में तुल्यकालन लॉक आदि

जावा वस्तु के रूप में एक वस्तु के वर्ग, आईडी और स्थिति झंडे रिकॉर्डिंग के रूप में कुछ "गृह व्यवस्था" सूचना की आवश्यकता है हेडर आकार 32 और 64 बिट जेवीएम पर भिन्न होता है।

हालांकि ये मुख्य स्मृति उपभोक्ता हैं, हालांकि जेवीएम को कभी-कभी अतिरिक्त फ़ील्ड की आवश्यकता होती है जैसे कि कोड e.t.c. के संरेखण के लिए।

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

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