46 47 private static Type metadataTypeArray[]; 48 49 static { 50 VM.registerVMInitializedObserver(new Observer() { 51 public void update(Observable o, Object data) { 52 initialize(VM.getVM().getTypeDataBase()); 53 } 54 }); 55 } 56 57 private static void initialize(TypeDataBase db) { 58 // FileMapInfo 59 Type type = db.lookupType("FileMapInfo"); 60 AddressField currentInfoField = type.getAddressField("_current_info"); 61 long headerFieldOffset = type.getField("_header").getOffset(); 62 Address headerAddress = currentInfoField.getValue().addOffsetTo(headerFieldOffset); 63 headerValue = headerAddress.getAddressAt(0); 64 65 // FileMapHeader 66 type = db.lookupType("FileMapInfo::FileMapHeader"); 67 AddressField spaceField = type.getAddressField("_space[0]"); 68 Address spaceValue = headerValue.addOffsetTo(type.getField("_space[0]").getOffset()); 69 mdSpaceValue = spaceValue.addOffsetTo(3 * spaceField.getSize()); 70 71 // SpaceInfo 72 type = db.lookupType("FileMapInfo::FileMapHeader::space_info"); 73 long mdRegionBaseAddressOffset = type.getField("_addr._base").getOffset(); 74 mdRegionBaseAddress = (mdSpaceValue.addOffsetTo(mdRegionBaseAddressOffset)).getAddressAt(0); 75 long mdRegionSizeOffset = type.getField("_used").getOffset(); 76 long mdRegionSize = (mdSpaceValue.addOffsetTo(mdRegionSizeOffset)).getAddressAt(0).asLongValue(); 77 mdRegionEndAddress = mdRegionBaseAddress.addOffsetTo(mdRegionSize); 78 79 populateMetadataTypeArray(db); 80 } 81 82 private static void populateMetadataTypeArray(TypeDataBase db) { 83 metadataTypeArray = new Type[8]; 84 85 metadataTypeArray[0] = db.lookupType("ConstantPool"); 86 metadataTypeArray[1] = db.lookupType("InstanceKlass"); 87 metadataTypeArray[2] = db.lookupType("InstanceClassLoaderKlass"); 88 metadataTypeArray[3] = db.lookupType("InstanceMirrorKlass"); 89 metadataTypeArray[4] = db.lookupType("InstanceRefKlass"); 90 metadataTypeArray[5] = db.lookupType("Method"); 91 metadataTypeArray[6] = db.lookupType("ObjArrayKlass"); 92 metadataTypeArray[7] = db.lookupType("TypeArrayKlass"); | 46 47 private static Type metadataTypeArray[]; 48 49 static { 50 VM.registerVMInitializedObserver(new Observer() { 51 public void update(Observable o, Object data) { 52 initialize(VM.getVM().getTypeDataBase()); 53 } 54 }); 55 } 56 57 private static void initialize(TypeDataBase db) { 58 // FileMapInfo 59 Type type = db.lookupType("FileMapInfo"); 60 AddressField currentInfoField = type.getAddressField("_current_info"); 61 long headerFieldOffset = type.getField("_header").getOffset(); 62 Address headerAddress = currentInfoField.getValue().addOffsetTo(headerFieldOffset); 63 headerValue = headerAddress.getAddressAt(0); 64 65 // FileMapHeader 66 type = db.lookupType("FileMapHeader"); 67 AddressField spaceField = type.getAddressField("_space[0]"); 68 Address spaceValue = headerValue.addOffsetTo(type.getField("_space[0]").getOffset()); 69 mdSpaceValue = spaceValue.addOffsetTo(3 * spaceField.getSize()); 70 71 // SpaceInfo 72 type = db.lookupType("CDSFileMapRegion"); 73 long mdRegionBaseAddressOffset = type.getField("_addr._base").getOffset(); 74 mdRegionBaseAddress = (mdSpaceValue.addOffsetTo(mdRegionBaseAddressOffset)).getAddressAt(0); 75 long mdRegionSizeOffset = type.getField("_used").getOffset(); 76 long mdRegionSize = (mdSpaceValue.addOffsetTo(mdRegionSizeOffset)).getAddressAt(0).asLongValue(); 77 mdRegionEndAddress = mdRegionBaseAddress.addOffsetTo(mdRegionSize); 78 79 populateMetadataTypeArray(db); 80 } 81 82 private static void populateMetadataTypeArray(TypeDataBase db) { 83 metadataTypeArray = new Type[8]; 84 85 metadataTypeArray[0] = db.lookupType("ConstantPool"); 86 metadataTypeArray[1] = db.lookupType("InstanceKlass"); 87 metadataTypeArray[2] = db.lookupType("InstanceClassLoaderKlass"); 88 metadataTypeArray[3] = db.lookupType("InstanceMirrorKlass"); 89 metadataTypeArray[4] = db.lookupType("InstanceRefKlass"); 90 metadataTypeArray[5] = db.lookupType("Method"); 91 metadataTypeArray[6] = db.lookupType("ObjArrayKlass"); 92 metadataTypeArray[7] = db.lookupType("TypeArrayKlass"); |