# HG changeset patch # User shade # Date 1494522606 -7200 # Node ID 0aaf8f2911616de10dbe1f676d3213af80942f52 # Parent b3bcfd49186243e8c97dbdfd87cae413e7adc600 Update for new Shenandoah protocol. diff -r b3bcfd491862 -r 0aaf8f291161 src/main/java/org/openjdk/shenandoah/Colors.java --- 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); diff -r b3bcfd491862 -r 0aaf8f291161 src/main/java/org/openjdk/shenandoah/RegionFlag.java --- 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, } diff -r b3bcfd491862 -r 0aaf8f291161 src/main/java/org/openjdk/shenandoah/RegionStat.java --- 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 flags) { + public RegionStat(double usedLvl, double liveLvl, double tlabLvl, double gclabLvl, EnumSet 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 flags() { return flags; } @@ -147,4 +168,5 @@ public BitSet incoming() { return incoming; } + } diff -r b3bcfd491862 -r 0aaf8f291161 src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java --- 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 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()) { diff -r b3bcfd491862 -r 0aaf8f291161 src/main/java/org/openjdk/shenandoah/Snapshot.java --- 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() { diff -r b3bcfd491862 -r 0aaf8f291161 src/main/java/org/openjdk/shenandoah/SnapshotView.java --- 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; } + }