diff --git a/plugins/org.eclipse.mat.api/src/org/eclipse/mat/inspections/LeakHunterQuery.java b/plugins/org.eclipse.mat.api/src/org/eclipse/mat/inspections/LeakHunterQuery.java index a2661b32b..89f0c04b9 100644 --- a/plugins/org.eclipse.mat.api/src/org/eclipse/mat/inspections/LeakHunterQuery.java +++ b/plugins/org.eclipse.mat.api/src/org/eclipse/mat/inspections/LeakHunterQuery.java @@ -632,25 +632,26 @@ private String getRetainedHeapTopConsumersDescription(int[] objects, IProgressLi { return Messages.LeakHunterQuery_RetainedHeapComponentEmpty; } int[] minRetainedSet = snapshot.getMinRetainedSet(objects, listener); - Map sumHeapSizes = new HashMap<>(); - Map counts = new HashMap<>(); + Map sumHeapSizes = new HashMap<>(); + Map counts = new HashMap<>(); for (int objectId : minRetainedSet) { - IObject object = snapshot.getObject(objectId); - String name = snapshot.isClass(objectId) ? ((IClass) object).getName() : object.getClazz().getName(); - sumHeapSizes.merge(name, snapshot.getHeapSize(objectId), Long::sum); - counts.merge(name, 1, Integer::sum); + if (listener.isCanceled()) + throw new IProgressListener.OperationCanceledException(); + Integer key = snapshot.isClass(objectId) ? objectId : snapshot.getClassOf(objectId).getObjectId(); + sumHeapSizes.merge(key, snapshot.getHeapSize(objectId), Long::sum); + counts.merge(key, 1, Integer::sum); } StringBuilder result = new StringBuilder(); - Set> entries = sumHeapSizes.entrySet(); + Set> entries = sumHeapSizes.entrySet(); boolean multipleItems = entries.size() > 1 && topItems > 1; - PriorityQueue> pq = new PriorityQueue>(entries.size(), + PriorityQueue> pq = new PriorityQueue>(entries.size(), (e1, e2) -> e2.getValue().compareTo(e1.getValue())); pq.addAll(entries); int maxItems = Math.min(pq.size(), topItems); while (maxItems-- > 0 && pq.size() > 0) { - Entry entry = pq.poll(); + Entry entry = pq.poll(); if (result.length() > 0) { result.append(", "); //$NON-NLS-1$ @@ -660,16 +661,15 @@ private String getRetainedHeapTopConsumersDescription(int[] objects, IProgressLi result.append(Messages.LeakHunterQuery_RetainedHeapComponentAnd); } int count = counts.get(entry.getKey()); - if (count == 1) - { - result.append(MessageUtil.format(Messages.LeakHunterQuery_RetainedHeapComponentInstance, - HTMLUtils.escapeText(entry.getKey()), count, bytesFormatter.format(entry.getValue()))); - } - else - { - result.append(MessageUtil.format(Messages.LeakHunterQuery_RetainedHeapComponentInstances, - HTMLUtils.escapeText(entry.getKey()), count, bytesFormatter.format(entry.getValue()))); - } + + int objectId = entry.getKey(); + IObject object = snapshot.getObject(objectId); + String name = snapshot.isClass(objectId) ? ((IClass) object).getName() : object.getClazz().getName(); + + result.append(MessageUtil.format( + count == 1 ? Messages.LeakHunterQuery_RetainedHeapComponentInstance + : Messages.LeakHunterQuery_RetainedHeapComponentInstances, + HTMLUtils.escapeText(name), count, bytesFormatter.format(entry.getValue()))); } return result.toString(); } diff --git a/plugins/org.eclipse.mat.api/src/org/eclipse/mat/snapshot/ISnapshot.java b/plugins/org.eclipse.mat.api/src/org/eclipse/mat/snapshot/ISnapshot.java index 7bcf2b1d0..60883955b 100644 --- a/plugins/org.eclipse.mat.api/src/org/eclipse/mat/snapshot/ISnapshot.java +++ b/plugins/org.eclipse.mat.api/src/org/eclipse/mat/snapshot/ISnapshot.java @@ -501,7 +501,10 @@ public DominatorsSummary getDominatorsOf(int[] objectIds, Pattern excludePattern * Get object abstracting the real Java Object from the heap dump identified * by the given id. *

- * Performance: Relatively fast - single index operation. + * Performance: Relatively fast - single index operation; however, there + * may be a fixed size cache of objects and heavy use of this method can induce + * overhead in cache management. When possible, prefer to use {@code objectId} + * until absolutely necessary to gather object information. * * @param objectId * id of object you want a convenient object abstraction for