मेरा प्रश्न डेटा सदस्य के बिना जावा में स्मृति पदचिह्न से संबंधित है। मान लीजिए कि जावा में मेरे पास एक वर्ग है जिसमें डेटा सदस्य नहीं है और इसमें केवल विधियां हैं। तो अगर मैं विशेष वर्ग का उदाहरण बना रहा हूं तो क्या यह ऑब्जेक्ट रेफरेंस मेमोरी को छोड़कर प्राथमिक मेमोरी में मेमोरी पर कब्जा करता है?क्या डेटा सदस्य के बिना कक्षा में जावा में मेमोरी पदचिह्न है?
उत्तर
आखिरकार, प्रत्येक जावा ऑब्जेक्ट अपनी कक्षा को जानता है और इसके साथ सिंक्रनाइज़ेशन आदिम वैकल्पिक रूप से जुड़ा हुआ है (हालांकि this
सिंथेटिक हो सकता है)। यह दो संदर्भ हैं जिन्हें बिना java.lang.Object
उदाहरण बनाना मुश्किल है। बाकी सब कुछ उस वर्ग से निकला है, इसलिए आपके पास लागत के लिए एक मंजिल है जो कम से कम 8 bytes in Java 1.3.1 होने के लिए काम करता है। यदि आपको वास्तव में उनकी ज़रूरत है तो एक प्रोफाइलर आपको वर्तमान लागत बताएगा।
हां, ऐसा करता है, क्योंकि कम से कम एक "खाली" ऑब्जेक्ट में इसकी प्रकार की जानकारी के लिए सूचक होता है।
आप सही हैं। यही कारण है कि मैंने प्रश्न में उल्लेख किया था कि ऑब्जेक्ट संदर्भ/सूचक को छोड़कर। तो संदर्भ/बिंदु के अलावा क्या इसमें कोई स्मृति पदचिह्न है? –
जेवीएम कार्यान्वयन पर निर्भर करता है। संभवतः प्रति-ऑब्जेक्ट सिंक्रनाइज़ेशन तंत्र, या कचरा कलेक्टर के लिए मार्कर झंडे के कुछ प्रकार होंगे। मेरा सबसे अच्छा अनुमान 32-बिट मशीन पर प्रति-ऑब्जेक्ट ओवरहेड के कम से कम 8 बाइट होगा। –
32 बिट जेवीएम के लिए ओवरहेड 16 बाइट्स तक हो सकता है ... JVM कार्यान्वयन विवरण के आधार पर। उपरांत में आदिम वस्तु का आकार, वर्ग का लिंक, आदिम म्यूटेक्स का प्रतिनिधित्व, पहचान हैशकोड का प्रतिनिधित्व, अंतिम रूप देने के लिए झंडे आदि शामिल हैं। –
चलो स्पष्ट हो जाएं। आपके ऑब्जेक्ट के संदर्भ, निश्चित रूप से, जगह ले लेंगे। लेकिन आपकी वस्तु इसके 'सूचक' के लिए भी जगह लेगी (यानी आप अलग-अलग उदाहरणों को अलग कर सकते हैं) और किसी भी सुपरक्लास के लिए भी - उदाहरण के लिए ऑब्जेक्ट - और अंततः ढेर के आंतरिक डेटास्ट्रक्चर के ऊपर जो भी ऊपर है।
बेंचमार्किंग स्मृति क्योंकि हस्तक्षेप (बढ़ रही है ढेर, जीसी) के विभिन्न स्रोतों के लिए मुश्किल है, लेकिन यह अभी भी लायक एक कोशिश है:
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
+1 !! – mikera
- 1. जावा एप्लिकेशन के लिए मेमोरी पदचिह्न
- 2. विधि गहन जावा ऑब्जेक्ट की मेमोरी पदचिह्न क्या है?
- 3. हास्केल डेटा प्रकारों की मेमोरी पदचिह्न
- 4. ऐप्पल मैप्स मेमोरी पदचिह्न
- 5. क्या कक्षा में वर्चुअल डेटा सदस्य हो सकते हैं?
- 6. एकाधिक .NET प्रक्रिया मेमोरी पदचिह्न
- 7. जावा कम स्मृति पदचिह्न
- 8. सी प्रोग्रामों में मेमोरी पदचिह्न को कम करना
- 9. मेमोरी में संवेदनशील डेटा
- 10. क्या सी # में कक्षा के बिना ऑब्जेक्ट बनाना संभव है?
- 11. आईओएस मेमोरी पदचिह्न के लिए सही आंकड़ा क्या है। लाइव बाइट्स? असली मेमोरी? अन्य?
- 12. जावा एन्क्रिप्टेड मेमोरी कक्षा लोडर
- 13. कक्षा सदस्य प्रारंभिकरण के रूप में संदर्भ
- 14. सीएलआर कक्षा मेमोरी लेआउट
- 15. कक्षा के सदस्य
- 16. जावा में कक्षा का आविष्कार क्या है?
- 17. जावा में कक्षा शाब्दिक क्या है?
- 18. जावास्क्रिप्ट मॉड्यूल पैटर्न मेमोरी पदचिह्न और प्रदर्शन
- 19. मेमोरी में डेटा संग्रहीत
- 20. .NET में रनटाइम पर किसी ऑब्जेक्ट की मेमोरी पदचिह्न क्या है?
- 21. डीएलआर की स्मृति पदचिह्न क्या है?
- 22. जावा मेमोरी प्रबंधन में, 'पीएस' के लिए क्या खड़ा है?
- 23. कक्षा वर्ग [बी जावा में क्या दर्शाता है?
- 24. पायथन बनाम जावा रनटाइम पदचिह्न
- 25. जावा विधि का मेमोरी ओवरहेड क्या है?
- 26. टॉमकैट "प्रति कनेक्शन" मेमोरी पदचिह्न को कम करें
- 27. क्या जावा में "LinkedConcurrentHashMap" डेटा संरचना है?
- 28. डी में कक्षा मॉनिटर क्या है?
- 29. कक्षा और उसके सदस्य
- 30. क्या जावा में जटिल संख्या के लिए कक्षा है?
+1 बहुत अच्छे लिंक के लिए – Arne
एक आधुनिक जेवीएम ऑब्जेक्ट मॉनिटर डेटा को अन्य पॉइंटर्स के अप्रयुक्त बिट्स में रखता है (उदाहरण के लिए क्लास पॉइंटर के नीचे दो बिट्स) – dty
@ डैनी: इसमें तीन बिट उपलब्ध हैं; "आधुनिक" मेमोरी मैनेजर 8-बाइट सीमाओं पर संरेखित होते हैं (जब सरणी के साथ काम नहीं करते हैं, जो घनत्व होते हैं)। और "आधुनिक" से मेरा मतलब है * सबकुछ * 10 साल या उससे अधिक के लिए। –