< prev index next >

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

Print this page

 67     Type type            = db.lookupType("InstanceKlass");
 68     annotations          = type.getAddressField("_annotations");
 69     arrayKlasses         = new MetadataField(type.getAddressField("_array_klasses"), 0);
 70     methods              = type.getAddressField("_methods");
 71     defaultMethods       = type.getAddressField("_default_methods");
 72     methodOrdering       = type.getAddressField("_method_ordering");
 73     localInterfaces      = type.getAddressField("_local_interfaces");
 74     transitiveInterfaces = type.getAddressField("_transitive_interfaces");
 75     fieldinfoStream      = type.getAddressField("_fieldinfo_stream");
 76     constants            = new MetadataField(type.getAddressField("_constants"), 0);
 77     sourceDebugExtension = type.getAddressField("_source_debug_extension");
 78     innerClasses         = type.getAddressField("_inner_classes");
 79     nestMembers          = type.getAddressField("_nest_members");
 80     nonstaticFieldSize   = new CIntField(type.getCIntegerField("_nonstatic_field_size"), 0);
 81     staticFieldSize      = new CIntField(type.getCIntegerField("_static_field_size"), 0);
 82     staticOopFieldCount  = new CIntField(type.getCIntegerField("_static_oop_field_count"), 0);
 83     nonstaticOopMapSize  = new CIntField(type.getCIntegerField("_nonstatic_oop_map_size"), 0);
 84     initState            = new CIntField(type.getCIntegerField("_init_state"), 0);
 85     itableLen            = new CIntField(type.getCIntegerField("_itable_len"), 0);
 86     nestHostIndex        = new CIntField(type.getCIntegerField("_nest_host_index"), 0);

 87     if (VM.getVM().isJvmtiSupported()) {
 88       breakpoints        = type.getAddressField("_breakpoints");
 89     }
 90     headerSize           = type.getSize();
 91 
 92     // read internal field flags constants
 93     FIELD_FLAG_IS_INITIALIZED      = db.lookupIntConstant("FieldInfo::FieldFlags::_ff_initialized");
 94     FIELD_FLAG_IS_INJECTED         = db.lookupIntConstant("FieldInfo::FieldFlags::_ff_injected");
 95     FIELD_FLAG_IS_GENERIC          = db.lookupIntConstant("FieldInfo::FieldFlags::_ff_generic");
 96     FIELD_FLAG_IS_STABLE           = db.lookupIntConstant("FieldInfo::FieldFlags::_ff_stable");
 97     FIELD_FLAG_IS_CONTENDED        = db.lookupIntConstant("FieldInfo::FieldFlags::_ff_contended");
 98 
 99 
100     // read ClassState constants
101     CLASS_STATE_ALLOCATED = db.lookupIntConstant("InstanceKlass::allocated").intValue();
102     CLASS_STATE_LOADED = db.lookupIntConstant("InstanceKlass::loaded").intValue();
103     CLASS_STATE_LINKED = db.lookupIntConstant("InstanceKlass::linked").intValue();
104     CLASS_STATE_BEING_INITIALIZED = db.lookupIntConstant("InstanceKlass::being_initialized").intValue();
105     CLASS_STATE_FULLY_INITIALIZED = db.lookupIntConstant("InstanceKlass::fully_initialized").intValue();
106     CLASS_STATE_INITIALIZATION_ERROR = db.lookupIntConstant("InstanceKlass::initialization_error").intValue();

133 
134   private static AddressField  annotations;
135   private static MetadataField arrayKlasses;
136   private static AddressField  methods;
137   private static AddressField  defaultMethods;
138   private static AddressField  methodOrdering;
139   private static AddressField  localInterfaces;
140   private static AddressField  transitiveInterfaces;
141   private static AddressField  fieldinfoStream;
142   private static MetadataField constants;
143   private static AddressField  sourceDebugExtension;
144   private static AddressField  innerClasses;
145   private static AddressField  nestMembers;
146   private static CIntField nonstaticFieldSize;
147   private static CIntField staticFieldSize;
148   private static CIntField staticOopFieldCount;
149   private static CIntField nonstaticOopMapSize;
150   private static CIntField initState;
151   private static CIntField itableLen;
152   private static CIntField nestHostIndex;

