2014-10-14 7 views
27

क्या आप मुझे ऑब्जेक्ट हेडर में बिल्कुल संग्रहीत करने के बारे में कुछ जानकारी दे सकते हैं? मुझे पता है, यह शायद जेवीएम निर्भर है, लेकिन शायद कम से कम हॉटस्पॉट के लिए? मैं विशेष रूप से पहली पंक्ति के लिए सटीक विवरण की तलाश में हूं।जावा ऑब्जेक्ट हेडर में क्या है

मैंने कई सूचनाएं पढ़ी हैं जिन्हें मैं ढूंढने वाली जानकारी के साथ सकारात्मक रूप से सत्यापित नहीं कर सकता। हो सकता है कि आपके पास ओपनजेडीके विकी का लिंक हो जो यह सब कहता है?

उत्तर

31

हॉटस्पॉट के लिए:

वस्तु हैडर एक निशान शब्द और एक klass सूचक के होते हैं।

निशान शब्दklass सूचक32 bit आर्किटेक्चर पर शब्द आकार की है शब्द आकार (4 byte 32 पर बिट आर्किटेक्चर, 8 byte 64 पर बिट आर्किटेक्चर) और

है। 64 bit आर्किटेक्चर पर क्लास पॉइंटर के पास शब्द का आकार होता है, लेकिन 4 byte भी हो सकता है यदि ढेर पते को 4 bytes में एन्कोड किया जा सकता है।

इस अनुकूलन को "संपीड़ित ओप्स" कहा जाता है और आप UseCompressedOops विकल्प के साथ इसे नियंत्रित भी कर सकते हैं।

आप इस 1 के बारे में विकी प्रविष्टि भी पा सकते हैं।

शब्द वास्तव में कई चीजों के लिए उपयोग किया जाता है।

  1. एक Biased Locking2 है जिसके माध्यम से हॉटस्पॉट कुशल लॉकिंग को कार्यान्वित कर सकता है।
  2. यह GC to set forward pointers, और to store the age of the objects के दौरान भी उपयोग किया जाता है। किसी वस्तु का पहचान हैश कोड चिह्न के अंदर संग्रहीत किया जा सकता है (System.identityHashCode/Object.hashCode एक)।

    // 32 bits: 
    // -------- 
    //    hash:25 ------------>| age:4 biased_lock:1 lock:2 (normal object) 
    //    JavaThread*:23 epoch:2 age:4 biased_lock:1 lock:2 (biased object) 
    //    size:32 ------------------------------------------>| (CMS free block) 
    //    PromotedObject*:29 ---------->| promo_bits:3 ----->| (CMS promoted object) 
    // 
    // 64 bits: 
    // -------- 
    // unused:25 hash:31 -->| unused:1 age:4 biased_lock:1 lock:2 (normal object) 
    // JavaThread*:54 epoch:2 unused:1 age:4 biased_lock:1 lock:2 (biased object) 
    // PromotedObject*:61 --------------------->| promo_bits:3 ----->| (CMS promoted object) 
    // size:64 ----------------------------------------------------->| (CMS free block) 
    // 
    // unused:25 hash:31 -->| cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && normal object) 
    // JavaThread*:54 epoch:2 cms_free:1 age:4 biased_lock:1 lock:2 (COOPs && biased object) 
    // narrowOop:32 unused:24 cms_free:1 unused:4 promo_bits:3 ----->| (COOPs && CMS promoted object) 
    // unused:21 size:35 -->| cms_free:1 unused:7 ------------------>| (COOPs && CMS free block) 
    

    तुम भी OOP हेडर फाइल here पा सकते हैं:

markOop.hpp के स्रोत कोड है कि वास्तुकला के आधार पर लेआउट का वर्णन करता है में एक टिप्पणी है।

+3

"OOP" * साधारण वस्तु सूचक के लिए खड़ा है * – user2418306

1

आप HotSpot sources से ऑब्जेक्ट लेआउट पा सकते हैं।

शीर्षलेख में markOop होता है जिसके बाद पॉइंटर (या संपीड़ित सूचक) instanceKlass पर होता है। http://www.slideshare.net/cnbailey/memory-efficient-java

किसी भी वस्तु के लिए वास्तविक हैडर JVM विक्रेता, संस्करण और ऑब्जेक्ट प्रकार विशिष्ट है:

3

निम्नलिखित प्रस्तुति आप वस्तु सामग्री की एक सामान्य विचार और वस्तु हैडर देता है।

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