Index: src/main/java/org/apache/jackrabbit/oak/explorer/NodeStoreTree.java =================================================================== --- src/main/java/org/apache/jackrabbit/oak/explorer/NodeStoreTree.java (revision 1710633) +++ src/main/java/org/apache/jackrabbit/oak/explorer/NodeStoreTree.java (working copy) @@ -44,6 +44,8 @@ import java.io.Closeable; import java.io.File; import java.io.IOException; +import java.util.Collections; +import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -472,7 +474,9 @@ } List paths = newArrayList(); - filterNodeStates(newHashSet(id), paths, store.getHead(), "/"); + Map idAggregator = newHashMap(); + filterNodeStates(newHashSet(id), paths, store.getHead(), "/", + idAggregator); if (!paths.isEmpty()) { sb.append("Repository content references:"); sb.append(newline); @@ -482,6 +486,25 @@ } } + if (!idAggregator.isEmpty()) { + sb.append("Top RecordId references:"); + sb.append(newline); + List> top = newArrayList(); + top.addAll(idAggregator.entrySet()); + Collections.sort(top, new Comparator>() { + + @Override + public int compare(Entry o1, + Entry o2) { + return o2.getValue().compareTo(o1.getValue()); + } + }); + for (Entry e : top) { + sb.append(" " + e.getKey() + " seen " + e.getValue() + " times"); + sb.append(newline); + } + } + Map>> links = newHashMap(); try { getGcRoots(store, id, links); @@ -500,11 +523,25 @@ public static void filterNodeStates(Set uuids, List paths, SegmentNodeState state, String path) { + filterNodeStates(uuids, paths, state, path, null); + } + + public static void filterNodeStates(Set uuids, List paths, + SegmentNodeState state, String path, + Map idAggregator) { Set localPaths = newTreeSet(); for (PropertyState ps : state.getProperties()) { if (ps instanceof SegmentPropertyState) { SegmentPropertyState sps = (SegmentPropertyState) ps; RecordId recordId = sps.getRecordId(); + if (idAggregator != null) { + if (idAggregator.containsKey(recordId)) { + idAggregator.put(recordId, + idAggregator.get(recordId) + 1); + } else { + idAggregator.put(recordId, 1l); + } + } UUID id = recordId.getSegmentId().asUUID(); if (uuids.contains(id)) { if (ps.getType().tag() == STRING) { @@ -553,7 +590,7 @@ NodeState c = ce.getNodeState(); if (c instanceof SegmentNodeState) { filterNodeStates(uuids, paths, (SegmentNodeState) c, - path + ce.getName() + "/"); + path + ce.getName() + "/", idAggregator); } } }