Review Request for JMC-5923: Add allocation pressure column to stacktrace view

Salman Siddiqui sasiddiq at redhat.com
Thu Jul 25 21:42:48 UTC 2019


Hi all,

Here is patch that adds a column to the stacktrace view to display
normalized allocation pressure. The allocation pressure is a ratio of the
size of the allocations of a particular class to the size of total
allocations from that stacktrace frame.

Also, as per suggestion from Marcus, I have normalized the count that is
displayed in the stacktrace view (this is similar to what is already being
displayed in the tool tip for the count).

JIRA issue: https://bugs.openjdk.java.net/browse/JMC-5923
Related GitHub issue: https://github.com/JDKMissionControl/jmc/issues/6

Patch is below.

Thanks,
Salman


diff --git
a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/messages/internal/Messages.java
b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/messages/internal/Messages.java
index 7b576f3..cd8234a 100644
---
a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/messages/internal/Messages.java
+++
b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/messages/internal/Messages.java
@@ -435,6 +435,7 @@ public class Messages extends NLS {
  public static String SELECT_RANGE_WIZARD_TEXT;
  public static String SELECT_RANGE_WIZARD_TITLE;
  public static String SELECT_RANGE_WIZARD_TO_MUCH_SELECTED_WARNING;
+ public static String STACKTRACE_VIEW_ALLOC_PRESSURE_COLUMN_NAME;
  public static String STACKTRACE_VIEW_COUNT_COLUMN_NAME;
  public static String STACKTRACE_VIEW_DISTINGUISH_FRAMES_BY;
  public static String STACKTRACE_VIEW_FRAME_GROUP_CHOOSE;
diff --git
a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/views/stacktrace/StacktraceView.java
b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/views/stacktrace/StacktraceView.java
index 2b51e80..9d96016 100644
---
a/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/views/stacktrace/StacktraceView.java
+++
b/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/views/stacktrace/StacktraceView.java
@@ -92,10 +92,16 @@ import org.eclipse.ui.part.ViewPart;
 import org.openjdk.jmc.common.IDisplayable;
 import org.openjdk.jmc.common.IMCFrame;
 import org.openjdk.jmc.common.IState;
+import org.openjdk.jmc.common.collection.IteratorToolkit;
 import org.openjdk.jmc.common.collection.SimpleArray;
+import org.openjdk.jmc.common.item.IItem;
 import org.openjdk.jmc.common.item.IItemCollection;
+import org.openjdk.jmc.common.item.IItemFilter;
+import org.openjdk.jmc.common.item.ItemFilters;
 import org.openjdk.jmc.common.unit.UnitLookup;
 import org.openjdk.jmc.common.util.StateToolkit;
+import org.openjdk.jmc.flightrecorder.jdk.JdkAggregators;
+import org.openjdk.jmc.flightrecorder.jdk.JdkFilters;
 import org.openjdk.jmc.flightrecorder.stacktrace.FrameSeparator;
 import
org.openjdk.jmc.flightrecorder.stacktrace.FrameSeparator.FrameCategorization;
 import org.openjdk.jmc.flightrecorder.stacktrace.StacktraceFormatToolkit;
@@ -181,7 +187,7 @@ public class StacktraceView extends ViewPart implements
ISelectionListener {
  private static final Color COUNT_COLOR = SWTColorToolkit.getColor(new
RGB(100, 200, 100));
  private static final String SIBLINGS_IMG_KEY = "siblingsColor";
//$NON-NLS-1$
  private static final Color SIBLINGS_COUNT_COLOR =
SWTColorToolkit.getColor(new RGB(170, 250, 170));
- private static final int[] DEFAULT_COLUMN_WIDTHS = {700, 150};
+ private static final int[] DEFAULT_COLUMN_WIDTHS = {700, 150, 150};
  private static final String THREAD_ROOT_KEY = "threadRootAtTop";
//$NON-NLS-1$
  private static final String FRAME_OPTIMIZATION_KEY =
"distinguishFramesByOptimization"; //$NON-NLS-1$
  private static final String FRAME_CATEGORIZATION_KEY =
"distinguishFramesCategorization"; //$NON-NLS-1$
@@ -491,7 +497,7 @@ public class StacktraceView extends ViewPart implements
ISelectionListener {
  new StacktraceViewToolTipSupport(viewer);
  MCContextMenuManager mm =
MCContextMenuManager.create(viewer.getControl());
  CopySelectionAction copyAction = new CopySelectionAction(viewer,
- FormatToolkit.selectionFormatter(stackTraceLabelProvider,
countLabelProvider));
+ FormatToolkit.selectionFormatter(stackTraceLabelProvider,
countLabelProvider, allocPressureLabelProvider));
  InFocusHandlerActivator.install(viewer.getControl(), copyAction);
  mm.appendToGroup(MCContextMenuManager.GROUP_EDIT, copyAction);
  mm.appendToGroup(MCContextMenuManager.GROUP_EDIT,
CopySettings.getInstance().createContributionItem());
@@ -515,6 +521,8 @@ public class StacktraceView extends ViewPart implements
ISelectionListener {
  .setLabelProvider(stackTraceLabelProvider);
  buildColumn(viewer, Messages.STACKTRACE_VIEW_COUNT_COLUMN_NAME,
SWT.RIGHT, columnWidths[1])
  .setLabelProvider(countLabelProvider);
+ buildColumn(viewer, Messages.STACKTRACE_VIEW_ALLOC_PRESSURE_COLUMN_NAME,
SWT.RIGHT, columnWidths[2])
+ .setLabelProvider(allocPressureLabelProvider);

  PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(),
HELP_CONTEXT_ID);

@@ -731,7 +739,13 @@ public class StacktraceView extends ViewPart
implements ISelectionListener {
  private final ColumnLabelProvider countLabelProvider = new
ColumnLabelProvider() {
  @Override
  public String getText(Object element) {
- return Integer.toString(((StacktraceFrame) element).getItemCount());
+ // display normalized count (percentage of total count)
+ StacktraceFrame frame = (StacktraceFrame) element;
+ Fork rootFork = getRootFork(frame.getBranch().getParentFork());
+ int itemCount = frame.getItemCount();
+ int totalCount = rootFork.getItemsInFork();
+ return UnitLookup.PERCENT_UNITY.quantity(itemCount / (double) totalCount)
+ .displayUsing(IDisplayable.AUTO);
  }

  @Override
@@ -756,6 +770,31 @@ public class StacktraceView extends ViewPart
implements ISelectionListener {
  }
  };

+ private final ColumnLabelProvider allocPressureLabelProvider = new
ColumnLabelProvider() {
+ @Override
+ public String getText(Object element) {
+ StacktraceFrame frame = (StacktraceFrame) element;
+
+ SimpleArray<IItem> items = frame.getItems();
+ Branch branch = frame.getBranch();
+ SimpleArray<IItem> allItems = new
SimpleArray<IItem>(branch.getFirstFrame().getItems().elements());
+ for (StacktraceFrame f: branch.getTailFrames()) {
+ allItems.addAll(f.getItems().elements());
+ }
+
+ IItemCollection itemsCollection =
ItemCollectionToolkit.build(IteratorToolkit.toList(items.iterator(),
items.size()).stream());
+ IItemCollection allItemsCollection =
ItemCollectionToolkit.build(IteratorToolkit.toList(allItems.iterator(),
items.size()).stream());
+
+ try {
+ Double itemsAlloc =
itemsCollection.getAggregate(JdkAggregators.ALLOCATION_TOTAL).numberValue().doubleValue();
+ Double allItemsAlloc =
allItemsCollection.getAggregate(JdkAggregators.ALLOCATION_TOTAL).numberValue().doubleValue();
+ return String.format("%.1f %%", (itemsAlloc / allItemsAlloc ) * 100);
+ } catch (NullPointerException e) { // ALLOCATION_TOTAL is only available
in Memory page
+ return "";
+ }
+ }
+ };
+
  private final ColumnLabelProvider stackTraceLabelProvider = new
ColumnLabelProvider() {

  @Override
diff --git
a/application/org.openjdk.jmc.flightrecorder.ui/src/main/resources/org/openjdk/jmc/flightrecorder/ui/messages/internal/messages.properties
b/application/org.openjdk.jmc.flightrecorder.ui/src/main/resources/org/openjdk/jmc/flightrecorder/ui/messages/internal/messages.properties
index cd954bd..96ce600 100644
---
a/application/org.openjdk.jmc.flightrecorder.ui/src/main/resources/org/openjdk/jmc/flightrecorder/ui/messages/internal/messages.properties
+++
b/application/org.openjdk.jmc.flightrecorder.ui/src/main/resources/org/openjdk/jmc/flightrecorder/ui/messages/internal/messages.properties
@@ -418,6 +418,7 @@ STORED_SELECTIONS_SIZE_UNPARSABLE=Number of stored
selections to keep: {0}
 STORE_SELECTION_ACTION=Store Selection
 STORE_AND_ACTIVATE_SELECTION_ACTION=Store and Set As Focused Selection

+STACKTRACE_VIEW_ALLOC_PRESSURE_COLUMN_NAME=Allocation Pressure
 STACKTRACE_VIEW_COUNT_COLUMN_NAME=Count
 STACKTRACE_VIEW_DISTINGUISH_FRAMES_BY=Distinguish Frames By
 STACKTRACE_VIEW_FRAME_GROUP_CHOOSE=Choose Frame Group


More information about the jmc-dev mailing list