comparison agent/src/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java @ 2177:3582bf76420e

6990754: Use native memory and reference counting to implement SymbolTable Summary: move symbols from permgen into C heap and reference count them Reviewed-by: never, acorn, jmasa, stefank
author coleenp
date Thu, 27 Jan 2011 16:11:27 -0800
parents c18cbe5936b8
children c7f3d0b4570f
comparison
equal deleted inserted replaced
2176:27e4ea99855d 2177:3582bf76420e
80 fields = new OopField(type.getOopField("_fields"), Oop.getHeaderSize()); 80 fields = new OopField(type.getOopField("_fields"), Oop.getHeaderSize());
81 constants = new OopField(type.getOopField("_constants"), Oop.getHeaderSize()); 81 constants = new OopField(type.getOopField("_constants"), Oop.getHeaderSize());
82 classLoader = new OopField(type.getOopField("_class_loader"), Oop.getHeaderSize()); 82 classLoader = new OopField(type.getOopField("_class_loader"), Oop.getHeaderSize());
83 protectionDomain = new OopField(type.getOopField("_protection_domain"), Oop.getHeaderSize()); 83 protectionDomain = new OopField(type.getOopField("_protection_domain"), Oop.getHeaderSize());
84 signers = new OopField(type.getOopField("_signers"), Oop.getHeaderSize()); 84 signers = new OopField(type.getOopField("_signers"), Oop.getHeaderSize());
85 sourceFileName = new OopField(type.getOopField("_source_file_name"), Oop.getHeaderSize()); 85 sourceFileName = type.getAddressField("_source_file_name");
86 sourceDebugExtension = new OopField(type.getOopField("_source_debug_extension"), Oop.getHeaderSize()); 86 sourceDebugExtension = type.getAddressField("_source_debug_extension");
87 innerClasses = new OopField(type.getOopField("_inner_classes"), Oop.getHeaderSize()); 87 innerClasses = new OopField(type.getOopField("_inner_classes"), Oop.getHeaderSize());
88 nonstaticFieldSize = new CIntField(type.getCIntegerField("_nonstatic_field_size"), Oop.getHeaderSize()); 88 nonstaticFieldSize = new CIntField(type.getCIntegerField("_nonstatic_field_size"), Oop.getHeaderSize());
89 staticFieldSize = new CIntField(type.getCIntegerField("_static_field_size"), Oop.getHeaderSize()); 89 staticFieldSize = new CIntField(type.getCIntegerField("_static_field_size"), Oop.getHeaderSize());
90 staticOopFieldSize = new CIntField(type.getCIntegerField("_static_oop_field_size"), Oop.getHeaderSize()); 90 staticOopFieldSize = new CIntField(type.getCIntegerField("_static_oop_field_size"), Oop.getHeaderSize());
91 nonstaticOopMapSize = new CIntField(type.getCIntegerField("_nonstatic_oop_map_size"), Oop.getHeaderSize()); 91 nonstaticOopMapSize = new CIntField(type.getCIntegerField("_nonstatic_oop_map_size"), Oop.getHeaderSize());
92 isMarkedDependent = new CIntField(type.getCIntegerField("_is_marked_dependent"), Oop.getHeaderSize()); 92 isMarkedDependent = new CIntField(type.getCIntegerField("_is_marked_dependent"), Oop.getHeaderSize());
93 initState = new CIntField(type.getCIntegerField("_init_state"), Oop.getHeaderSize()); 93 initState = new CIntField(type.getCIntegerField("_init_state"), Oop.getHeaderSize());
94 vtableLen = new CIntField(type.getCIntegerField("_vtable_len"), Oop.getHeaderSize()); 94 vtableLen = new CIntField(type.getCIntegerField("_vtable_len"), Oop.getHeaderSize());
95 itableLen = new CIntField(type.getCIntegerField("_itable_len"), Oop.getHeaderSize()); 95 itableLen = new CIntField(type.getCIntegerField("_itable_len"), Oop.getHeaderSize());
96 breakpoints = type.getAddressField("_breakpoints"); 96 breakpoints = type.getAddressField("_breakpoints");
97 genericSignature = new OopField(type.getOopField("_generic_signature"), Oop.getHeaderSize()); 97 genericSignature = type.getAddressField("_generic_signature");
98 majorVersion = new CIntField(type.getCIntegerField("_major_version"), Oop.getHeaderSize()); 98 majorVersion = new CIntField(type.getCIntegerField("_major_version"), Oop.getHeaderSize());
99 minorVersion = new CIntField(type.getCIntegerField("_minor_version"), Oop.getHeaderSize()); 99 minorVersion = new CIntField(type.getCIntegerField("_minor_version"), Oop.getHeaderSize());
100 headerSize = alignObjectOffset(Oop.getHeaderSize() + type.getSize()); 100 headerSize = alignObjectOffset(Oop.getHeaderSize() + type.getSize());
101 101
102 // read field offset constants 102 // read field offset constants
133 private static OopField fields; 133 private static OopField fields;
134 private static OopField constants; 134 private static OopField constants;
135 private static OopField classLoader; 135 private static OopField classLoader;
136 private static OopField protectionDomain; 136 private static OopField protectionDomain;
137 private static OopField signers; 137 private static OopField signers;
138 private static OopField sourceFileName; 138 private static AddressField sourceFileName;
139 private static OopField sourceDebugExtension; 139 private static AddressField sourceDebugExtension;
140 private static OopField innerClasses; 140 private static OopField innerClasses;
141 private static CIntField nonstaticFieldSize; 141 private static CIntField nonstaticFieldSize;
142 private static CIntField staticFieldSize; 142 private static CIntField staticFieldSize;
143 private static CIntField staticOopFieldSize; 143 private static CIntField staticOopFieldSize;
144 private static CIntField nonstaticOopMapSize; 144 private static CIntField nonstaticOopMapSize;
145 private static CIntField isMarkedDependent; 145 private static CIntField isMarkedDependent;
146 private static CIntField initState; 146 private static CIntField initState;
147 private static CIntField vtableLen; 147 private static CIntField vtableLen;
148 private static CIntField itableLen; 148 private static CIntField itableLen;
149 private static AddressField breakpoints; 149 private static AddressField breakpoints;
150 private static OopField genericSignature; 150 private static AddressField genericSignature;
151 private static CIntField majorVersion; 151 private static CIntField majorVersion;
152 private static CIntField minorVersion; 152 private static CIntField minorVersion;
153 153
154 // type safe enum for ClassState from instanceKlass.hpp 154 // type safe enum for ClassState from instanceKlass.hpp
155 public static class ClassState { 155 public static class ClassState {
255 public TypeArray getFields() { return (TypeArray) fields.getValue(this); } 255 public TypeArray getFields() { return (TypeArray) fields.getValue(this); }
256 public ConstantPool getConstants() { return (ConstantPool) constants.getValue(this); } 256 public ConstantPool getConstants() { return (ConstantPool) constants.getValue(this); }
257 public Oop getClassLoader() { return classLoader.getValue(this); } 257 public Oop getClassLoader() { return classLoader.getValue(this); }
258 public Oop getProtectionDomain() { return protectionDomain.getValue(this); } 258 public Oop getProtectionDomain() { return protectionDomain.getValue(this); }
259 public ObjArray getSigners() { return (ObjArray) signers.getValue(this); } 259 public ObjArray getSigners() { return (ObjArray) signers.getValue(this); }
260 public Symbol getSourceFileName() { return (Symbol) sourceFileName.getValue(this); } 260 public Symbol getSourceFileName() { return getSymbol(sourceFileName); }
261 public Symbol getSourceDebugExtension(){ return (Symbol) sourceDebugExtension.getValue(this); } 261 public Symbol getSourceDebugExtension(){ return getSymbol(sourceDebugExtension); }
262 public TypeArray getInnerClasses() { return (TypeArray) innerClasses.getValue(this); } 262 public TypeArray getInnerClasses() { return (TypeArray) innerClasses.getValue(this); }
263 public long getNonstaticFieldSize() { return nonstaticFieldSize.getValue(this); } 263 public long getNonstaticFieldSize() { return nonstaticFieldSize.getValue(this); }
264 public long getStaticFieldSize() { return staticFieldSize.getValue(this); } 264 public long getStaticFieldSize() { return staticFieldSize.getValue(this); }
265 public long getStaticOopFieldSize() { return staticOopFieldSize.getValue(this); } 265 public long getStaticOopFieldSize() { return staticOopFieldSize.getValue(this); }
266 public long getNonstaticOopMapSize() { return nonstaticOopMapSize.getValue(this); } 266 public long getNonstaticOopMapSize() { return nonstaticOopMapSize.getValue(this); }
267 public boolean getIsMarkedDependent() { return isMarkedDependent.getValue(this) != 0; } 267 public boolean getIsMarkedDependent() { return isMarkedDependent.getValue(this) != 0; }
268 public long getVtableLen() { return vtableLen.getValue(this); } 268 public long getVtableLen() { return vtableLen.getValue(this); }
269 public long getItableLen() { return itableLen.getValue(this); } 269 public long getItableLen() { return itableLen.getValue(this); }
270 public Symbol getGenericSignature() { return (Symbol) genericSignature.getValue(this); } 270 public Symbol getGenericSignature() { return getSymbol(genericSignature); }
271 public long majorVersion() { return majorVersion.getValue(this); } 271 public long majorVersion() { return majorVersion.getValue(this); }
272 public long minorVersion() { return minorVersion.getValue(this); } 272 public long minorVersion() { return minorVersion.getValue(this); }
273 273
274 // "size helper" == instance size in words 274 // "size helper" == instance size in words
275 public long getSizeHelper() { 275 public long getSizeHelper() {
306 // 'ioff' can be zero. 306 // 'ioff' can be zero.
307 // refer to JVM spec. section 4.7.5. 307 // refer to JVM spec. section 4.7.5.
308 if (ioff != 0) { 308 if (ioff != 0) {
309 // only look at classes that are already loaded 309 // only look at classes that are already loaded
310 // since we are looking for the flags for our self. 310 // since we are looking for the flags for our self.
311 Oop classInfo = getConstants().getObjAt(ioff); 311 ConstantPool.CPSlot classInfo = getConstants().getSlotAt(ioff);
312 Symbol name = null; 312 Symbol name = null;
313 if (classInfo instanceof Klass) { 313 if (classInfo.isOop()) {
314 name = ((Klass) classInfo).getName(); 314 name = ((Klass) classInfo.getOop()).getName();
315 } else if (classInfo instanceof Symbol) { 315 } else if (classInfo.isMetaData()) {
316 name = (Symbol) classInfo; 316 name = classInfo.getSymbol();
317 } else { 317 } else {
318 throw new RuntimeException("should not reach here"); 318 throw new RuntimeException("should not reach here");
319 } 319 }
320 320
321 if (name.equals(getName())) { 321 if (name.equals(getName())) {
356 int ioff = innerClassList.getShortAt(i + 356 int ioff = innerClassList.getShortAt(i +
357 InnerClassAttributeOffset.innerClassInnerClassInfoOffset); 357 InnerClassAttributeOffset.innerClassInnerClassInfoOffset);
358 // 'ioff' can be zero. 358 // 'ioff' can be zero.
359 // refer to JVM spec. section 4.7.5. 359 // refer to JVM spec. section 4.7.5.
360 if (ioff != 0) { 360 if (ioff != 0) {
361 Oop iclassInfo = getConstants().getObjAt(ioff); 361 ConstantPool.CPSlot iclassInfo = getConstants().getSlotAt(ioff);
362 Symbol innerName = null; 362 Symbol innerName = null;
363 if (iclassInfo instanceof Klass) { 363 if (iclassInfo.isOop()) {
364 innerName = ((Klass) iclassInfo).getName(); 364 innerName = ((Klass) iclassInfo.getOop()).getName();
365 } else if (iclassInfo instanceof Symbol) { 365 } else if (iclassInfo.isMetaData()) {
366 innerName = (Symbol) iclassInfo; 366 innerName = iclassInfo.getSymbol();
367 } else { 367 } else {
368 throw new RuntimeException("should not reach here"); 368 throw new RuntimeException("should not reach here");
369 } 369 }
370 370
371 Symbol myname = getName(); 371 Symbol myname = getName();
385 // exclude anonymous classes. 385 // exclude anonymous classes.
386 return (innerNameIndex != 0); 386 return (innerNameIndex != 0);
387 } 387 }
388 } 388 }
389 } else { 389 } else {
390 Oop oclassInfo = getConstants().getObjAt(ooff); 390 ConstantPool.CPSlot oclassInfo = getConstants().getSlotAt(ooff);
391 Symbol outerName = null; 391 Symbol outerName = null;
392 if (oclassInfo instanceof Klass) { 392 if (oclassInfo.isOop()) {
393 outerName = ((Klass) oclassInfo).getName(); 393 outerName = ((Klass) oclassInfo.getOop()).getName();
394 } else if (oclassInfo instanceof Symbol) { 394 } else if (oclassInfo.isMetaData()) {
395 outerName = (Symbol) oclassInfo; 395 outerName = oclassInfo.getSymbol();
396 } else { 396 } else {
397 throw new RuntimeException("should not reach here"); 397 throw new RuntimeException("should not reach here");
398 } 398 }
399 399
400 // include only if current class is outer class. 400 // include only if current class is outer class.
448 visitor.doOop(fields, true); 448 visitor.doOop(fields, true);
449 visitor.doOop(constants, true); 449 visitor.doOop(constants, true);
450 visitor.doOop(classLoader, true); 450 visitor.doOop(classLoader, true);
451 visitor.doOop(protectionDomain, true); 451 visitor.doOop(protectionDomain, true);
452 visitor.doOop(signers, true); 452 visitor.doOop(signers, true);
453 visitor.doOop(sourceFileName, true);
454 visitor.doOop(innerClasses, true); 453 visitor.doOop(innerClasses, true);
455 visitor.doCInt(nonstaticFieldSize, true); 454 visitor.doCInt(nonstaticFieldSize, true);
456 visitor.doCInt(staticFieldSize, true); 455 visitor.doCInt(staticFieldSize, true);
457 visitor.doCInt(staticOopFieldSize, true); 456 visitor.doCInt(staticOopFieldSize, true);
458 visitor.doCInt(nonstaticOopMapSize, true); 457 visitor.doCInt(nonstaticOopMapSize, true);
465 TypeArray fields = getFields(); 464 TypeArray fields = getFields();
466 int length = (int) fields.getLength(); 465 int length = (int) fields.getLength();
467 for (int index = 0; index < length; index += NEXT_OFFSET) { 466 for (int index = 0; index < length; index += NEXT_OFFSET) {
468 short accessFlags = fields.getShortAt(index + ACCESS_FLAGS_OFFSET); 467 short accessFlags = fields.getShortAt(index + ACCESS_FLAGS_OFFSET);
469 short signatureIndex = fields.getShortAt(index + SIGNATURE_INDEX_OFFSET); 468 short signatureIndex = fields.getShortAt(index + SIGNATURE_INDEX_OFFSET);
470 FieldType type = new FieldType((Symbol) getConstants().getObjAt(signatureIndex)); 469 FieldType type = new FieldType(getConstants().getSymbolAt(signatureIndex));
471 AccessFlags access = new AccessFlags(accessFlags); 470 AccessFlags access = new AccessFlags(accessFlags);
472 if (access.isStatic()) { 471 if (access.isStatic()) {
473 visitField(visitor, type, index); 472 visitField(visitor, type, index);
474 } 473 }
475 } 474 }
488 int length = (int) fields.getLength(); 487 int length = (int) fields.getLength();
489 for (int index = 0; index < length; index += NEXT_OFFSET) { 488 for (int index = 0; index < length; index += NEXT_OFFSET) {
490 short accessFlags = fields.getShortAt(index + ACCESS_FLAGS_OFFSET); 489 short accessFlags = fields.getShortAt(index + ACCESS_FLAGS_OFFSET);
491 short signatureIndex = fields.getShortAt(index + SIGNATURE_INDEX_OFFSET); 490 short signatureIndex = fields.getShortAt(index + SIGNATURE_INDEX_OFFSET);
492 491
493 FieldType type = new FieldType((Symbol) getConstants().getObjAt(signatureIndex)); 492 FieldType type = new FieldType(getConstants().getSymbolAt(signatureIndex));
494 AccessFlags access = new AccessFlags(accessFlags); 493 AccessFlags access = new AccessFlags(accessFlags);
495 if (!access.isStatic()) { 494 if (!access.isStatic()) {
496 visitField(visitor, type, index); 495 visitField(visitor, type, index);
497 } 496 }
498 } 497 }
785 784
786 // Creates new field from index in fields TypeArray 785 // Creates new field from index in fields TypeArray
787 private Field newField(int index) { 786 private Field newField(int index) {
788 TypeArray fields = getFields(); 787 TypeArray fields = getFields();
789 short signatureIndex = fields.getShortAt(index + SIGNATURE_INDEX_OFFSET); 788 short signatureIndex = fields.getShortAt(index + SIGNATURE_INDEX_OFFSET);
790 FieldType type = new FieldType((Symbol) getConstants().getObjAt(signatureIndex)); 789 FieldType type = new FieldType(getConstants().getSymbolAt(signatureIndex));
791 if (type.isOop()) { 790 if (type.isOop()) {
792 if (VM.getVM().isCompressedOopsEnabled()) { 791 if (VM.getVM().isCompressedOopsEnabled()) {
793 return new NarrowOopField(this, index); 792 return new NarrowOopField(this, index);
794 } else { 793 } else {
795 return new OopField(this, index); 794 return new OopField(this, index);