void seek() { while(nested.hasNext()) { Instance n = nested.next(); if (n.getJavaClass() == type) { instance = n; return; } } instance = null; }
@Override public Iterator<Instance> walk(Instance instance) { if (instance != null && match(instance.getJavaClass())) { return Collections.singleton(instance).iterator(); } else { return Collections.<Instance>emptyList().iterator(); } }
private boolean isSpecialReference(FieldValue value, Instance instance) { Field f = value.getField(); return f.equals(referentFiled) && referenceClasses.contains(instance.getJavaClass()); }
@Override public Iterator<Move> track(Instance instance) { if (instance != null && match(instance.getJavaClass())) { return Collections.singleton(new Move("", instance)).iterator(); } else { return Collections.<Move>emptyList().iterator(); } }
@SuppressWarnings("unchecked") public static <T> T primitiveValue(Instance obj) { if (obj == null) { return null; } String className = obj.getJavaClass().getName(); if (BOX_TYPES.contains(className)) { return (T)obj.getValueOfField("value"); } else { throw new IllegalArgumentException("Is not a primitive wrapper: " + obj.getInstanceId() + " (" + obj.getJavaClass().getName() + ")"); } }
String printInstance(Long instanceid) { if (instanceid == null || instanceid.longValue() == 0) { return "null"; } Instance ii = heap.getInstanceByID(instanceid.longValue()); return ii.getJavaClass().getName()+"#"+ii.getInstanceNumber(); }
public static String explainPath(Instance root, String path) { PathStep[] chain = HeapPath.parsePath(path, true); StringBuilder sb = new StringBuilder(); Instance o = root; for(int i = 0; i != chain.length; ++i) { if (chain[i] instanceof TypeFilterStep) { continue; } try { Move m = chain[i].track(o).next(); // JavaClass hostType = hostType(o.getJavaClass(), m.pathSpec); // hostType = hostType == null ? o.getJavaClass() : hostType; // sb.append("(" + shortName(hostType.getName()) + ")"); sb.append("(" + shortName(o.getJavaClass().getName()) + ")"); sb.append(m.pathSpec); o = m.instance; } catch(NoSuchElementException e) { sb.append("{failed: " + chain[i] + "}"); break; } } return sb.toString(); }
public static String stringValue(Instance obj) { if (obj == null) return null; if (!"java.lang.String".equals(obj.getJavaClass().getName())) throw new IllegalArgumentException("Is not a string: " + obj.getInstanceId() + " (" + obj.getJavaClass().getName() + ")"); Boolean COMPACT_STRINGS = (Boolean) obj.getJavaClass().getValueOfStaticField("COMPACT_STRINGS"); if (COMPACT_STRINGS == null) return stringValue_java8(obj); // We're pre Java 9 Object valueInstance = obj.getValueOfField("value"); PrimitiveArrayInstance chars = (PrimitiveArrayInstance) valueInstance; byte UTF16 = 1; byte coder = COMPACT_STRINGS ? (Byte) obj.getValueOfField("coder") : UTF16; int len = chars.getLength() >> coder; char[] text = new char[len]; List<String> values = (List) chars.getValues(); if (coder == UTF16) for (int i = 0; i < text.length; i++) { text[i] = (char) ((Integer.parseInt(values.get(i*2+1)) << 8) | (Integer.parseInt(values.get(i*2)) & 0xFF)); } else for (int i = 0; i < text.length; i++) text[i] = (char) Integer.parseInt(values.get(i)); return new String(text); }
return null; JavaClass t = obj.getJavaClass(); InstanceConverter c = CONVERTERS.get(obj.getJavaClass().getName()); while(c == null && t.getSuperClass() != null) { t = t.getSuperClass(); c = CONVERTERS.get(obj.getJavaClass().getName());
return false; javaClass = (ClassDump) i.getJavaClass(); if (canContainItself == null) { canContainItself = new HashMap(heap.getAllClasses().size()/2); for (;idom!=0;idom=getIdomId(idom)) { Instance ip = heap.getInstanceByID(idom); JavaClass cls = ip.getJavaClass();
static String getString(Instance stringInstance) { if (stringInstance == null) { return "*null*"; // NOI18N } String className = stringInstance.getJavaClass().getName(); if (String.class.getName().equals(className)) { PrimitiveArrayDump chars = (PrimitiveArrayDump) stringInstance.getValueOfField("value"); // NOI18N if (chars != null) { Integer offset = (Integer) stringInstance.getValueOfField("offset"); // NOI18N Integer len = (Integer) stringInstance.getValueOfField("count"); // NOI18N if (offset == null) { offset = Integer.valueOf(0); } if (len == null) { len = new Integer(chars.getLength()); } char[] charArr = chars.getChars(offset.intValue(), len.intValue()); return new String(charArr).intern(); } return "*null*"; // NOI18N } // what? Non-string in system properties? return "*"+className+"#"+stringInstance.getInstanceNumber()+"*"; // NOI18N } }
private void report(Instance i, String name, long instanceId) { marked.set(i.getInstanceId(), true); inbound.set(i.getInstanceId(), true); if (gcRoots.get(i.getInstanceId())) { System.out.println("#" + instanceId + " <- #" + i.getInstanceId() + name + " " + i.getJavaClass().getName() + " (GCRoot)"); } else { System.out.println("#" + instanceId + " <- #" + i.getInstanceId() + name + " " + i.getJavaClass().getName()); } } }
protected void analyze(Cluster details) { if (!useBreadthSearch) { StringBuilder path = new StringBuilder(); for(EntryPoint ep: entryPoints) { path.setLength(0); path.append("(" + shortName(details.root.getJavaClass().getName()) + ")"); for(Move i: HeapPath.track(details.root, ep.locator)) { path.append(i.pathSpec); walk(details, i.instance, path, 0, false, false); } } } else { for(EntryPoint ep: entryPoints) { for(Instance i: HeapPath.collect(details.root, ep.locator)) { widthWalk(details, i, false); } } } }
public ClusterDetails feed(Instance i) { if (last != null) { if (!keepClusterMembership) { last.objects = null; } last = null; } if (rootClasses.isEmpty()) { throw new IllegalStateException("Interesting types are not defined"); } String type = i.getJavaClass().getName(); if (rootClasses.contains(type)) { Cluster cluster = new Cluster(); cluster.root = i; cluster.objects = new RefSet(); cluster.summary = new HeapHistogram(); analyze(cluster); updateKnownMap(cluster); if (keepClusters) { clusters.add(cluster); } last = cluster; return cluster; } return null; }
return null; if (!"java.lang.String".equals(obj.getJavaClass().getName())) { throw new IllegalArgumentException("Is not a string: " + obj.getInstanceId() + " (" + obj.getJavaClass().getName() + ")");
public void accumulate(Instance i) { if (known != null) { if (known.getAndSet(i.getInstanceId(), true)) { // already accumulated return; } } total.add(i); String cn = i.getJavaClass().getName(); ClassRecord cr = classes.get(cn); if (cr == null) { cr = new ClassRecord(cn); classes.put(cn, cr); } ++cr.instanceCount; cr.totalSize += i.getSize(); }
continue; } else if (instance instanceof PrimitiveArrayInstance) { assert false:"Error - PrimitiveArrayInstance not allowed "+instance.getJavaClass().getName()+"#"+instance.getInstanceNumber(); continue; } else if (instance instanceof ClassDumpInstance) {
synchronized void computeRetainedSizeByClass() { if (retainedSizeByClassComputed) { return; } computeRetainedSize(); long[] offset = new long[] { allInstanceDumpBounds.startOffset }; while (offset[0] < allInstanceDumpBounds.endOffset) { int instanceIdOffset = 0; long start = offset[0]; int tag = readDumpTag(offset); if (tag == INSTANCE_DUMP) { instanceIdOffset = 1; } else if (tag == OBJECT_ARRAY_DUMP) { instanceIdOffset = 1; } else if (tag == PRIMITIVE_ARRAY_DUMP) { instanceIdOffset = 1; } else { continue; } long instanceId = dumpBuffer.getID(start + instanceIdOffset); Instance i = getInstanceByID(instanceId); ClassDump javaClass = (ClassDump) i.getJavaClass(); if (javaClass != null && !domTree.hasInstanceInChain(tag, i)) { javaClass.addSizeForInstance(i); } } // all done, release domTree domTree = null; retainedSizeByClassComputed = true; }
if (writeClassConnection(processedClasses, instanceId, instance.getJavaClass())) { hasValues = true;
public void collect(Heap heap, InstanceCallback callback) { JavaClass string = heap.getJavaClassByName("java.lang.String"); for(Instance i : heap.getAllInstances()) { if (i.getJavaClass() == string) { strings.set(i.getInstanceId(), true); for(FieldValue fv: i.getFieldValues()) {