2010-11-06 18 views
5

हम जावा ऑब्जेक्ट का आकार कैसे ढूंढ सकते हैं ??आकार का जावा ऑब्जेक्ट

उदाहरण:

class Person{ 
    String name; 
    int age; 

    public Person(String n, int a){ 
     name = n; 
     age = a; 
    } 
} 

Person person = new Person("Andy", 30); 

अब मैं कैसे व्यक्ति वस्तु के आकार को पता कर सकते हैं ??

धन्यवाद

+3

क्यों आप वस्तु के आकार को जानने की आवश्यकता है की तरह जावा में किसी भी वस्तु के आकार की गणना करने के sizeof4j लाइब्रेरी का उपयोग कर सकते हैं? –

+2

यदि आपको वास्तव में जानने की आवश्यकता है ... http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the-size-of-an-object –

+0

उस परिदृश्य पर विचार करें जहां हमारे पास सीमित स्मृति है और एप्लिकेशन में स्पेस लेने के लिए कई ऑब्जेक्ट्स हैं, फिर हम कैसे पहचानेंगे कि कौन सी ऑब्जेक्ट अधिक जगह ले रही है और तदनुसार संभालती है। – daydreamer

उत्तर

9

प्रश्न कम से कम संदर्भ के बिना अर्थपूर्ण नहीं है।

जावा में "आकार" की धारणा केवल समुचित रूप से पुरातन के लिए परिभाषित किया गया है: एक बाइट 8 बिट (आश्चर्य) एक int 32 बिट, एक long 64 बिट, आदि है (पूरी सूची के लिए जैसे http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html देखें)।