153   private static AddressField breakpoints;
154 
155   // type safe enum for ClassState from instanceKlass.hpp
156   public static class ClassState {
157      public static final ClassState ALLOCATED    = new ClassState("allocated");
158      public static final ClassState LOADED       = new ClassState("loaded");
159      public static final ClassState LINKED       = new ClassState("linked");
160      public static final ClassState BEING_INITIALIZED      = new ClassState("beingInitialized");
161      public static final ClassState FULLY_INITIALIZED    = new ClassState("fullyInitialized");
162      public static final ClassState INITIALIZATION_ERROR = new ClassState("initializationError");
163 
164      private ClassState(String value) {
165         this.value = value;
166      }
167 
168      public String toString() {
169         return value;
170      }
171 
172      private String value;

223         result |= JVMDIClassStatus.VERIFIED | JVMDIClassStatus.PREPARED;
224      }
225 
226      if (isInitialized()) {
227         if (Assert.ASSERTS_ENABLED) {
228            Assert.that(isLinked(), "Class status is not consistent");
229         }
230         result |= JVMDIClassStatus.INITIALIZED;
231      }
232 
233      if (isInErrorState()) {
234         result |= JVMDIClassStatus.ERROR;
235      }
236      return result;
237   }
238 
239   // Byteside of the header
240   private static long headerSize;
241 
242   public long getObjectSize(Oop object) {
243     return getSizeHelper() * VM.getVM().getAddressSize();








244   }
245 
246   public long getSize() { // in number of bytes
247     long wordLength = VM.getVM().getBytesPerWord();
248     long size = getHeaderSize() +
249                 (getVtableLen() +
250                  getItableLen() +
251                  getNonstaticOopMapSize()) * wordLength;
252     if (isInterface()) {
253       size += wordLength;
254     }
255     return alignSize(size);
256   }
257 
258   public static long getHeaderSize() { return headerSize; }
259 
260   // Each InstanceKlass mirror instance will cache the Field[] array after it is decoded,
261   // but since there can be multiple InstanceKlass mirror instances per hotspot InstanceKlass,
262   // we also have a global cache that uses the Address of the hotspot InstanceKlass as the key.
263   private Field[] fields;

357     return javaFieldsCount;
358   }
359 
360   public int getAllFieldsCount() {
361     if (allFieldsCount == -1) {
362       initFieldCounts();
363     }
364     return allFieldsCount;
365   }
366 
367   public KlassArray   getLocalInterfaces()      { return new KlassArray(localInterfaces.getValue(getAddress())); }
368   public KlassArray   getTransitiveInterfaces() { return new KlassArray(transitiveInterfaces.getValue(getAddress())); }
369   public ConstantPool getConstants()        { return (ConstantPool) constants.getValue(this); }
370   public Symbol    getSourceFileName()      { return                getConstants().getSourceFileName(); }
371   public String    getSourceDebugExtension(){ return                CStringUtilities.getString(sourceDebugExtension.getValue(getAddress())); }
372   public long      getNonstaticFieldSize()  { return                nonstaticFieldSize.getValue(this); }
373   public long      getStaticOopFieldCount() { return                staticOopFieldCount.getValue(this); }
374   public long      getNonstaticOopMapSize() { return                nonstaticOopMapSize.getValue(this); }
375   public long      getItableLen()           { return                itableLen.getValue(this); }
376   public short     getNestHostIndex()       { return                (short) nestHostIndex.getValue(this); }

