2009-04-08 12 views
12

कक्षा में किसी फ़ंक्शन की मेमोरी ओवरहेड क्या है?जावा विधि का मेमोरी ओवरहेड क्या है?

उदाहरण के लिए,

Class A 
{ 
int a 
} 

Class B 
{ 
int a 
int foo(int); 
} 

तो क्लास ए की 100 उदाहरणों 80 बाइट्स होना चाहिए। कक्षा बी के 100 उदाहरणों के बारे में क्या?

+1

इसे फ़ंक्शन नहीं कहा जाता है। इसे एक विधि कहा जाता है। – eleven81

+0

लॉल, हाँ, इसे एक विधि कहा जाता है, और आप एक परीक्षण करने से बेहतर होगा। –

+2

यह वीएम स्रोत को देखकर छोड़कर परीक्षण योग्य नहीं है, जब तक कि आप दूसरों को क्या नहीं कर रहे हैं और मान लें कि क्रमबद्ध रूप मेमोरी रूप में समान है। – TofuBeer

उत्तर

-1

शायद sizeof v-तालिका सूचक 16.

+0

दोनों वस्तुओं की कक्षाओं में उनके वर्ग के कुछ प्रकार का संदर्भ होगा। –

+0

हाँ, आभासी कार्यों की तालिका में सूचक। – tpdi

1

विधि की एक बहु तक बढ़ाना धारावाहिक रूप में संग्रहीत नहीं है। यह इतना सरल है।

संपादित करें: निष्पादन के दौरान वीएम में वस्तुओं के लिए, आकार निरंतर होना चाहिए, इस पर ध्यान दिए बिना कि वस्तु के वर्ग के कितने तरीके हैं।

4

80 बाइट्स किसी विधि के बाद ऑब्जेक्ट में शामिल नहीं है। जब तक आप "vtable" चीज़ के बारे में बात नहीं कर रहे हैं, इस मामले में शायद 160 बाइट्स।

160 बाइट्स पर स्पष्टीकरण। 160 होगा यदि प्रत्येक ऑब्जेक्ट ने अपना खुद का vtable आवंटित किया (जो एक संभावित कार्यान्वयन है)। वैकल्पिक रूप से (और जैसा कि टिप्पणियों में बताया गया है) एक बेहतर तरीका प्रति वर्ग एक vtable होगा, जिसका अर्थ है 80 + vtable के सूचक के आकार (शायद वीएम के आधार पर 4 या 8 बाइट्स)। तो 84 या 88 बाइट्स।

यह पूरी बात पूरी तरह से वीएम आवंटित करने और गैर-अंतिम तरीकों से निपटने के तरीके पर निर्भर करती है। यह जानने के बिना कि विशेष वीएम कैसे लागू किया गया है और न ही प्रश्न का सही उत्तर दिया जा सकता है।

+0

दोनों वर्गों में उनकी कक्षा के किसी प्रकार का संदर्भ है (एक सी ++ vtbl सूचक के बराबर)। ऐसा नहीं है कि प्रत्येक ऑब्जेक्ट किसी भी प्रकार के उचित वीएम पर कक्षा की जानकारी के भार को ले जाने जा रहा है। –

+0

यह एक वीएम विशिष्ट कार्यान्वयन है, क्योंकि यह एक सी ++ कंपाइलर विशिष्ट इंपीमेंटमेंट है। – TofuBeer

+0

टॉम, जब आप मेरे उत्तरों पर टिप्पणी करते हैं तो आप अत्यधिक सूर्य कार्यान्वयन केंद्र लगते हैं। यदि आप सोचने से परेशान नहीं हो सकते कि अन्य संभावित वीएम कार्यान्वयन भी हैं, तो मुझे नहीं पता कि क्या कहना है। – TofuBeer

1

समान, 80! (संक्षेप में)

2

कुछ अन्य लोगों ने कम से कम कहा है, विधि क्रमबद्धता में संग्रहीत नहीं है।

आप निम्न उदाहरण के साथ इस उदाहरण में इसे दिखाने के लिए आसानी से एक परीक्षण कर सकते हैं।

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 


public class SerializationTest { 

    public static void main(String[] args) { 
     serialize(true); 
     serialize(false); 
    } 

    public static void serialize(boolean aOrB) { 
     FileOutputStream fos = null; 
     ObjectOutputStream out = null; 
     try { 
      fos = new FileOutputStream("output.txt"); 
      out = new ObjectOutputStream(fos); 
      out.writeObject(aOrB ? new A() : new B()); 
      out.close(); 
      fos.close(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
     File file = new File("output.txt"); 
     System.out.println(file.length()); 
    } 

    public static class A implements Serializable { 
     int a = 0; 
    } 

    public static class B implements Serializable { 
     int a = 0; 

     public int foo(int a) { 
      return a; 
     } 
    } 
} 

मेरे लिए इस बाहर प्रिंट

48 
48 
+4

सीरियलाइजेशन आवश्यक रूप से चल रहे वीएम के अंदर डेटा आवंटित करने के तरीके को प्रतिबिंबित नहीं करता है। – TofuBeer

11

भूमि के ऊपर ... कोई भी है।

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

+3

और मैं नीचे वोट नहीं समझता, क्योंकि उत्तर सटीक है। – Varkhan

+0

मुझे नहीं, लेकिन यह जवाब बिल्कुल सही नहीं है। विधि परिभाषाओं के रखरखाव में उपर है, भले ही ओवरहेड तय हो और उदाहरणों की संख्या पर निर्भर न हो। क्या हमारे पास दस लाख विधियां हो सकती हैं? यदि नहीं, तो उपरि मौजूद है। – Pacerier

2

दोनों कक्षाओं के ऑब्जेक्ट्स 32/64-बिट जेवीएम के लिए लगभग 20-24 बाइट्स का उपयोग करेंगे।

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