changeset 28:e22defb2a606

Handle shared allocations profiling.
author shade
date Tue, 13 Jun 2017 13:20:06 +0200
parents 0a0c91d93ea2
children a5a481b56059
files src/main/java/org/openjdk/shenandoah/Colors.java src/main/java/org/openjdk/shenandoah/RegionStat.java src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java src/main/java/org/openjdk/shenandoah/Snapshot.java src/main/java/org/openjdk/shenandoah/SnapshotView.java
diffstat 5 files changed, 74 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/org/openjdk/shenandoah/Colors.java	Fri May 12 10:59:42 2017 +0200
+++ b/src/main/java/org/openjdk/shenandoah/Colors.java	Tue Jun 13 13:20:06 2017 +0200
@@ -9,6 +9,8 @@
     static final Color TIMELINE_EVACUATING  = new Color(100, 0, 0);
     static final Color TIMELINE_UPDATEREFS  = new Color(0, 100, 100);
 
+    static final Color SHARED_ALLOC         = new Color(250, 129, 0);
+    static final Color SHARED_ALLOC_BORDER  = new Color(142, 71, 0);
     static final Color TLAB_ALLOC           = new Color(0, 250, 250);
     static final Color TLAB_ALLOC_BORDER    = new Color(0, 191, 190);
     static final Color GCLAB_ALLOC          = new Color(185, 0, 250);
--- a/src/main/java/org/openjdk/shenandoah/RegionStat.java	Fri May 12 10:59:42 2017 +0200
+++ b/src/main/java/org/openjdk/shenandoah/RegionStat.java	Tue Jun 13 13:20:06 2017 +0200
@@ -15,6 +15,7 @@
     private static final int LIVE_SHIFT   = 7;
     private static final int TLAB_SHIFT   = 14;
     private static final int GCLAB_SHIFT  = 21;
+    private static final int SHARED_SHIFT = 28;
     private static final int FLAGS_SHIFT  = 58;
 
     private final EnumSet<RegionFlag> flags;
@@ -23,13 +24,15 @@
     private final float usedLvl;
     private final float tlabLvl;
     private final float gclabLvl;
+    private final float sharedLvl;
 
-    public RegionStat(float usedLvl, float liveLvl, float tlabLvl, float gclabLvl, EnumSet<RegionFlag> flags) {
+    public RegionStat(float usedLvl, float liveLvl, float tlabLvl, float gclabLvl, float sharedLvl, EnumSet<RegionFlag> flags) {
         this.incoming = null;
         this.usedLvl = usedLvl;
         this.liveLvl = liveLvl;
         this.tlabLvl = tlabLvl;
         this.gclabLvl = gclabLvl;
+        this.sharedLvl = sharedLvl;
         this.flags = flags;
     }
 
@@ -38,6 +41,7 @@
         liveLvl  = ((data >>> LIVE_SHIFT)  & PERCENT_MASK) / 100F;
         tlabLvl  = ((data >>> TLAB_SHIFT)  & PERCENT_MASK) / 100F;
         gclabLvl = ((data >>> GCLAB_SHIFT) & PERCENT_MASK) / 100F;
+        sharedLvl = ((data >>> SHARED_SHIFT) & PERCENT_MASK) / 100F;
 
         long stat = (data >>> FLAGS_SHIFT) & FLAGS_MASK;
 
@@ -73,26 +77,38 @@
         g.setColor(USED);
         g.fillRect(x, y, usedWidth, height);
 
-        if (gclabLvl > 0 || tlabLvl > 0) {
+        int liveWidth = (int) (width * liveLvl);
+        g.setColor(LIVE);
+        g.fillRect(x, y, liveWidth, height);
+
+        g.setColor(LIVE_BORDER);
+        g.drawLine(x + liveWidth, y, x + liveWidth, y + height);
+
+        if (gclabLvl > 0 || tlabLvl > 0 || sharedLvl > 0) {
+            int sharedWidth = (int) (width * sharedLvl);
             int tlabWidth = (int) (width * tlabLvl);
             int gclabWidth = (int) (width * gclabLvl);
+
+            int h = height / 3;
+            int ly = y + (height - h);
+            int lx = x;
+
             g.setColor(TLAB_ALLOC);
-            g.fillRect(x, y, tlabWidth, height);
+            g.fillRect(lx, ly, tlabWidth, h);
             g.setColor(TLAB_ALLOC_BORDER);
-            g.drawLine(x + tlabWidth, y, x + tlabWidth, y + height);
+            g.drawRect(lx, ly, tlabWidth, h);
 
-            int lx = x + tlabWidth;
+            lx += tlabWidth;
             g.setColor(GCLAB_ALLOC);
-            g.fillRect(lx, y, gclabWidth, height);
+            g.fillRect(lx, ly, gclabWidth, h);
             g.setColor(GCLAB_ALLOC_BORDER);
-            g.drawLine(lx + gclabWidth, y, lx + gclabWidth, y + height);
-        } else {
-            int liveWidth = (int) (width * liveLvl);
-            g.setColor(LIVE);
-            g.fillRect(x, y, liveWidth, height);
+            g.drawRect(lx, ly, gclabWidth, h);
 
-            g.setColor(LIVE_BORDER);
-            g.drawLine(x + liveWidth, y, x + liveWidth, y + height);
+            lx += gclabWidth;
+            g.setColor(SHARED_ALLOC);
+            g.fillRect(lx, ly, sharedWidth, h);
+            g.setColor(SHARED_ALLOC_BORDER);
+            g.drawRect(lx, ly, sharedWidth, h);
         }
 
         if (flags.contains(RegionFlag.IN_COLLECTION_SET)) {
@@ -120,7 +136,7 @@
             g.fillOval(x + width/2, y + height/2, width/4, height/4);
         }
 
-        g.setColor(Color.BLACK);
+        g.setColor(Color.GRAY);
         g.drawRect(x, y, width, height);
     }
 
@@ -166,6 +182,10 @@
         return gclabLvl;
     }
 
