2010-10-27 4 views
8

मापने के लिए उचित तरीका क्या है कि एक निश्चित प्रकार की नई वस्तु बनाने के लिए ढेर से कितनी मेमोरी का उपयोग किया जाना चाहिए (चलिए इसे सरल रखने के लिए इंटीग्रर्स के बारे में बात करते हैं)?जावा में एक इंटीजर ऑब्जेक्ट के लिए कितनी मेमोरी आवंटित की जाती है? किसी भी कस्टम ऑब्जेक्ट के लिए इस मान को कैसे ढूंढें?

क्या इस मूल्य की गणना के बिना गणना की जा सकती है? उस मामले में नियम क्या हैं? क्या ये नियम कहीं भी कड़ाई से निर्दिष्ट हैं या वे जेवीएम से जेवीएम में भिन्न हो सकते हैं?

+0

वे प्रति मशीन में भिन्न नहीं होते हैं लेकिन जावा में कोई आकार का ऑपरेटर नहीं है यदि आप – Cratylus

उत्तर

14

यह जेवीएम से जेवीएम में भिन्न हो सकता है।

आप एक Oracle इंजीनियर से this blog post पसंद कर सकते हैं:

एक 32-बिट हॉटस्पॉट JVM, 32-बिट पेलोड (एक Integer.value क्षेत्र) पर एक जावा पूर्णांक के मामले में एक के साथ है कुल 128 बिट्स के लिए 96 अतिरिक्त बिट्स, एक चिह्न, एक क्लास, और संरेखण पैडिंग का एक शब्द। इसके अलावा, अगर दुनिया में इस पूर्णांक (धागे और ढेर) के छह संदर्भ हैं (कहें), तो उन संदर्भों में कुल 320 बिट्स के लिए 1 9 2 बिट्स भी हैं। 64-बिट मशीन पर, सबकुछ दोगुना बड़ा होता है, कम से कम वर्तमान में: ऑब्जेक्ट में 256 बिट्स (जिसमें अब 9 6 बिट्स पैडिंग शामिल हैं), और 384 बिट्स कहीं और हैं। इसके विपरीत, एक अनबॉक्स्ड आदिम पूर्णांक के छह प्रतियां 192 बिट्स

0

जावा में करने के लिए आसान नहीं है यही कारण है कि कब्जा: sizeof मौजूद हैं और नहीं है इस तरह के एक बाइट धारा में वस्तुओं serializing और जिसके परिणामस्वरूप धारा के पर देख रहे हैं के रूप में वैकल्पिक समाधान, लंबाई, सभी मामलों में काम नहीं करते हैं (उदाहरण के लिए तार)।

हालांकि, ऑब्जेक्ट ग्राफ़ का उपयोग करके this quite complicated implementation देखें।

+1

से पूछ रहे हैं तो आपने शायद इस धागे को गलती से अपने उत्तर में लिंक किया है :) – Roman

+0

@Roman, whoops, गलती संपादित :) –

1

आप इसे खोजने के लिए जावा वाद्ययंत्र को देखना चाहते हैं। Here इसका एक उदाहरण है।

आपके मामले में, जैसा कि मेरा मानना ​​है कि आप अपने आवेदन के साथ वस्तुओं का आकार ढूंढना चाहते हैं, तो आप इंस्ट्रूमेंटेशन ऑब्जेक्ट को वैश्विक रूप से उपलब्ध कराएंगे (static) ताकि आप इसे अपने एप्लिकेशन से एक्सेस कर सकें।

कोड लिंक से कॉपी किया गया:

public class MyAgent { 
    private static volatile Instrumentation globalInstr; 
    public static void premain(String args, Instrumentation inst) { 
    globalInstr = inst; 
    } 
    public static long getObjectSize(Object obj) { 
    if (globalInstr == null) 
     throw new IllegalStateException("Agent not initted"); 
    return globalInstr.getObjectSize(obj); 
    } 
} 

हालांकि, मेरा मानना ​​है कि आप केवल वस्तुओं (नहीं आदिम प्रकार, यह भी आप आप के रूप में उन्हें पता लगाने के लिए की आवश्यकता नहीं है के आकार को खोजने के लिए सक्षम हो जाएगा पहले से ही उन्हें पता है :-))

ध्यान दें कि getObjectSize() विधि वस्तु में पारित द्वारा संदर्भित अन्य वस्तुओं के प्रयुक्त स्मृति शामिल नहीं है। उदाहरण के लिए, यदि वस्तु एक ओब के लिए एक संदर्भ है जेक्ट बी, फिर ऑब्जेक्ट ए की रिपोर्ट की गई मेमोरी उपयोग में ऑब्जेक्ट बी (आमतौर पर 4 बाइट्स) के संदर्भ के लिए केवल बाइट्स शामिल होंगे, वास्तविक वस्तु नहीं।

एक वस्तु की स्मृति उपयोग (यानी जो "subobjects" या वस्तुओं "मुख्य" वस्तु से जाना जाता भी शामिल है) का एक "गहरी" गिनती प्राप्त करने के लिए है, तो आप Classmexer एजेंट बीटा डाउनलोड के लिए उपलब्ध का उपयोग कर सकते this साइट से।

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

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