216 private void iterateSubtypes(HeapVisitor visitor, final Klass k) { 217 iterateLiveRegions(collectLiveRegions(), visitor, new ObjectFilter() { 218 public boolean canInclude(Oop obj) { 219 Klass tk = obj.getKlass(); 220 // null Klass is seen sometimes! 221 return (tk != null && tk.isSubtypeOf(k)); 222 } 223 }); 224 } 225 226 private void iterateLiveRegions(List liveRegions, HeapVisitor visitor, ObjectFilter of) { 227 // Summarize size 228 long totalSize = 0; 229 for (int i = 0; i < liveRegions.size(); i += 2) { 230 Address bottom = (Address) liveRegions.get(i); 231 Address top = (Address) liveRegions.get(i+1); 232 totalSize += top.minus(bottom); 233 } 234 visitor.prologue(totalSize); 235 236 CollectedHeap heap = VM.getVM().getUniverse().heap(); 237 238 if (heap instanceof GenCollectedHeap) { 239 GenCollectedHeap genHeap = (GenCollectedHeap) heap; 240 Generation genOld = genHeap.getGen(1); 241 } 242 243 for (int i = 0; i < liveRegions.size(); i += 2) { 244 Address bottom = (Address) liveRegions.get(i); 245 Address top = (Address) liveRegions.get(i+1); 246 247 try { 248 // Traverses the space from bottom to top 249 OopHandle handle = bottom.addOffsetToAsOopHandle(0); 250 251 while (handle.lessThan(top)) { 252 Oop obj = null; 253 254 try { 255 obj = newOop(handle); 256 } catch (UnknownOopException exp) { 257 if (DEBUG) { 258 throw new RuntimeException(" UnknownOopException " + exp); 259 } 260 } 261 if (obj == null) { 262 throw new UnknownOopException(); | 216 private void iterateSubtypes(HeapVisitor visitor, final Klass k) { 217 iterateLiveRegions(collectLiveRegions(), visitor, new ObjectFilter() { 218 public boolean canInclude(Oop obj) { 219 Klass tk = obj.getKlass(); 220 // null Klass is seen sometimes! 221 return (tk != null && tk.isSubtypeOf(k)); 222 } 223 }); 224 } 225 226 private void iterateLiveRegions(List liveRegions, HeapVisitor visitor, ObjectFilter of) { 227 // Summarize size 228 long totalSize = 0; 229 for (int i = 0; i < liveRegions.size(); i += 2) { 230 Address bottom = (Address) liveRegions.get(i); 231 Address top = (Address) liveRegions.get(i+1); 232 totalSize += top.minus(bottom); 233 } 234 visitor.prologue(totalSize); 235 236 for (int i = 0; i < liveRegions.size(); i += 2) { 237 Address bottom = (Address) liveRegions.get(i); 238 Address top = (Address) liveRegions.get(i+1); 239 240 try { 241 // Traverses the space from bottom to top 242 OopHandle handle = bottom.addOffsetToAsOopHandle(0); 243 244 while (handle.lessThan(top)) { 245 Oop obj = null; 246 247 try { 248 obj = newOop(handle); 249 } catch (UnknownOopException exp) { 250 if (DEBUG) { 251 throw new RuntimeException(" UnknownOopException " + exp); 252 } 253 } 254 if (obj == null) { 255 throw new UnknownOopException(); |