+    public float sharedAllocs() {
+        return sharedLvl;
+    }
+
     public EnumSet<RegionFlag> flags() {
         return flags;
     }
--- a/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java	Fri May 12 10:59:42 2017 +0200
+++ b/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java	Tue Jun 13 13:20:06 2017 +0200
@@ -222,6 +222,8 @@
 
                 g.setColor(Colors.USED);
                 g.drawRect(x, (int) Math.round(graphHeight - s.used() * stepY), 1, 1);
+                g.setColor(Colors.SHARED_ALLOC);
+                g.drawRect(x, (int) Math.round(graphHeight - s.sharedAllocs() * stepY), 1, 1);
                 g.setColor(Colors.TLAB_ALLOC);
                 g.drawRect(x, (int) Math.round(graphHeight - s.tlabAllocs() * stepY), 1, 1);
                 g.setColor(Colors.GCLAB_ALLOC);
@@ -241,40 +243,46 @@
             Map<String, RegionStat> items = new LinkedHashMap<>();
 
             items.put("Unused",
-                    new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, EnumSet.of(UNUSED)));
+                    new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, EnumSet.of(UNUSED)));
 
             items.put("Empty",
-                    new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("1/2 Used",
-                    new RegionStat(0.5f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(0.5f, 0.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("Fully Used",
-                    new RegionStat(1.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("Fully Used, 100% TLAB Allocs",
-                    new RegionStat(1.0f, 0.0f, 1.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 0.0f, 1.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("Fully Used, 100% GCLAB Allocs",
-                    new RegionStat(1.0f, 0.0f, 0.0f, 1.0f, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
+
+            items.put("Fully Used, 100% Shared Allocs",
+                    new RegionStat(1.0f, 0.0f, 0.0f, 0.0f, 1.0f, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("Fully Used, 50%/50% TLAB/GCLAB Allocs",
-                    new RegionStat(1.0f, 0.0f, 0.5f, 0.5f, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 0.0f, 0.5f, 0.5f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
+
+            items.put("Fully Used, 33%/33%/33% T/GC/S Allocs",
+                    new RegionStat(1.0f, 0.0f, 1f/3, 1f/3, 1f/3, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("Fully Live",
-                    new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("Fully Live + Humongous",
-                    new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, EnumSet.of(HUMONGOUS)));
+                    new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, 0.0f, EnumSet.of(HUMONGOUS)));
 
             items.put("1/3 Live",
-                    new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("1/3 Live + In Collection Set",
-                    new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, EnumSet.of(IN_COLLECTION_SET)));
+                    new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, 0.0f, EnumSet.of(IN_COLLECTION_SET)));
 
             items.put("1/3 Live + Pinned",
-                    new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, EnumSet.of(PINNED)));
+                    new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, 0.0f, EnumSet.of(PINNED)));
 
             int i = 1;
             for (String key : items.keySet()) {
@@ -288,11 +296,12 @@
         public synchronized void renderRegions(Graphics g) {
             int area = regionWidth * regionHeight;
             int sqSize = Math.max(1, (int) Math.sqrt(1D * area / snapshot.regionCount()));
-            int cols = regionWidth / sqSize;
+            int cellSize = sqSize + 3;
+            int cols = regionWidth / cellSize;
 
             for (int i = 0; i < snapshot.regionCount(); i++) {
-                int rectx = (i % cols) * sqSize;
-                int recty = (i / cols) * sqSize;
+                int rectx = (i % cols) * cellSize;
+                int recty = (i / cols) * cellSize;
 
                 RegionStat s = snapshot.get(i);
                 s.render(g, rectx, recty, sqSize, sqSize);
--- a/src/main/java/org/openjdk/shenandoah/Snapshot.java	Fri May 12 10:59:42 2017 +0200
+++ b/src/main/java/org/openjdk/shenandoah/Snapshot.java	Tue Jun 13 13:20:06 2017 +0200
@@ -97,6 +97,14 @@
         return r;
     }
 
+    public long sharedAllocs() {
+        long r = 0L;
+        for (RegionStat rs : stats) {
+            r += regionSize * rs.sharedAllocs();
+        }
+        return r;
+    }
+
     public long collectionSet() {
         long used = 0L;
         for (RegionStat rs : stats) {
--- a/src/main/java/org/openjdk/shenandoah/SnapshotView.java	Fri May 12 10:59:42 2017 +0200
+++ b/src/main/java/org/openjdk/shenandoah/SnapshotView.java	Tue Jun 13 13:20:06 2017 +0200
@@ -9,6 +9,7 @@
     private final long live;
     private final long tlabAllocs;
     private final long gclabAllocs;
+    private final long sharedAllocs;
     private final long humongous;
     private final long collectionSet;
 
@@ -18,6 +19,7 @@
         total = total();
         used = s.used();
         live = s.live();
+        sharedAllocs = s.sharedAllocs();
         tlabAllocs = s.tlabAllocs();
         gclabAllocs = s.gclabAllocs();
         humongous = s.humongous();
@@ -40,6 +42,10 @@
         return used;
     }
 
+    public long sharedAllocs() {
+        return sharedAllocs;
+    }
+
     public long tlabAllocs() {
         return tlabAllocs;
     }