< prev index next >

src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java

Print this page
*** 82,10 ***
--- 82,11 ---
      staticOopFieldCount  = new CIntField(type.getCIntegerField("_static_oop_field_count"), 0);
      nonstaticOopMapSize  = new CIntField(type.getCIntegerField("_nonstatic_oop_map_size"), 0);
      initState            = new CIntField(type.getCIntegerField("_init_state"), 0);
      itableLen            = new CIntField(type.getCIntegerField("_itable_len"), 0);
      nestHostIndex        = new CIntField(type.getCIntegerField("_nest_host_index"), 0);
+     hashOffset           = new CIntField(type.getCIntegerField("_hash_offset"), 0);
      if (VM.getVM().isJvmtiSupported()) {
        breakpoints        = type.getAddressField("_breakpoints");
      }
      headerSize           = type.getSize();
  

*** 148,10 ***
--- 149,11 ---
    private static CIntField staticOopFieldCount;
    private static CIntField nonstaticOopMapSize;
    private static CIntField initState;
    private static CIntField itableLen;
    private static CIntField nestHostIndex;
+   private static CIntField hashOffset;
    private static AddressField breakpoints;
  
    // type safe enum for ClassState from instanceKlass.hpp
    public static class ClassState {
       public static final ClassState ALLOCATED    = new ClassState("allocated");

*** 238,11 ***
  
    // Byteside of the header
    private static long headerSize;
  
    public long getObjectSize(Oop object) {
!     return getSizeHelper() * VM.getVM().getAddressSize();
    }
  
    public long getSize() { // in number of bytes
      long wordLength = VM.getVM().getBytesPerWord();
      long size = getHeaderSize() +
--- 240,19 ---
  
    // Byteside of the header
    private static long headerSize;
  
    public long getObjectSize(Oop object) {
!     long baseSize = getSizeHelper() * VM.getVM().getAddressSize();
+     if (VM.getVM().isCompactObjectHeadersEnabled()) {
+       Mark mark = object.getMark();
+       if (mark.isExpanded() && (getHashOffset() + 4 /* size of hash field */) > baseSize) {
+         // Needs extra word for identity hash-code.
+         return baseSize + VM.getVM().getBytesPerWord();
+       }
+     }
+     return baseSize;
    }
  
    public long getSize() { // in number of bytes
      long wordLength = VM.getVM().getBytesPerWord();
      long size = getHeaderSize() +

*** 372,10 ***
--- 382,11 ---
    public long      getNonstaticFieldSize()  { return                nonstaticFieldSize.getValue(this); }
    public long      getStaticOopFieldCount() { return                staticOopFieldCount.getValue(this); }
    public long      getNonstaticOopMapSize() { return                nonstaticOopMapSize.getValue(this); }
    public long      getItableLen()           { return                itableLen.getValue(this); }
    public short     getNestHostIndex()       { return                (short) nestHostIndex.getValue(this); }
+   public long      getHashOffset()          { return                hashOffset.getValue(this); }
    public long      majorVersion()           { return                getConstants().majorVersion(); }
    public long      minorVersion()           { return                getConstants().minorVersion(); }
    public Symbol    getGenericSignature()    { return                getConstants().getGenericSignature(); }
    // "size helper" == instance size in words
    public long getSizeHelper() {
< prev index next >