Skip to content

Commit 440a87a

Browse files
committed
Merged references: show instances with no references
1 parent 2553d6e commit 440a87a

File tree

1 file changed

+37
-7
lines changed

1 file changed

+37
-7
lines changed

visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaReferencesPlugin.java

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -222,11 +222,13 @@ private HeapViewerNode[] computeInstancesReferences(final InstancesWrapper insta
222222
progress.step();
223223
List<Value> references = instance.getReferences();
224224
Set<Instance> referers = new HashSet();
225-
for (Value reference : references) {
225+
if (references.isEmpty()) {
226+
referers.add(null);
227+
} else for (Value reference : references) {
226228
referers.add(logicalReferer(reference.getDefiningInstance()));
227229
}
228230
for (Instance referer : referers) {
229-
long refererID = referer.getInstanceId();
231+
long refererID = referer == null ? -1 : referer.getInstanceId();
230232
Integer count = values.get(refererID);
231233
if (count == null) count = 0;
232234
values.put(refererID, ++count);
@@ -244,7 +246,8 @@ protected boolean sorts(DataType dataType) {
244246
return true;
245247
}
246248
protected HeapViewerNode createNode(final Map.Entry<Long, Integer> node) {
247-
return new ReferenceNode(heap.getInstanceByID(node.getKey())) {
249+
long refererID = node.getKey();
250+
return new ReferenceNode(refererID == -1 ? null : heap.getInstanceByID(refererID)) {
248251
@Override
249252
int getCount() { return node.getValue(); }
250253
@Override
@@ -294,7 +297,7 @@ private static void storeItem(String itemName, boolean value) {
294297
"ReferenceNode_SamplesContainer=<sample {0} instances>",
295298
"ReferenceNode_NodesContainer=<instances {0}-{1}>"
296299
})
297-
private abstract class ReferenceNode extends InstanceNode {
300+
private abstract class ReferenceNode extends InstanceNode.IncludingNull {
298301

299302
ReferenceNode(Instance reference) {
300303
super(reference);
@@ -325,6 +328,7 @@ protected ProgressIterator<Instance> objectsIterator(int index, Progress _progre
325328
@Override
326329
protected boolean exclude(Instance instance) {
327330
List<Value> references = instance.getReferences();
331+
if (_instance == null) return !references.isEmpty();
328332
for (Value reference : references)
329333
if (_instance.equals(logicalReferer(reference.getDefiningInstance())))
330334
return false;
@@ -354,6 +358,10 @@ protected Object getValue(DataType type, Heap heap) {
354358
return super.getValue(type, heap);
355359
}
356360

361+
public boolean isLeaf() {
362+
return false;
363+
}
364+
357365
}
358366

359367
private static class ReferenceNodeRenderer extends InstanceNodeRenderer {
@@ -363,6 +371,21 @@ private static class ReferenceNodeRenderer extends InstanceNodeRenderer {
363371
ReferenceNodeRenderer(Heap heap) {
364372
super(heap);
365373
}
374+
375+
@Override
376+
public void setValue(Object value, int row) {
377+
if (value != null) {
378+
ReferenceNode node = (ReferenceNode)value;
379+
if (node.getInstance() == null) {
380+
setNormalValue(Bundle.JavaReferencesPlugin_NoReferences());
381+
setBoldValue(""); // NOI18N
382+
setGrayValue(""); // NOI18N
383+
setIcon(ICON);
384+
return;
385+
}
386+
}
387+
super.setValue(value, row);
388+
}
366389

367390
@Override
368391
protected ImageIcon getIcon(Instance instance, boolean isGCRoot) {
@@ -383,11 +406,13 @@ protected HeapViewerNode[] lazilyComputeChildren(Heap heap, String viewID, HeapV
383406
HeapOperations.initializeReferences(heap);
384407

385408
Instance referer = getReferer();
409+
if (referer == null) return HeapViewerNode.NO_NODES;
410+
386411
final List<Value> references = getInstance().getReferences();
387412
Iterator<Value> referencesI = references.iterator();
388-
while (referencesI.hasNext())
389-
if (!referer.equals(logicalReferer(referencesI.next().getDefiningInstance())))
390-
referencesI.remove();
413+
while (referencesI.hasNext())
414+
if (!referer.equals(logicalReferer(referencesI.next().getDefiningInstance())))
415+
referencesI.remove();
391416

392417
NodesComputer<Value> computer = new NodesComputer<Value>(references.size(), 20) {
393418
protected boolean sorts(DataType dataType) {
@@ -414,6 +439,10 @@ protected String getNodesContainerString(String firstNodeIdx, String lastNodeIdx
414439
return computer.computeNodes(ReferredInstanceNode.this, heap, viewID, null, dataTypes, sortOrders, progress);
415440
}
416441

442+
public boolean isLeaf() {
443+
return getReferer() == null;
444+
}
445+
417446
}
418447

419448

@@ -423,6 +452,7 @@ protected String getNodesContainerString(String firstNodeIdx, String lastNodeIdx
423452
}));
424453

425454
private Instance logicalReferer(Instance realReferer) {
455+
if (realReferer == null) return null;
426456
return logicalReferences ? logicalRefererImpl(realReferer) : realReferer;
427457
}
428458

0 commit comments

Comments
 (0)