2017-12-11 74 views
5

एक वस्तु सरणी के calculate स्मृति आकार, कोड निम्नलिखित देता है "24 बाइट्स इस्तेमाल किया" अपेक्षा के अनुरूप है, जो, जहाँ तक मुझे पता है, के होते हैं:जावा वस्तु सरणी आकार

4bytes(element pointer)+16bytes(object header)+4bytes(element space) = 24bytes

// with JVM argument -XX:-UseTLAB 
public static void main(String[] args) { 
    long size = memoryUsed(); 
    Object[] o = new Object[]{1}; 
    //Object[] o = new Object[]{1L}; 
    size = memoryUsed() - size; 
    System.out.printf("used %,d bytes%n", size); 
    //Output: used 24 bytes 
} 

public static long memoryUsed() { 
    return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); 
} 

लेकिन जब तत्व का प्रकार लांग (1 एल) में बदल गया, तो परिणाम भ्रमित हो रहा है, अधिकांश समय यह "9,264 बाइट्स" का उपयोग करता है, कोई भी मुझे प्रबुद्ध करने में मदद कर सकता है? इस दो तत्व प्रकार के बीच स्मृति आवंटन में क्या अंतर है?

// with JVM argument -XX:-UseTLAB 
public static void main(String[] args) { 
    long size = memoryUsed(); 
    //Object[] o = new Object[]{1}; 
    Object[] o = new Object[]{1L}; 
    size = memoryUsed() - size; 
    System.out.printf("used %,d bytes%n", size); 
    //Output: used 9,264 bytes 
} 
+1

शायद दूसरी सरणी बनाने के लिए जेवीएम को अतिरिक्त कक्षाएं लोड करना पड़ता है (जैसे 'लांग' और इसकी आंतरिक कक्षा 'लांग। लोंग कैश') जो आपकी अपेक्षा से अधिक मेमोरी का उपभोग करती है। –

+0

[जावा में, किसी ऑब्जेक्ट के आकार को निर्धारित करने का सबसे अच्छा तरीका क्या है?] (Https://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to के संभावित डुप्लिकेट -determine-the-size-of-a-object) –

उत्तर

0

वहाँ सामान्य रूप में एक वस्तु आकार की गणना करने के लिए एक बेहतर तरीका है, के रूप में वहाँ है कि के लिए एक विशेष उपकरण, JOL कहा जाता है।

यह पूरी तरह से सही नहीं है कि आप इसके बारे में क्या सोचते हैं। उस ऑब्जेक्ट का कुल आकार 40 bytes होगा। चलो देखते हैं, जहां इस जगह से आ रही है:

12 bytes headers (8 bytes + 4 bytes, since there are two headers) 

आप सोचा था कि यह 16 bytes (8 + 8) है, लेकिन वहाँ compressed oops विकल्प डिफ़ॉल्ट रूप से है। आप इसे -XX:-UseCompressedOops के माध्यम से अक्षम कर सकते हैं और वास्तव में इस मामले में हेडर का आकार 16 bytes होने जा रहा है।

4 bytes size of the array (arrays have an int size that is stored in headers) 
4 bytes is the reference size of the Integer (1) 
4 bytes alignment (since objects are 8 bytes aligned - this is the trick behind CompressedOops btw) 

अब तक आप सरणी के लिए 24 bytes है।

अब, आप इसके अंदर एक पूर्णांक, एक वस्तु भी है कि स्टोर, इस प्रकार:

12 bytes headers 
4 bytes for the actual int value inside Integer 

इस प्रकार कुल आकार 40 bytes है।

+0

यह हो सकता है कि इस सरणी में संग्रहीत इंटीजर इसका आदिम प्रकार है, इसलिए यह अतिरिक्त 16 बाइट्स ऑब्जेक्ट हेडर –

+0

@ 鄭 无爲 बचाता है ठीक है आपने इसे 'ऑब्जेक्ट' के रूप में घोषित किया है 'तो यह' इंटीजर 'होगा; यदि आप उस स्थान को सहेजना चाहते हैं तो आपको इसे 'int [] 'के रूप में घोषित करने की आवश्यकता है – Eugene

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