< prev index next >

application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/pages/MemoryLeakPage.java

Print this page

        

*** 35,44 **** --- 35,45 ---- import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; + import java.util.Map; import java.util.function.Predicate; import java.util.function.Supplier; import java.util.function.ToDoubleFunction; import org.eclipse.jface.action.GroupMarker;
*** 136,145 **** --- 137,164 ---- private static class ReferenceTreeContentProvider extends AbstractStructuredContentProvider implements ITreeContentProvider { IRange<IQuantity> timeRange = null; + private final Predicate<ReferenceTreeObject> withinTimeRangePredicateFromRootObject = rto -> { + if (timeRange != null) { + if (rto.getTimestamp().compareTo(timeRange.getStart()) >= 0 + && rto.getTimestamp().compareTo(timeRange.getEnd()) <= 0) { + return true; + } else if (rto.getRootObject().getLeafNodes() != null && rto.getRootObject().getLeafNodes().size() > 1) { + for (Map.Entry<IQuantity, ReferenceTreeObject> rt : rto.getRootObject().getLeafNodes().entrySet()) { + if (rt.getKey().compareTo(timeRange.getStart()) >= 0 + && rt.getKey().compareTo(timeRange.getEnd()) <= 0) { + return true; + } + } + } + return false; + } + return true; + }; + private final Predicate<ReferenceTreeObject> withinTimeRangePredicate = rto -> { if (timeRange != null) { return rto.getTimestamp().compareTo(timeRange.getStart()) >= 0 && rto.getTimestamp().compareTo(timeRange.getEnd()) <= 0; }
*** 158,168 **** public boolean hasChildren(Object element) { if (element instanceof ReferenceTreeObject) { ReferenceTreeObject object = (ReferenceTreeObject) element; List<ReferenceTreeObject> children = object.getChildren(); if (timeRange != null) { ! return children.stream().anyMatch(withinTimeRangePredicate); } return !children.isEmpty(); } return false; } --- 177,187 ---- public boolean hasChildren(Object element) { if (element instanceof ReferenceTreeObject) { ReferenceTreeObject object = (ReferenceTreeObject) element; List<ReferenceTreeObject> children = object.getChildren(); if (timeRange != null) { ! return children.stream().anyMatch(withinTimeRangePredicateFromRootObject); } return !children.isEmpty(); } return false; }
*** 179,189 **** @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof Collection<?>) { Collection<ReferenceTreeObject> collection = (Collection<ReferenceTreeObject>) inputElement; if (timeRange != null) { ! return collection.stream().filter(withinTimeRangePredicate).toArray(); } return collection.toArray(); } return new Object[0]; } --- 198,208 ---- @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof Collection<?>) { Collection<ReferenceTreeObject> collection = (Collection<ReferenceTreeObject>) inputElement; if (timeRange != null) { ! return collection.stream().filter(withinTimeRangePredicateFromRootObject).toArray(); } return collection.toArray(); } return new Object[0]; }
*** 192,202 **** --- 211,226 ---- public Object[] getChildren(Object element) { if (element instanceof ReferenceTreeObject) { ReferenceTreeObject object = (ReferenceTreeObject) element; List<ReferenceTreeObject> children = object.getChildren(); if (timeRange != null) { + // Node has more than 1 children, select only those nodes which are leaky (leaf node) objects + if (children.size() > 1) { return children.stream().filter(withinTimeRangePredicate).toArray(); + } else { + return children.stream().filter(withinTimeRangePredicateFromRootObject).toArray(); + } } return children.toArray(); } return new Object[0]; }
*** 246,256 **** }).build(); private final IColumn COUNT_COLUMN = new ColumnBuilder(Messages.MemoryLeakPage_COUNT_COLUMN_HEADER, "count", //$NON-NLS-1$ new TypedLabelProvider<ReferenceTreeObject>(ReferenceTreeObject.class) { @Override protected String getTextTyped(ReferenceTreeObject object) { ! return object == null ? "" : Integer.toString(object.getItems().size()); //$NON-NLS-1$ }; }).style(SWT.RIGHT).comparator((o1, o2) -> { if (o1 instanceof ReferenceTreeObject && o2 instanceof ReferenceTreeObject) { return ((ReferenceTreeObject) o1).getObjectsKeptAliveCount() - ((ReferenceTreeObject) o2).getObjectsKeptAliveCount(); --- 270,285 ---- }).build(); private final IColumn COUNT_COLUMN = new ColumnBuilder(Messages.MemoryLeakPage_COUNT_COLUMN_HEADER, "count", //$NON-NLS-1$ new TypedLabelProvider<ReferenceTreeObject>(ReferenceTreeObject.class) { @Override protected String getTextTyped(ReferenceTreeObject object) { ! IRange<IQuantity> selectionRange = chart.getSelectionRange(); ! if (selectionRange == null) { ! return object == null ? "" : Integer.toString(object.getObjectsKeptAliveCount()); //$NON-NLS-1$ ! } else { ! return (object == null || selectionRange == null) ? "" : Integer.toString(model.getLeakCountInRange(selectionRange, object)); //$NON-NLS-1$ ! } }; }).style(SWT.RIGHT).comparator((o1, o2) -> { if (o1 instanceof ReferenceTreeObject && o2 instanceof ReferenceTreeObject) { return ((ReferenceTreeObject) o1).getObjectsKeptAliveCount() - ((ReferenceTreeObject) o2).getObjectsKeptAliveCount();
*** 308,318 **** TableSettings.forState(state.getChild(REFERENCE_TREE))); configureColumnManager(editor, referenceTree, null, Messages.MemoryLeakPage_OBJECT_SAMPLES_SELECTION, state.getChild(REFERENCE_TREE), null); model = ReferenceTreeModel.buildReferenceTree(getDataSource().getItems().apply(TABLE_ITEMS)); model.getLeakCandidates(0.5d); // this doesn't really matter, since we're not saving the return value ! aggregatedReferenceTree.setInput(model.getRootObjects()); chartCanvas.replaceRenderer(createChart()); PersistableSashForm.loadState(mainSash, state.getChild(MAIN_SASH)); } --- 337,347 ---- TableSettings.forState(state.getChild(REFERENCE_TREE))); configureColumnManager(editor, referenceTree, null, Messages.MemoryLeakPage_OBJECT_SAMPLES_SELECTION, state.getChild(REFERENCE_TREE), null); model = ReferenceTreeModel.buildReferenceTree(getDataSource().getItems().apply(TABLE_ITEMS)); model.getLeakCandidates(0.5d); // this doesn't really matter, since we're not saving the return value ! aggregatedReferenceTree.setInput(model.getLeakObjects()); chartCanvas.replaceRenderer(createChart()); PersistableSashForm.loadState(mainSash, state.getChild(MAIN_SASH)); }
*** 377,387 **** if (aggregatedReferenceTree != null && model != null) { IRange<IQuantity> selectionRange = chart.getSelectionRange(); if (selectionRange != null) { ((ReferenceTreeContentProvider) aggregatedReferenceTree .getContentProvider()).timeRange = selectionRange; ! aggregatedReferenceTree.setInput(model.getRootObjects(selectionRange)); } else { ((ReferenceTreeContentProvider) aggregatedReferenceTree.getContentProvider()).timeRange = null; aggregatedReferenceTree.setInput(model.getRootObjects()); } } --- 406,416 ---- if (aggregatedReferenceTree != null && model != null) { IRange<IQuantity> selectionRange = chart.getSelectionRange(); if (selectionRange != null) { ((ReferenceTreeContentProvider) aggregatedReferenceTree .getContentProvider()).timeRange = selectionRange; ! aggregatedReferenceTree.setInput(model.getLeakObjects(selectionRange)); } else { ((ReferenceTreeContentProvider) aggregatedReferenceTree.getContentProvider()).timeRange = null; aggregatedReferenceTree.setInput(model.getRootObjects()); } }
< prev index next >