synchronized void computeDominators() { boolean changed = true; boolean igonoreDirty; try { do { currentMultipleParents.rewind(); igonoreDirty = !changed; changed = computeOneLevel(igonoreDirty); switchParents(); } while (changed || !igonoreDirty); } catch (IOException ex) { ex.printStackTrace(); } deleteBuffers(); dirtySet = Collections.EMPTY_SET; }
private Long intersect(Long idomIdObj, Long refIdObj) { if (idomIdObj.longValue() == refIdObj.longValue()) { return idomIdObj; } if (idomIdObj.longValue() == 0 || refIdObj.longValue() == 0) { return Long.valueOf(0); } Set leftIdoms = new HashSet(200); Set rightIdoms = new HashSet(200); Long leftIdomObj = idomIdObj; Long rightIdomObj = refIdObj; leftIdoms.add(leftIdomObj); rightIdoms.add(rightIdomObj); while(true) { if (leftIdomObj.longValue() != 0) { leftIdomObj = getIdomId(leftIdomObj); if (rightIdoms.contains(leftIdomObj)) { return leftIdomObj; } leftIdoms.add(leftIdomObj); } if (rightIdomObj.longValue() != 0) { rightIdomObj = getIdomId(rightIdomObj); if (leftIdoms.contains(rightIdomObj)) { return rightIdomObj; } rightIdoms.add(rightIdomObj); } } }
private Long getIdomId(Long instanceIdLong) { Long idomObj = (Long) map.get(instanceIdLong); if (idomObj != null) { return idomObj; } return getNearestGCRootPointer(instanceIdLong); }
long instanceId = readLong(); if (instanceId == 0) { // end of level if (additionalIndex >= additionalIds.size()) { newIdomIdObj = intersect(newIdomIdObj,refIdObj); map.put(instanceIdObj,newIdomIdObj); if (dirtySet.size() < ADDITIONAL_IDS_THRESHOLD) { updateAdditionalIds(instanceId, additionalIds);
domTree = new DominatorTree(this,nearestGCRoot.getMultipleParents()); domTree.computeDominators(); long[] offset = new long[] { allInstanceDumpBounds.startOffset }; long idom = domTree.getIdomId(instanceId,instanceEntry); boolean isTreeObj = instanceEntry.isTreeObj(); long instSize = 0; size = instSize; for (;idom!=0;idom=domTree.getIdomId(idom,entry)) { entry = idToOffsetMap.get(idom); if (entry.isTreeObj()) {
private void printObjs(List<Long> changedIds, List<Long> oldDomIds, List<Long> newDomIds, List<Boolean> addedByDirtySet, List<Long> changedIdx) { if (changedIds.size()>20) return; TreeMap<Integer,String> m = new TreeMap(); for (int i=0; i<changedIds.size(); i++) { Long iid = changedIds.get(i); Long oldDom = oldDomIds.get(i); Long newDom = newDomIds.get(i); Long index = changedIdx.get(i); Boolean addedByDirt = addedByDirtySet.get(i); Instance ii = heap.getInstanceByID(iid.longValue()); int number = ii.getInstanceNumber(); String text = "Index: "+index+(addedByDirt?" New ":" Old ")+printInstance(iid); text+=" OldDom "+printInstance(oldDom); text+=" NewDom: "+printInstance(newDom); m.put(number,text); } for (Integer in : m.keySet()) { System.out.println(m.get(in)); } }
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; }
domTree = new DominatorTree(this,nearestGCRoot.getMultipleParents()); domTree.computeDominators(); long[] offset = new long[] { allInstanceDumpBounds.startOffset }; long idom = domTree.getIdomId(instanceId,instanceEntry); boolean isTreeObj = instanceEntry.isTreeObj(); long instSize = 0; size = instSize; for (;idom!=0;idom=domTree.getIdomId(idom,entry)) { entry = idToOffsetMap.get(idom); if (entry.isTreeObj()) {
long instanceId = readLong(); if (instanceId == 0) { // end of level if (additionalIndex >= additionalIds.size()) { newIdomIdObj = intersect(newIdomIdObj,refIdObj); map.put(instanceIdObj,newIdomIdObj); if (dirtySet.size() < ADDITIONAL_IDS_THRESHOLD) { updateAdditionalIds(instanceId, additionalIds);
private void printObjs(List<Long> changedIds, List<Long> oldDomIds, List<Long> newDomIds, List<Boolean> addedByDirtySet, List<Long> changedIdx) { if (changedIds.size()>20) return; TreeMap<Integer,String> m = new TreeMap(); for (int i=0; i<changedIds.size(); i++) { Long iid = changedIds.get(i); Long oldDom = oldDomIds.get(i); Long newDom = newDomIds.get(i); Long index = changedIdx.get(i); Boolean addedByDirt = addedByDirtySet.get(i); Instance ii = heap.getInstanceByID(iid.longValue()); int number = ii.getInstanceNumber(); String text = "Index: "+index+(addedByDirt?" New ":" Old ")+printInstance(iid); text+=" OldDom "+printInstance(oldDom); text+=" NewDom: "+printInstance(newDom); m.put(number,text); } for (Integer in : m.keySet()) { System.out.println(m.get(in)); } }
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; }
synchronized void computeDominators() { boolean changed = true; boolean igonoreDirty; try { do { currentMultipleParents.rewind(); igonoreDirty = !changed; changed = computeOneLevel(igonoreDirty); switchParents(); } while (changed || !igonoreDirty); } catch (IOException ex) { ex.printStackTrace(); } deleteBuffers(); dirtySet = Collections.EMPTY_SET; }
domTree = new DominatorTree(this,nearestGCRoot.getMultipleParents()); domTree.computeDominators(); long[] offset = new long[] { allInstanceDumpBounds.startOffset }; long idom = domTree.getIdomId(instanceId,instanceEntry); boolean isTreeObj = instanceEntry.isTreeObj(); long instSize = 0; size = instSize; for (;idom!=0;idom=domTree.getIdomId(idom,entry)) { entry = idToOffsetMap.get(idom); if (entry.isTreeObj()) {
long instanceId = readLong(); if (instanceId == 0) { // end of level if (additionalIndex >= additionalIds.size()) { newIdomIdObj = intersect(newIdomIdObj,refIdObj); map.put(instanceIdObj,newIdomIdObj); if (dirtySet.size() < ADDITIONAL_IDS_THRESHOLD) { updateAdditionalIds(instanceId, additionalIds);
private Long getIdomId(Long instanceIdLong) { Long idomObj = (Long) map.get(instanceIdLong); if (idomObj != null) { return idomObj; } return getNearestGCRootPointer(instanceIdLong); }
private void printObjs(List<Long> changedIds, List<Long> oldDomIds, List<Long> newDomIds, List<Boolean> addedByDirtySet, List<Long> changedIdx) { if (changedIds.size()>20) return; TreeMap<Integer,String> m = new TreeMap(); for (int i=0; i<changedIds.size(); i++) { Long iid = changedIds.get(i); Long oldDom = oldDomIds.get(i); Long newDom = newDomIds.get(i); Long index = changedIdx.get(i); Boolean addedByDirt = addedByDirtySet.get(i); Instance ii = heap.getInstanceByID(iid.longValue()); int number = ii.getInstanceNumber(); String text = "Index: "+index+(addedByDirt?" New ":" Old ")+printInstance(iid); text+=" OldDom "+printInstance(oldDom); text+=" NewDom: "+printInstance(newDom); m.put(number,text); } for (Integer in : m.keySet()) { System.out.println(m.get(in)); } }
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; }
synchronized void computeDominators() { boolean changed = true; boolean igonoreDirty; try { do { currentMultipleParents.rewind(); igonoreDirty = !changed; changed = computeOneLevel(igonoreDirty); switchParents(); } while (changed || !igonoreDirty); } catch (IOException ex) { ex.printStackTrace(); } deleteBuffers(); dirtySet = Collections.EMPTY_SET; }