377   public long      majorVersion()           { return                getConstants().majorVersion(); }
378   public long      minorVersion()           { return                getConstants().minorVersion(); }
379   public Symbol    getGenericSignature()    { return                getConstants().getGenericSignature(); }
380   // "size helper" == instance size in words
381   public long getSizeHelper() {
382     int lh = getLayoutHelper();
383     if (Assert.ASSERTS_ENABLED) {
384       Assert.that(lh > 0, "layout helper initialized for instance class");
385     }
386     return lh / VM.getVM().getAddressSize();
387   }
388   public Annotations  getAnnotations() {
389     Address addr = annotations.getValue(getAddress());
390     return VMObjectFactory.newObject(Annotations.class, addr);
391   }
392 
393   // same as enum InnerClassAttributeOffset in VM code.
394   private static class InnerClassAttributeOffset {
395     // from JVM spec. "InnerClasses" attribute
396     public static int innerClassInnerClassInfoOffset;

 67     Type type            = db.lookupType("InstanceKlass");
 68     annotations          = type.getAddressField("_annotations");
 69     arrayKlasses         = new MetadataField(type.getAddressField("_array_klasses"), 0);
 70     methods              = type.getAddressField("_methods");
 71     defaultMethods       = type.getAddressField("_default_methods");
 72     methodOrdering       = type.getAddressField("_method_ordering");
 73     localInterfaces      = type.getAddressField("_local_interfaces");
 74     transitiveInterfaces = type.getAddressField("_transitive_interfaces");
 75     fieldinfoStream      = type.getAddressField("_fieldinfo_stream");
 76     constants            = new MetadataField(type.getAddressField("_constants"), 0);
 77     sourceDebugExtension = type.getAddressField("_source_debug_extension");
 78     innerClasses         = type.getAddressField("_inner_classes");
 79     nestMembers          = type.getAddressField("_nest_members");
 80     nonstaticFieldSize   = new CIntField(type.getCIntegerField("_nonstatic_field_size"), 0);
 81     staticFieldSize      = new CIntField(type.getCIntegerField("_static_field_size"), 0);
 82     staticOopFieldCount  = new CIntField(type.getCIntegerField("_static_oop_field_count"), 0);
 83     nonstaticOopMapSize  = new CIntField(type.getCIntegerField("_nonstatic_oop_map_size"), 0);
 84     initState            = new CIntField(type.getCIntegerField("_init_state"), 0);
 85     itableLen            = new CIntField(type.getCIntegerField("_itable_len"), 0);
 86     nestHostIndex        = new CIntField(type.getCIntegerField("_nest_host_index"), 0);
 87     hashOffset           = new CIntField(type.getCIntegerField("_hash_offset"), 0);
 88     if (VM.getVM().isJvmtiSupported()) {
 89       breakpoints        = type.getAddressField("_breakpoints");
 90     }
 91     headerSize           = type.getSize();
 92 
 93     // read internal field flags constants
 94     FIELD_FLAG_IS_INITIALIZED      = db.lookupIntConstant("FieldInfo::FieldFlags::_ff_initialized");
 95     FIELD_FLAG_IS_INJECTED         = db.lookupIntConstant("FieldInfo::FieldFlags::_ff_injected");
 96     FIELD_FLAG_IS_GENERIC          = db.lookupIntConstant("FieldInfo::FieldFlags::_ff_generic");
 97     FIELD_FLAG_IS_STABLE           = db.lookupIntConstant("FieldInfo::FieldFlags::_ff_stable");
 98     FIELD_FLAG_IS_CONTENDED        = db.lookupIntConstant("FieldInfo::FieldFlags::_ff_contended");
 99 
100 
101     // read ClassState constants
102     CLASS_STATE_ALLOCATED = db.lookupIntConstant("InstanceKlass::allocated").intValue();
103     CLASS_STATE_LOADED = db.lookupIntConstant("InstanceKlass::loaded").intValue();
104     CLASS_STATE_LINKED = db.lookupIntConstant("InstanceKlass::linked").intValue();
105     CLASS_STATE_BEING_INITIALIZED = db.lookupIntConstant("InstanceKlass::being_initialized").intValue();
106     CLASS_STATE_FULLY_INITIALIZED = db.lookupIntConstant("InstanceKlass::fully_initialized").intValue();
107     CLASS_STATE_INITIALIZATION_ERROR = db.lookupIntConstant("InstanceKlass::initialization_error").intValue();

134 
135   private static AddressField  annotations;
136   private static MetadataField arrayKlasses;
137   private static AddressField  methods;
138   private static AddressField  defaultMethods;
139   private static AddressField  methodOrdering;
140   private static AddressField  localInterfaces;
141   private static AddressField  transitiveInterfaces;
142   private static AddressField  fieldinfoStream;
143   private static MetadataField constants;
144   private static AddressField  sourceDebugExtension;
145   private static AddressField  innerClasses;
146   private static AddressField  nestMembers;
147   private static CIntField nonstaticFieldSize;
148   private static CIntField staticFieldSize;
149   private static CIntField staticOopFieldCount;
150   private static CIntField nonstaticOopMapSize;
151   private static CIntField initState;
152   private static CIntField itableLen;
153   private static CIntField nestHostIndex;
154   private static CIntField hashOffset;
155   private static AddressField breakpoints;
156 
157   // type safe enum for ClassState from instanceKlass.hpp
158   public static class ClassState {
159      public static final ClassState ALLOCATED    = new ClassState("allocated");
160      public static final ClassState LOADED       = new ClassState("loaded");
161      public static final ClassState LINKED       = new ClassState("linked");
162      public static final ClassState BEING_INITIALIZED      = new ClassState("beingInitialized");
163      public static final ClassState FULLY_INITIALIZED    = new ClassState("fullyInitialized");
164      public static final ClassState INITIALIZATION_ERROR = new ClassState("initializationError");
165 
166      private ClassState(String value) {
167         this.value = value;
168      }
169 
170      public String toString() {
171         return value;
172      }
173 
174      private String value;

225         result |= JVMDIClassStatus.VERIFIED | JVMDIClassStatus.PREPARED;
226      }
227 
228      if (isInitialized()) {
229         if (Assert.ASSERTS_ENABLED) {
230            Assert.that(isLinked(), "Class status is not consistent");
231         }
232         result |= JVMDIClassStatus.INITIALIZED;
233      }
234 
235      if (isInErrorState()) {
236         result |= JVMDIClassStatus.ERROR;
237      }
238      return result;
239   }
240 
241   // Byteside of the header
242   private static long headerSize;
243 
244   public long getObjectSize(Oop object) {
245     long baseSize = getSizeHelper() * VM.getVM().getAddressSize();
246     if (VM.getVM().isCompactObjectHeadersEnabled()) {
247       Mark mark = object.getMark();
248       if (mark.isExpanded() && (getHashOffset() + 4 /* size of hash field */) > baseSize) {
249         // Needs extra word for identity hash-code.
250         return baseSize + VM.getVM().getBytesPerWord();
251       }
252     }
253     return baseSize;
254   }
255 
256   public long getSize() { // in number of bytes
257     long wordLength = VM.getVM().getBytesPerWord();
258     long size = getHeaderSize() +
259                 (getVtableLen() +
260                  getItableLen() +
261                  getNonstaticOopMapSize()) * wordLength;
262     if (isInterface()) {
263       size += wordLength;
264     }
265     return alignSize(size);
266   }
267 
268   public static long getHeaderSize() { return headerSize; }
269 
270   // Each InstanceKlass mirror instance will cache the Field[] array after it is decoded,
271   // but since there can be multiple InstanceKlass mirror instances per hotspot InstanceKlass,
272   // we also have a global cache that uses the Address of the hotspot InstanceKlass as the key.
273   private Field[] fields;

