2010-06-12 5 views
6

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

उत्तर

6

आखिरकार, प्रत्येक जावा ऑब्जेक्ट अपनी कक्षा को जानता है और इसके साथ सिंक्रनाइज़ेशन आदिम वैकल्पिक रूप से जुड़ा हुआ है (हालांकि this सिंथेटिक हो सकता है)। यह दो संदर्भ हैं जिन्हें बिना java.lang.Object उदाहरण बनाना मुश्किल है। बाकी सब कुछ उस वर्ग से निकला है, इसलिए आपके पास लागत के लिए एक मंजिल है जो कम से कम 8 bytes in Java 1.3.1 होने के लिए काम करता है। यदि आपको वास्तव में उनकी ज़रूरत है तो एक प्रोफाइलर आपको वर्तमान लागत बताएगा।

+0

+1 बहुत अच्छे लिंक के लिए – Arne

+1

एक आधुनिक जेवीएम ऑब्जेक्ट मॉनिटर डेटा को अन्य पॉइंटर्स के अप्रयुक्त बिट्स में रखता है (उदाहरण के लिए क्लास पॉइंटर के नीचे दो बिट्स) – dty

+0

@ डैनी: इसमें तीन बिट उपलब्ध हैं; "आधुनिक" मेमोरी मैनेजर 8-बाइट सीमाओं पर संरेखित होते हैं (जब सरणी के साथ काम नहीं करते हैं, जो घनत्व होते हैं)। और "आधुनिक" से मेरा मतलब है * सबकुछ * 10 साल या उससे अधिक के लिए। –

4

हां, ऐसा करता है, क्योंकि कम से कम एक "खाली" ऑब्जेक्ट में इसकी प्रकार की जानकारी के लिए सूचक होता है।

+0

आप सही हैं। यही कारण है कि मैंने प्रश्न में उल्लेख किया था कि ऑब्जेक्ट संदर्भ/सूचक को छोड़कर। तो संदर्भ/बिंदु के अलावा क्या इसमें कोई स्मृति पदचिह्न है? –

+3

जेवीएम कार्यान्वयन पर निर्भर करता है। संभवतः प्रति-ऑब्जेक्ट सिंक्रनाइज़ेशन तंत्र, या कचरा कलेक्टर के लिए मार्कर झंडे के कुछ प्रकार होंगे। मेरा सबसे अच्छा अनुमान 32-बिट मशीन पर प्रति-ऑब्जेक्ट ओवरहेड के कम से कम 8 बाइट होगा। –

+1

32 बिट जेवीएम के लिए ओवरहेड 16 बाइट्स तक हो सकता है ... JVM कार्यान्वयन विवरण के आधार पर। उपरांत में आदिम वस्तु का आकार, वर्ग का लिंक, आदिम म्यूटेक्स का प्रतिनिधित्व, पहचान हैशकोड का प्रतिनिधित्व, अंतिम रूप देने के लिए झंडे आदि शामिल हैं। –

3

चलो स्पष्ट हो जाएं। आपके ऑब्जेक्ट के संदर्भ, निश्चित रूप से, जगह ले लेंगे। लेकिन आपकी वस्तु इसके 'सूचक' के लिए भी जगह लेगी (यानी आप अलग-अलग उदाहरणों को अलग कर सकते हैं) और किसी भी सुपरक्लास के लिए भी - उदाहरण के लिए ऑब्जेक्ट - और अंततः ढेर के आंतरिक डेटास्ट्रक्चर के ऊपर जो भी ऊपर है।

+0

ऑब्जेक्ट्स को "यह" पॉइंटर स्टोर करने की आवश्यकता नहीं है (क्योंकि कोड को ऑब्जेक्ट तक पहुंचने के लिए पहले से ही यह पॉइंटर उपलब्ध होना चाहिए ....) – mikera

+0

हां वे करते हैं। उन्हें एक पॉइंटर की आवश्यकता होती है जिसे सी ++ में वर्चुअल विधि तालिका कहा जाएगा। वास्तविक परीक्षण के लिए – dty

2

बेंचमार्किंग स्मृति क्योंकि हस्तक्षेप (बढ़ रही है ढेर, जीसी) के विभिन्न स्रोतों के लिए मुश्किल है, लेकिन यह अभी भी लायक एक कोशिश है:

public static void main(String[] args) 
{ 
    final int n = 1000000; 

    final Runtime runtime = Runtime.getRuntime(); 

    final Object[] objects = new Object[n]; 

    final long memory0 = runtime.totalMemory() - runtime.freeMemory(); 

    for (int i = 0; i < objects.length; i++) 
    { 
     objects[i] = new Object(); 
    } 

    final long memory1 = runtime.totalMemory() - runtime.freeMemory(); 

    final long memory = memory1 - memory0; 

    System.out.printf(
     "%s %s\n", 
     System.getProperty("java.vm.name"), 
     System.getProperty("java.vm.version")); 

    System.out.printf("%d %d %.1f\n", n, memory, 1.0 * memory/n); 
} 

जावा हॉटस्पॉट (टीएम) सर्वर वी एम 14.3-B01 1000000 8,000,336 8.0

+0

+1 !! – mikera

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