2012-04-29 12 views
6

मैंने कुछ बनाम इंट बनाम इंटीजर, लम्बी बनाम लांग, खाली वर्ग उदाहरण बनाम क्लास इंस्टेंस के साथ लंबे मूल्य के प्रदर्शन की तुलना की।28 बाइट्स?

और मैं कुछ सवाल है जो मैं अपने आप को उत्तर नहीं दे सकता है:

  1. क्यों खाली वर्ग या वस्तु के instantiating 28 बाइट्स लेता है?
  2. लांग ऑब्जेक्ट की तत्कालता 2 9 बाइट्स, आदिम लंबे 8 बाइट्स लेती है, तो खाली कक्षा में अंतर केवल 1 बाइट क्यों है? JVM क्या अनुकूलन है?

मैं MacOS पर JDK1.6.0_30 इस्तेमाल किया, और कोड

जवाब के लिए धन्यवाद (आप पूरी परियोजना चेकआउट कर सकते हैं) https://github.com/mousator/benchmarks/blob/master/src/sk/emandem/michal/AutoboxingTypeBenchmark.java पर उपलब्ध है!

उत्तर

2
  1. मैं आपकी स्मृति माप तकनीक पर भरोसा नहीं करता। बस runtime.gc() पर कॉल करना जरूरी नहीं है। MemoryMeasurer जैसे टूल का उपयोग करें।
  2. Arrays स्वयं के ऊपर की ओर लेते हैं: आमतौर पर 12 बाइट्स के क्रम पर; ऑब्जेक्ट हेडर के लिए आठ और सरणी लंबाई के लिए चार, और फिर संदर्भ के लिए चार बाइट प्रति सरणी प्रविष्टि। (यह 32-बिट वीएम पर है।)
+0

उत्तर @Louis के लिए धन्यवाद। मैंने मेमोरी मेजरर की कोशिश की, खाली कक्षा के लिए मुझे 20 बाइट मिल रहे हैं, इसलिए सरणी सूचक के रूप में 4 बाइट्स और उदाहरण के लिए 16 (हालांकि 16 अजीब अजीब)। हालांकि, रनटाइम विधि दिलचस्प है क्योंकि यह काफी स्थिर माप का उत्पादन कर रही है - अनुक्रम की पुनरावृत्ति पुनरावृत्ति "जीसी का आह्वान करें, स्मृति मापें, कॉल कोड, माप माप, जीसी का आह्वान करें" समान मान प्राप्त करें। रनटाइम और मेमोरीमेजर का उपयोग करने के बीच माप में एकमात्र अंतर खाली वर्ग और इंट रैपर (दोनों 25 बी बनाम 20 बी) – mousator

+0

में दर्ज किया गया है, मैंने एंटर दबाया .. तो बाद में सवाल यह है कि क्या मैं 20 या 25 बी का उपयोग करके ओओएमई का अनुमान लगा सकता हूं? – mousator

+0

उह। मैं इस पर निर्भर नहीं होगा। कोशिश करने और देखने के लिए बस इतना आसान है। –

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