31 import sun.jvm.hotspot.runtime.VMObject;
32 import sun.jvm.hotspot.types.CIntegerField;
33 import sun.jvm.hotspot.types.Type;
34 import sun.jvm.hotspot.types.TypeDataBase;
35
36 // Mirror class for HeapRegionType. Currently we don't actually include
37 // any of its fields but only iterate over it.
38
39 public class HeapRegionType extends VMObject {
40
41 private static int freeTag;
42 private static int youngMask;
43 private static int edenTag;
44 private static int survTag;
45 private static int humongousMask;
46 private static int startsHumongousTag;
47 private static int continuesHumongousTag;
48 private static int pinnedMask;
49 private static int archiveMask;
50 private static int oldMask;
51 private static CIntegerField tagField;
52 private int tag;
53
54 static {
55 VM.registerVMInitializedObserver(new Observer() {
56 public void update(Observable o, Object data) {
57 initialize(VM.getVM().getTypeDataBase());
58 }
59 });
60 }
61
62 private static synchronized void initialize(TypeDataBase db) {
63 Type type = db.lookupType("HeapRegionType");
64
65 tagField = type.getCIntegerField("_tag");
66
67 freeTag = db.lookupIntConstant("HeapRegionType::FreeTag");
68 youngMask = db.lookupIntConstant("HeapRegionType::YoungMask");
69 edenTag = db.lookupIntConstant("HeapRegionType::EdenTag");
70 survTag = db.lookupIntConstant("HeapRegionType::SurvTag");
71 startsHumongousTag = db.lookupIntConstant("HeapRegionType::StartsHumongousTag");
72 continuesHumongousTag = db.lookupIntConstant("HeapRegionType::ContinuesHumongousTag");
73 archiveMask = db.lookupIntConstant("HeapRegionType::ArchiveMask");
74 humongousMask = db.lookupIntConstant("HeapRegionType::HumongousMask");
75 pinnedMask = db.lookupIntConstant("HeapRegionType::PinnedMask");
76 oldMask = db.lookupIntConstant("HeapRegionType::OldMask");
77 }
78
79 public boolean isFree() {
80 return tagField.getValue(addr) == freeTag;
81 }
82
83 public boolean isEden() {
84 return tagField.getValue(addr) == edenTag;
85 }
86
87 public boolean isSurvivor() {
88 return tagField.getValue(addr) == survTag;
89 }
90
91 public boolean isYoung() {
92 return (tagField.getValue(addr) & youngMask) != 0;
93 }
94
95 public boolean isHumongous() {
96 return (tagField.getValue(addr) & humongousMask) != 0;
99 public boolean isStartsHumongous() {
100 return tagField.getValue(addr) == startsHumongousTag;
101 }
102
103 public boolean isContinuesHumongous() {
104 return tagField.getValue(addr) == continuesHumongousTag;
105 }
106
107 public boolean isArchive() {
108 return (tagField.getValue(addr) & archiveMask) != 0;
109 }
110
111 public boolean isPinned() {
112 return (tagField.getValue(addr) & pinnedMask) != 0;
113 }
114
115 public boolean isOld() {
116 return (tagField.getValue(addr) & oldMask) != 0;
117 }
118
119 public HeapRegionType(Address addr) {
120 super(addr);
121 }
122
123 public String typeAnnotation() {
124 if (isFree()) {
125 return "Free";
126 }
127 if (isEden()) {
128 return "Eden";
129 }
130 if (isSurvivor()) {
131 return "Survivor";
132 }
133 if (isStartsHumongous()) {
134 return "StartsHumongous";
135 }
136 if (isContinuesHumongous()) {
137 return "ContinuesHumongous";
138 }
139 if (isArchive()) {
140 return "Archive";
141 }
142 if (isPinned()) {
143 return "Pinned";
144 }
145 if (isOld()) {
146 return "Old";
147 }
148 return "Unknown Region Type";
149 }
150 }
|
31 import sun.jvm.hotspot.runtime.VMObject;
32 import sun.jvm.hotspot.types.CIntegerField;
33 import sun.jvm.hotspot.types.Type;
34 import sun.jvm.hotspot.types.TypeDataBase;
35
36 // Mirror class for HeapRegionType. Currently we don't actually include
37 // any of its fields but only iterate over it.
38
39 public class HeapRegionType extends VMObject {
40
41 private static int freeTag;
42 private static int youngMask;
43 private static int edenTag;
44 private static int survTag;
45 private static int humongousMask;
46 private static int startsHumongousTag;
47 private static int continuesHumongousTag;
48 private static int pinnedMask;
49 private static int archiveMask;
50 private static int oldMask;
51 private static int preMatureOldMask;
52 private static CIntegerField tagField;
53 private int tag;
54
55 static {
56 VM.registerVMInitializedObserver(new Observer() {
57 public void update(Observable o, Object data) {
58 initialize(VM.getVM().getTypeDataBase());
59 }
60 });
61 }
62
63 private static synchronized void initialize(TypeDataBase db) {
64 Type type = db.lookupType("HeapRegionType");
65
66 tagField = type.getCIntegerField("_tag");
67
68 freeTag = db.lookupIntConstant("HeapRegionType::FreeTag");
69 youngMask = db.lookupIntConstant("HeapRegionType::YoungMask");
70 edenTag = db.lookupIntConstant("HeapRegionType::EdenTag");
71 survTag = db.lookupIntConstant("HeapRegionType::SurvTag");
72 startsHumongousTag = db.lookupIntConstant("HeapRegionType::StartsHumongousTag");
73 continuesHumongousTag = db.lookupIntConstant("HeapRegionType::ContinuesHumongousTag");
74 archiveMask = db.lookupIntConstant("HeapRegionType::ArchiveMask");
75 humongousMask = db.lookupIntConstant("HeapRegionType::HumongousMask");
76 pinnedMask = db.lookupIntConstant("HeapRegionType::PinnedMask");
77 oldMask = db.lookupIntConstant("HeapRegionType::OldMask");
78 preMatureOldMask = db.lookupIntConstant("HeapRegionType::PreMatureOldMask");
79 }
80
81 public boolean isFree() {
82 return tagField.getValue(addr) == freeTag;
83 }
84
85 public boolean isEden() {
86 return tagField.getValue(addr) == edenTag;
87 }
88
89 public boolean isSurvivor() {
90 return tagField.getValue(addr) == survTag;
91 }
92
93 public boolean isYoung() {
94 return (tagField.getValue(addr) & youngMask) != 0;
95 }
96
97 public boolean isHumongous() {
98 return (tagField.getValue(addr) & humongousMask) != 0;
101 public boolean isStartsHumongous() {
102 return tagField.getValue(addr) == startsHumongousTag;
103 }
104
105 public boolean isContinuesHumongous() {
106 return tagField.getValue(addr) == continuesHumongousTag;
107 }
108
109 public boolean isArchive() {
110 return (tagField.getValue(addr) & archiveMask) != 0;
111 }
112
113 public boolean isPinned() {
114 return (tagField.getValue(addr) & pinnedMask) != 0;
115 }
116
117 public boolean isOld() {
118 return (tagField.getValue(addr) & oldMask) != 0;
119 }
120
121 public boolean isPreMatureOld() {
122 return (tagField.getValue(addr) & preMatureOldMask) != 0;
123 }
124
125 public HeapRegionType(Address addr) {
126 super(addr);
127 }
128
129 public String typeAnnotation() {
130 if (isFree()) {
131 return "Free";
132 }
133 if (isEden()) {
134 return "Eden";
135 }
136 if (isSurvivor()) {
137 return "Survivor";
138 }
139 if (isStartsHumongous()) {
140 return "StartsHumongous";
141 }
142 if (isContinuesHumongous()) {
143 return "ContinuesHumongous";
144 }
145 if (isArchive()) {
146 return "Archive";
147 }
148 if (isPinned()) {
149 return "Pinned";
150 }
151 if (isOld()) {
152 return "Old";
153 }
154 if (isPreMatureOld()) {
155 return "PreMature Old";
156 }
157 return "Unknown Region Type";
158 }
159 }
|