367     return javaFieldsCount;
368   }
369 
370   public int getAllFieldsCount() {
371     if (allFieldsCount == -1) {
372       initFieldCounts();
373     }
374     return allFieldsCount;
375   }
376 
377   public KlassArray   getLocalInterfaces()      { return new KlassArray(localInterfaces.getValue(getAddress())); }
378   public KlassArray   getTransitiveInterfaces() { return new KlassArray(transitiveInterfaces.getValue(getAddress())); }
379   public ConstantPool getConstants()        { return (ConstantPool) constants.getValue(this); }
380   public Symbol    getSourceFileName()      { return                getConstants().getSourceFileName(); }
381   public String    getSourceDebugExtension(){ return                CStringUtilities.getString(sourceDebugExtension.getValue(getAddress())); }
382   public long      getNonstaticFieldSize()  { return                nonstaticFieldSize.getValue(this); }
383   public long      getStaticOopFieldCount() { return                staticOopFieldCount.getValue(this); }
384   public long      getNonstaticOopMapSize() { return                nonstaticOopMapSize.getValue(this); }
385   public long      getItableLen()           { return                itableLen.getValue(this); }
386   public short     getNestHostIndex()       { return                (short) nestHostIndex.getValue(this); }
387   public long      getHashOffset()          { return                hashOffset.getValue(this); }
388   public long      majorVersion()           { return                getConstants().majorVersion(); }
389   public long      minorVersion()           { return                getConstants().minorVersion(); }
390   public Symbol    getGenericSignature()    { return                getConstants().getGenericSignature(); }
391   // "size helper" == instance size in words
392   public long getSizeHelper() {
393     int lh = getLayoutHelper();
394     if (Assert.ASSERTS_ENABLED) {
395       Assert.that(lh > 0, "layout helper initialized for instance class");
396     }
397     return lh / VM.getVM().getAddressSize();
398   }
399   public Annotations  getAnnotations() {
400     Address addr = annotations.getValue(getAddress());
401     return VMObjectFactory.newObject(Annotations.class, addr);
402   }
403 
404   // same as enum InnerClassAttributeOffset in VM code.
405   private static class InnerClassAttributeOffset {
406     // from JVM spec. "InnerClasses" attribute
407     public static int innerClassInnerClassInfoOffset;
< prev index next >