changeset 25:0aaf8f291161

Update for new Shenandoah protocol.
author shade
date Thu, 11 May 2017 19:10:06 +0200
parents b3bcfd491862
children da66467f2884
files src/main/java/org/openjdk/shenandoah/Colors.java src/main/java/org/openjdk/shenandoah/RegionFlag.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 6 files changed, 90 insertions(+), 46 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/org/openjdk/shenandoah/Colors.java	Fri Apr 14 20:02:16 2017 +0200
+++ b/src/main/java/org/openjdk/shenandoah/Colors.java	Thu May 11 19:10:06 2017 +0200
@@ -4,7 +4,10 @@
 
 public class Colors {
 
-    static final Color USED_ALLOC  = new Color(0, 250, 250);
+    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);
+    static final Color GCLAB_ALLOC_BORDER = new Color(118, 0, 160);
     static final Color USED        = new Color(150, 150, 150);
     static final Color LIVE        = new Color(0, 200, 0);
     static final Color LIVE_BORDER = new Color(0, 100, 0);
--- a/src/main/java/org/openjdk/shenandoah/RegionFlag.java	Fri Apr 14 20:02:16 2017 +0200
+++ b/src/main/java/org/openjdk/shenandoah/RegionFlag.java	Thu May 11 19:10:06 2017 +0200
@@ -8,8 +8,6 @@
 
     IN_COLLECTION_SET,
 
-    RECENTLY_ALLOCATED,
-
     PINNED,
 
 }
