in analysis/heap-dump/impl/src/main/java/org/eclipse/jifa/hda/impl/HeapDumpAnalyzerImpl.java [1526:1632]
public PageView<Model.Histogram.Item> getHistogram(Model.Histogram.Grouping groupingBy,
int[] ids, String sortBy, boolean ascendingOrder,
String searchText, SearchType searchType,
int page, int pageSize) {
return $(() -> {
Map<String, Object> args = new HashMap<>();
if (ids != null) {
args.put("objects", Helper.buildHeapObjectArgument(ids));
}
IResult result = queryByCommand(context, "histogram -groupBy " + groupingBy.name(), args);
switch (groupingBy) {
case BY_CLASS:
Histogram h = (Histogram) result;
List<ClassHistogramRecord> records =
(List<ClassHistogramRecord>) h.getClassHistogramRecords();
return PageViewBuilder.<ClassHistogramRecord, Model.Histogram.Item>fromList(records)
.beforeMap(record -> $(() -> record
.calculateRetainedSize(context.snapshot, true, true, Helper.VOID_LISTENER)))
.paging(new PagingRequest(page, pageSize))
.map(record -> new Model.Histogram.Item(record.getClassId(), record.getLabel(),
Model.Histogram.ItemType.CLASS,
record.getNumberOfObjects(),
record.getUsedHeapSize(),
record.getRetainedHeapSize()))
.sort(Model.Histogram.Item.sortBy(sortBy, ascendingOrder))
.filter(createPredicate(searchText, searchType))
.done();
case BY_CLASSLOADER:
Histogram.ClassLoaderTree ct = (Histogram.ClassLoaderTree) result;
@SuppressWarnings("unchecked")
PageViewBuilder<? extends XClassLoaderHistogramRecord, Model.Histogram.Item> builder =
PageViewBuilder.fromList((List<? extends XClassLoaderHistogramRecord>) ct.getElements());
return builder
.beforeMap(record -> $(() -> record.calculateRetainedSize(context.snapshot, true, true,
Helper.VOID_LISTENER)))
.paging(new PagingRequest(page, pageSize))
.map(record ->
new Model.Histogram.Item(record.getClassLoaderId(), record.getLabel(),
Model.Histogram.ItemType.CLASS_LOADER,
record.getNumberOfObjects(),
record.getUsedHeapSize(),
record.getRetainedHeapSize())
)
.sort(Model.Histogram.Item.sortBy(sortBy, ascendingOrder))
.filter(createPredicate(searchText, searchType))
.done();
case BY_SUPERCLASS:
Histogram.SuperclassTree st = (Histogram.SuperclassTree) result;
return PageViewBuilder.<HistogramRecord, Model.Histogram.Item>fromList(
(List<HistogramRecord>) st.getElements())
.paging(new PagingRequest(page, pageSize))
.map(e -> {
Model.Histogram.Item item = new Model.Histogram.Item();
int objectId = st.getContext(e).getObjectId();
item.setType(Model.Histogram.ItemType.SUPER_CLASS);
item.setObjectId(objectId);
item.setLabel((String) st.getColumnValue(e, 0));
item.setNumberOfObjects((Long) st.getColumnValue(e, 1));
item.setShallowSize(((Bytes) st.getColumnValue(e, 2)).getValue());
return item;
})
.sort(Model.Histogram.Item.sortBy(sortBy, ascendingOrder))
.filter(createPredicate(searchText, searchType))
.done();
case BY_PACKAGE:
Histogram.PackageTree pt = (Histogram.PackageTree) result;
return
PageViewBuilder.<HistogramRecord, Model.Histogram.Item>fromList(
(List<HistogramRecord>) pt.getElements())
.paging(new PagingRequest(page, pageSize))
.map(e -> {
Model.Histogram.Item item = new Model.Histogram.Item();
String label = (String) pt.getColumnValue(e, 0);
item.setLabel(label);
if (e instanceof XClassHistogramRecord) {
int objectId = pt.getContext(e).getObjectId();
item.setObjectId(objectId);
item.setType(Model.Histogram.ItemType.CLASS);
} else {
item.setObjectId(label.hashCode());
item.setType(Model.Histogram.ItemType.PACKAGE);
}
if (label.matches("^int(\\[\\])*") || label.matches("^char(\\[\\])*") ||
label.matches("^byte(\\[\\])*") || label.matches("^short(\\[\\])*") ||
label.matches("^boolean(\\[\\])*") ||
label.matches("^double(\\[\\])*") ||
label.matches("^float(\\[\\])*") || label.matches("^long(\\[\\])*") ||
label.matches("^void(\\[\\])*")) {
item.setType(Model.Histogram.ItemType.CLASS);
}
item.setNumberOfObjects((Long) pt.getColumnValue(e, 1));
item.setShallowSize(((Bytes) pt.getColumnValue(e, 2)).getValue());
return item;
})
.sort(Model.Histogram.Item.sortBy(sortBy, ascendingOrder))
.filter(createPredicate(searchText, searchType))
.done();
default:
throw new AnalysisException("Should not reach here");
}
});
}