वस्तु उदाहरणों के लिए, यह और अधिक जटिल है, क्योंकि:

  • वस्तु उदाहरणों कर सकते हैं (और आमतौर पर होगा) अन्य उदाहरण के लिए संदर्भ आंतरिक रूप से शामिल है, तो आप यह तय करना होगा कि क्या इन निर्भर उदाहरणों गिनती करने के लिए, और कैसे। क्या होगा यदि कई उदाहरण निर्भरता साझा करते हैं?
  • कभी-कभी, ऑब्जेक्ट इंस्टेंस का पुन: उपयोग किया जा सकता है (उदा। java.lang.String का इंटर्निंग, http://en.wikipedia.org/wiki/String_interning देखें)। तो यदि आप आकार वाई के एक्स ऑब्जेक्ट्स का उपयोग करते हैं, तो कुल आकार x * y
  • से छोटा हो सकता है। JVM में वस्तुओं और उदाहरणों को आंतरिक रूप से कार्यान्वित करने के तरीके के बारे में बहुत कुछ है। यह विभिन्न उदाहरणों के लिए विभिन्न तकनीकों का उपयोग कर सकता है (उदा। आंतरिक डेटा संरचनाओं को साझा करना), इसलिए एक ऑब्जेक्ट को असाइन करने के लिए एक सार्थक "आकार" भी नहीं हो सकता है।

शायद आप समझा सकते हैं कि आप ऑब्जेक्ट आकारों में रुचि क्यों रखते हैं।

उदाहरणों द्वारा उपयोग की जाने वाली ढेर मेमोरी का अनुमान लगाने के लिए अंगूठे के कुछ नियम हैं (उदाहरण के लिए सूर्य जेवीएम में, java.lang.Object उदाहरण 8 बाइट का उपयोग करता है), लेकिन ये आपके द्वारा उपयोग किए जाने वाले जेवीएम पर निर्भर होंगे।

आम तौर पर, यदि आप अपने ढेर के उपयोग के बारे में जानना चाहते हैं, तो मेमोरी/हीप प्रोफाइलर का उपयोग करें।

संपादित करें:

ठीक है, एक वस्तु के द्वारा प्रयोग किया स्मृति की मात्रा का एक अनुमान प्राप्त करने के लिए एक तरह से (JDK 6) के रूप में है: http://download.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#getObjectSize%28java.lang.Object%29

यह अभी भी केवल एक सन्निकटन है ..

-3

जावा कोई sizeof ऑपरेटर में बनाया गया है।

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

तुम भी एक विधि sizeOf() कहा जाता है, इस तरह हो सकता है:

// returns the size of this object in bytes 
int sizeOf() 
{ 
    int size = 0; 
    size += name.Length * 2; // each character in name is 2 bytes, no? 
    size += 4; // for n, which is 32 bits = 4 bytes 
} 

ध्यान दें कि यह कार्यान्वयन नाम अंदर मेटाडाटा, केवल इसके लिए char[] बनाने के लिए आवश्यक बाइट की संख्या शामिल नहीं है।

+0

लेकिन यह भी नहीं दिखाएगा कि कितने स्पेस हेडर या तो लेते हैं। – thejh

+0

संपादित, मैंने कहा कि जानकारी ... ईमानदारी से, मुझे नहीं लगता कि जावा का इरादा कभी ऐसा काम करने का इरादा था ... –

+0

मेरा मानना ​​है कि धारावाहिकता इसे करने का सटीक तरीका नहीं है, क्योंकि यह वस्तुओं के साथ मेटाडेटा जोड़ता है ताकि डी-सीरियलाइजेशन प्रक्रिया जानता है कि ऑब्जेक्ट को पुनर्निर्माण कैसे करें – daydreamer

2

मुझे लगता है कि आप कुछ है कि आप मदद कर सकता है अगर आप कुछ इस तरह कर प्राप्त कर सकते हैं:

/* First trigger classloading */ 
    MyObject delegate = new MyObject(); 

    Runtime.getRuntime().gc(); 

    long before = Runtime.getRuntime().freeMemory(); 
    MyObject delegate2 = new MyObject(); 
    long after = Runtime.getRuntime().freeMemory(); 

    System.out.println("Memory used:"+(before-after)); 

यह उम्मीद है कि आप इस सवाल का जवाब आप चाहते हैं, या कम से कम एक सन्निकटन दे देंगे।

+0

बहु-थ्रेडेड परिस्थितियों के बारे में क्या? यदि एक ही आकार की दो वस्तुओं को एक ही समय में आवंटित किया जाता है, तो उपयोग की गई स्मृति का मान आकार के दोगुने से दोगुना होगा। –

+0

मैं उन वस्तुओं के लिए एक छोटा नियंत्रित परीक्षण करूंगा जो मैं गड़बड़ करना चाहता हूं। – Knubo

0

ऑब्जेक्ट्स। किसी ऑब्जेक्ट के मेमोरी उपयोग को निर्धारित करने के लिए, हम प्रत्येक ऑब्जेक्ट वैरिएबल द्वारा प्रत्येक ऑब्जेक्ट के साथ ओवरहेड से जुड़े पर आमतौर पर 16 बाइट्स के साथ उपयोग की गई मेमोरी की जोड़ते हैं। ओवरहेड में ऑब्जेक्ट की कक्षा, कचरा संग्रहण जानकारी, और सिंक्रनाइज़ेशन जानकारी के संदर्भ में शामिल है। इसके अलावा, स्मृति उपयोग आमतौर पर 8 बाइट्स (मशीन शब्द, 64-बिट मशीन पर) के एकाधिक होने के लिए गद्देदार है। उदाहरण के लिए, एक पूर्णांक वस्तु 24 बाइट ( भूमि के ऊपर के 16 बाइट्स, इसके पूर्णांक उदाहरण चर के लिए 4 बाइट, और गद्दी के 4 बाइट्स)

संदर्भ का उपयोग करता है: http://www.amazon.com/Algorithms-4th-Edition-Robert-Sedgewick/dp/032157351X

1

ehcache एक SizeOf वर्ग में प्रावधान है कि Instrumentation एजेंट का उपयोग करने का प्रयास करेगा और यदि एजेंट लोड नहीं होता है या लोड नहीं किया जा सकता है (details here) तो एक अलग दृष्टिकोण पर वापस आ जाएगा।

the agent from Heinz Kabutz भी देखें।

1

आप SizeOf.shallowSize(new Integer(2))

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