--- a/src/main/java/org/openjdk/shenandoah/RegionStat.java	Fri Apr 14 20:02:16 2017 +0200
+++ b/src/main/java/org/openjdk/shenandoah/RegionStat.java	Thu May 11 19:10:06 2017 +0200
@@ -8,10 +8,11 @@
 
 public class RegionStat {
 
-    private static final int USED_MASK = 0x1fffffff;
-    private static final int USED_SHIFT = 0;
-    private static final int LIVE_MASK = 0x1fffffff;
-    private static final int LIVE_SHIFT = 29;
+    private static final int PERCENT_MASK = 0x7f;
+    private static final int USED_SHIFT   = 0;
+    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 FLAGS_MASK = 0x3f;
     private static final int FLAGS_SHIFT = 58;
 
@@ -19,30 +20,32 @@
     private final BitSet incoming;
     private final double liveLvl;
     private final double usedLvl;
+    private final double tlabLvl;
+    private final double gclabLvl;
 
-    public RegionStat(double usedLvl, double liveLvl, EnumSet<RegionFlag> flags) {
+    public RegionStat(double usedLvl, double liveLvl, double tlabLvl, double gclabLvl, EnumSet<RegionFlag> flags) {
         this.incoming = new BitSet();
         this.usedLvl = usedLvl;
         this.liveLvl = liveLvl;
+        this.tlabLvl = tlabLvl;
+        this.gclabLvl = gclabLvl;
         this.flags = flags;
     }
 
     public RegionStat(long maxSize, long data, String matrix) {
-        long used = (data >>> USED_SHIFT) & USED_MASK;
-        usedLvl = Math.min(1D, 1D * used / maxSize);
-
-        long live = (data >>> LIVE_SHIFT) & LIVE_MASK;
-        liveLvl = Math.min(1D, 1D * live / maxSize);
+        usedLvl  = ((data >>> USED_SHIFT)  & PERCENT_MASK) / 100D;
+        liveLvl  = ((data >>> LIVE_SHIFT)  & PERCENT_MASK) / 100D;
+        tlabLvl  = ((data >>> TLAB_SHIFT)  & PERCENT_MASK) / 100D;
+        gclabLvl = ((data >>> GCLAB_SHIFT) & PERCENT_MASK) / 100D;
 
         long stat = (data >>> FLAGS_SHIFT) & FLAGS_MASK;
 
         flags = EnumSet.noneOf(RegionFlag.class);
 
-        if ((stat & 1)  > 0) flags.add(RegionFlag.UNUSED);
-        if ((stat & 2)  > 0) flags.add(RegionFlag.IN_COLLECTION_SET);
-        if ((stat & 4)  > 0) flags.add(RegionFlag.HUMONGOUS);
-        if ((stat & 8)  > 0) flags.add(RegionFlag.RECENTLY_ALLOCATED);
-        if ((stat & 16) > 0) flags.add(RegionFlag.PINNED);
+        if ((stat & 1) > 0) flags.add(RegionFlag.UNUSED);
+        if ((stat & 2) > 0) flags.add(RegionFlag.IN_COLLECTION_SET);
+        if ((stat & 4) > 0) flags.add(RegionFlag.HUMONGOUS);
+        if ((stat & 8) > 0) flags.add(RegionFlag.PINNED);
 
         this.incoming = new BitSet();
         int idx = 0;
@@ -62,13 +65,23 @@
         g.fillRect(x, y, width, height);
 
         int usedWidth = (int) (width * usedLvl);
-        g.setColor(
-                flags.contains(RegionFlag.RECENTLY_ALLOCATED) ?
-                        USED_ALLOC : USED
-        );
+        g.setColor(USED);
         g.fillRect(x, y, usedWidth, height);
 
-        if (!flags.contains(RegionFlag.RECENTLY_ALLOCATED)) {
+        if (gclabLvl > 0 || tlabLvl > 0) {
+            int tlabWidth = (int) (width * tlabLvl);
+            int gclabWidth = (int) (width * gclabLvl);
+            g.setColor(TLAB_ALLOC);
+            g.fillRect(x, y, tlabWidth, height);
+            g.setColor(TLAB_ALLOC_BORDER);
+            g.drawLine(x + tlabWidth, y, x + tlabWidth, y + height);
+
+            int lx = x + tlabWidth;
+            g.setColor(GCLAB_ALLOC);
+            g.fillRect(lx, y, gclabWidth, height);
+            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);
@@ -140,6 +153,14 @@
         return usedLvl;
     }
 
+    public double tlabAllocs() {
+        return tlabLvl;
+    }
+
+    public double gclabAllocs() {
+        return gclabLvl;
+    }
+
     public EnumSet<RegionFlag> flags() {
         return flags;
     }
@@ -147,4 +168,5 @@
     public BitSet incoming() {
         return incoming;
     }
+
 }
--- a/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java	Fri Apr 14 20:02:16 2017 +0200
+++ b/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java	Thu May 11 19:10:06 2017 +0200
@@ -222,8 +222,10 @@
 
                 g.setColor(Colors.USED);
                 g.drawRect(x, (int) Math.round(graphHeight - s.used() * stepY), 1, 1);
-                g.setColor(Colors.USED_ALLOC);
-                g.drawRect(x, (int) Math.round(graphHeight - s.recentlyAllocated() * 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);
+                g.drawRect(x, (int) Math.round(graphHeight - s.gclabAllocs() * stepY), 1, 1);
                 g.setColor(Colors.HUMONGOUS);
                 g.drawRect(x, (int) Math.round(graphHeight - s.humongous() * stepY), 1, 1);
                 g.setColor(Colors.LIVE);
@@ -239,34 +241,40 @@
             Map<String, RegionStat> items = new LinkedHashMap<>();
 
             items.put("Unused",
-                    new RegionStat(0.0, 0.0, EnumSet.of(UNUSED)));
+                    new RegionStat(0.0, 0.0, 0.0, 0.0, EnumSet.of(UNUSED)));
 
             items.put("Empty",
-                    new RegionStat(0.0, 0.0, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(0.0, 0.0, 0.0, 0.0, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("1/2 Used",
-                    new RegionStat(0.5, 0.0, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(0.5, 0.0, 0.0, 0.0, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("Fully Used",
-                    new RegionStat(1.0, 0.0, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0, 0.0, 0.0, 0.0, EnumSet.noneOf(RegionFlag.class)));
+
+            items.put("Fully Used, 100% TLAB Allocs",
+                    new RegionStat(1.0, 0.0, 1.0, 0.0, EnumSet.noneOf(RegionFlag.class)));
 
-            items.put("Fully Used, Recently Allocated",
-                    new RegionStat(1.0, 0.0, EnumSet.of(RECENTLY_ALLOCATED)));
+            items.put("Fully Used, 100% GCLAB Allocs",
+                    new RegionStat(1.0, 0.0, 0.0, 1.0, EnumSet.noneOf(RegionFlag.class)));
+
+            items.put("Fully Used, 50%/50% TLAB/GCLAB Allocs",
+                    new RegionStat(1.0, 0.0, 0.5, 0.5, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("Fully Live",
-                    new RegionStat(1.0, 1.0, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0, 1.0, 0.0, 0.0, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("Fully Live + Humongous",
-                    new RegionStat(1.0, 1.0, EnumSet.of(HUMONGOUS)));
+                    new RegionStat(1.0, 1.0, 0.0, 0.0, EnumSet.of(HUMONGOUS)));
 
             items.put("1/3 Live",
-                    new RegionStat(1.0, 0.3, EnumSet.noneOf(RegionFlag.class)));
+                    new RegionStat(1.0, 0.3, 0.0, 0.0, EnumSet.noneOf(RegionFlag.class)));
 
             items.put("1/3 Live + In Collection Set",
-                    new RegionStat(1.0, 0.3, EnumSet.of(IN_COLLECTION_SET)));
+                    new RegionStat(1.0, 0.3, 0.0, 0.0, EnumSet.of(IN_COLLECTION_SET)));
 
             items.put("1/3 Live + Pinned",
-                    new RegionStat(1.0, 0.3, EnumSet.of(PINNED)));
+                    new RegionStat(1.0, 0.3, 0.0, 0.0, EnumSet.of(PINNED)));
 
             int i = 1;
             for (String key : items.keySet()) {
--- a/src/main/java/org/openjdk/shenandoah/Snapshot.java	Fri Apr 14 20:02:16 2017 +0200
+++ b/src/main/java/org/openjdk/shenandoah/Snapshot.java	Thu May 11 19:10:06 2017 +0200
@@ -81,14 +81,20 @@
         return used;
     }
 
-    public long recentlyAllocated() {
-        long used = 0L;
+    public long tlabAllocs() {
+        long r = 0L;
         for (RegionStat rs : stats) {
-            if (rs.flags().contains(RegionFlag.RECENTLY_ALLOCATED)) {
-                used += regionSize * rs.used();
-            }
+            r += regionSize * rs.tlabAllocs();
         }
-        return used;
+        return r;
+    }
+
+    public long gclabAllocs() {
+        long r = 0L;
+        for (RegionStat rs : stats) {
+            r += regionSize * rs.gclabAllocs();
+        }
+        return r;
     }
 
     public long collectionSet() {
--- a/src/main/java/org/openjdk/shenandoah/SnapshotView.java	Fri Apr 14 20:02:16 2017 +0200
+++ b/src/main/java/org/openjdk/shenandoah/SnapshotView.java	Thu May 11 19:10:06 2017 +0200
@@ -7,7 +7,8 @@
     private final long total;
     private final long used;
     private final long live;
-    private final long recentlyAllocated;
+    private final long tlabAllocs;
+    private final long gclabAllocs;
     private final long humongous;
     private final long collectionSet;
 
@@ -17,7 +18,8 @@
         total = total();
         used = s.used();
         live = s.live();
-        recentlyAllocated = s.recentlyAllocated();
+        tlabAllocs = s.tlabAllocs();
+        gclabAllocs = s.gclabAllocs();
         humongous = s.humongous();
         collectionSet = s.collectionSet();
     }
@@ -38,8 +40,12 @@
         return used;
     }
 
-    public long recentlyAllocated() {
-        return recentlyAllocated;
+    public long tlabAllocs() {
+        return tlabAllocs;
+    }
+
+    public long gclabAllocs() {
+        return gclabAllocs;
     }
 
     public long collectionSet() {
@@ -53,4 +59,5 @@
     public long live() {
         return live;
     }
+
 }