in core/org.openjdk.jmc.flightrecorder/src/main/java/org/openjdk/jmc/flightrecorder/memleak/ReferenceTreeModel.java [309:392]
private void add(
IItem item, IMemberAccessor<IMCOldObject, IItem> objectAccessor,
IMemberAccessor<IQuantity, IItem> allocationTimeAccessor,
IMemberAccessor<IMCOldObjectGcRoot, IItem> gcRootAccessor, IType<IItem> type) {
Set<IQuantity> addresses = new HashSet<>();
IQuantity timestamp = allocationTimeAccessor.getMember(item);
IMCOldObject object = objectAccessor.getMember(item);
addresses.add(object.getAddress());
ReferenceTreeObject last = map.get(object.getAddress());
if (last == null) {
// initializing new leak object
last = new ReferenceTreeObject(timestamp, object);
last.addItem(item);
leakObjects.add(last);
map.put(object.getAddress(), last);
}
ReferenceTreeObject node = null;
boolean root = true;
object = object.getReferrer();
IQuantity address;
while (object != null) {
address = object.getAddress();
if (address.longValue() == 0) {
Logger.getLogger(ReferenceTreeModel.class.getName()).log(Level.WARNING,
"Found object without address, breaking parsing of referrer chain."); //$NON-NLS-1$
break;
}
if (addresses.contains(address)) {
Logger.getLogger(ReferenceTreeModel.class.getName()).log(Level.WARNING,
"Same addresses multiple times in same chain " + address); //$NON-NLS-1$
break;
} else {
addresses.add(address);
}
node = map.get(address);
if (node == null) {
node = new ReferenceTreeObject(timestamp, object);
node.addRoot(gcRootAccessor.getMember(item));
map.put(address, node);
object = object.getReferrer();
} else {
if (last != null) {
node.addChild(last);
// Update Root Object with oldObjectSample ref
ReferenceTreeObject parent = node.getParent();
if (parent == null) {
node.updateOldObjectSamples(map.get(objectAccessor.getMember(item).getAddress()));
}
else {
while (parent.getParent() != null) {
parent = parent.getParent();
}
parent.updateOldObjectSamples(map.get(objectAccessor.getMember(item).getAddress()));
}
}
root = false;
break;
}
if (last != null) {
node.addChild(last);
}
last = node;
}
if (last != null) {
if (root) {
rootObjects.add(last);
last.updateOldObjectSamples(map.get(objectAccessor.getMember(item).getAddress()));
rootObjectsByLeakItems.put(item, last);
}
}
object = objectAccessor.getMember(item);
if (object != null) {
address = object.getAddress();
node = map.get(address);
while (node != null) {
node.incrementObjectsKeptAliveCount();
node.addItem(item);
node = node.getParent();
}
}
}