Mercurial > hg > shenandoah-visualizer
changeset 30:db3d17330c0a
Update for new region state protocol
author | shade |
---|---|
date | Fri, 15 Sep 2017 12:38:48 +0200 |
parents | a5a481b56059 |
children | 97914d0e20b0 |
files | pom.xml src/main/java/org/openjdk/shenandoah/RegionFlag.java src/main/java/org/openjdk/shenandoah/RegionStat.java src/main/java/org/openjdk/shenandoah/RegionState.java src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java src/main/java/org/openjdk/shenandoah/Snapshot.java src/test/java/org/openjdk/shenandoah/RenderLegendTest.java |
diffstat | 7 files changed, 101 insertions(+), 52 deletions(-) [+] |
line wrap: on
line diff
--- a/pom.xml Thu Jun 15 20:09:13 2017 +0200 +++ b/pom.xml Fri Sep 15 12:38:48 2017 +0200 @@ -56,6 +56,14 @@ </plugins> </build> + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.12</version> + </dependency> + </dependencies> + <profiles> <profile> <id>tools.jar-8</id>
--- a/src/main/java/org/openjdk/shenandoah/RegionFlag.java Thu Jun 15 20:09:13 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -package org.openjdk.shenandoah; - -public enum RegionFlag { - - UNUSED, - - HUMONGOUS, - - IN_COLLECTION_SET, - - PINNED, - -}
--- a/src/main/java/org/openjdk/shenandoah/RegionStat.java Thu Jun 15 20:09:13 2017 +0200 +++ b/src/main/java/org/openjdk/shenandoah/RegionStat.java Fri Sep 15 12:38:48 2017 +0200 @@ -18,7 +18,7 @@ private static final int SHARED_SHIFT = 28; private static final int FLAGS_SHIFT = 58; - private final EnumSet<RegionFlag> flags; + private final RegionState state; private final BitSet incoming; private final float liveLvl; private final float usedLvl; @@ -26,16 +26,17 @@ private final float gclabLvl; private final float sharedLvl; - public RegionStat(float usedLvl, float liveLvl, float tlabLvl, float gclabLvl, float sharedLvl, EnumSet<RegionFlag> flags) { + public RegionStat(float usedLvl, float liveLvl, float tlabLvl, float gclabLvl, float sharedLvl, RegionState state) { this.incoming = null; this.usedLvl = usedLvl; this.liveLvl = liveLvl; this.tlabLvl = tlabLvl; this.gclabLvl = gclabLvl; this.sharedLvl = sharedLvl; - this.flags = flags; + this.state = state; } + public RegionStat(long data, String matrix) { usedLvl = ((data >>> USED_SHIFT) & PERCENT_MASK) / 100F; liveLvl = ((data >>> LIVE_SHIFT) & PERCENT_MASK) / 100F; @@ -44,13 +45,7 @@ sharedLvl = ((data >>> SHARED_SHIFT) & PERCENT_MASK) / 100F; 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.PINNED); + state = RegionState.fromOrdinal((int) stat); if (!matrix.isEmpty()) { this.incoming = new BitSet(); @@ -111,27 +106,27 @@ g.drawRect(lx, ly, sharedWidth, h); } - if (flags.contains(RegionFlag.IN_COLLECTION_SET)) { + if (state == RegionState.CSET) { g.setColor(Colors.CSET); g.fillRect(x, y, width, height / 3); g.setColor(Color.BLACK); g.drawRect(x, y, width, height / 3); } - if (flags.contains(RegionFlag.HUMONGOUS)) { + if (state == RegionState.HUMONGOUS) { g.setColor(Colors.HUMONGOUS); g.fillRect(x, y, width, height / 3); g.setColor(Color.BLACK); g.drawRect(x, y, width, height / 3); } - if (flags.contains(RegionFlag.UNUSED)) { + if (state == RegionState.EMPTY_UNCOMMITTED || state == RegionState.EMPTY_COMMITTED) { g.setColor(Color.BLACK); g.drawLine(x, y, x + width, y + height); g.drawLine(x, y + height, x + width, y); } - if (flags.contains(RegionFlag.PINNED)) { + if (state == RegionState.PINNED) { g.setColor(Color.RED); g.fillOval(x + width/2, y + height/2, width/4, height/4); } @@ -151,13 +146,13 @@ if (Float.compare(that.usedLvl, usedLvl) != 0) return false; if (Float.compare(that.tlabLvl, tlabLvl) != 0) return false; if (Float.compare(that.gclabLvl, gclabLvl) != 0) return false; - if (!flags.equals(that.flags)) return false; + if (!state.equals(that.state)) return false; return incoming != null ? incoming.equals(that.incoming) : that.incoming == null; } @Override public int hashCode() { - int result = flags.hashCode(); + int result = state.hashCode(); result = 31 * result + (incoming != null ? incoming.hashCode() : 0); result = 31 * result + (liveLvl != +0.0f ? Float.floatToIntBits(liveLvl) : 0); result = 31 * result + (usedLvl != +0.0f ? Float.floatToIntBits(usedLvl) : 0); @@ -186,8 +181,8 @@ return sharedLvl; } - public EnumSet<RegionFlag> flags() { - return flags; + public RegionState state() { + return state; } public BitSet incoming() {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/org/openjdk/shenandoah/RegionState.java Fri Sep 15 12:38:48 2017 +0200 @@ -0,0 +1,36 @@ +package org.openjdk.shenandoah; + +public enum RegionState { + + EMPTY_UNCOMMITTED, + + EMPTY_COMMITTED, + + REGULAR, + + HUMONGOUS, + + CSET, + + PINNED, + + TRASH, + + ; + + static RegionState fromOrdinal(int idx) { + switch (idx) { + case 0: return EMPTY_COMMITTED; + case 1: return EMPTY_UNCOMMITTED; + case 2: return REGULAR; + case 3: return HUMONGOUS; + case 4: return HUMONGOUS; + case 5: return CSET; + case 6: return PINNED; + case 7: return TRASH; + default: + throw new IllegalStateException("Unhandled ordinal: " + idx); + } + } + +}
--- a/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java Thu Jun 15 20:09:13 2017 +0200 +++ b/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java Fri Sep 15 12:38:48 2017 +0200 @@ -34,7 +34,7 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -import static org.openjdk.shenandoah.RegionFlag.*; +import static org.openjdk.shenandoah.RegionState.*; class ShenandoahVisualizer { @@ -157,7 +157,7 @@ f.get(); } - private static class Render implements Runnable { + public static class Render implements Runnable { public static final int LINE = 20; final DataProvider data; @@ -237,52 +237,52 @@ } } - public synchronized void renderLegend(Graphics g) { + public synchronized static void renderLegend(Graphics g) { final int sqSize = LINE; Map<String, RegionStat> items = new LinkedHashMap<>(); - items.put("Unused", - new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, EnumSet.of(UNUSED))); + items.put("Empty (uncommitted)", + new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, EMPTY_UNCOMMITTED)); - items.put("Empty", - new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); + items.put("Empty (committed)", + new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, EMPTY_COMMITTED)); items.put("1/2 Used", - new RegionStat(0.5f, 0.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(0.5f, 0.0f, 0.0f, 0.0f, 0.0f, REGULAR)); items.put("Fully Used", - new RegionStat(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, REGULAR)); items.put("Fully Used, 100% TLAB Allocs", - new RegionStat(1.0f, 0.0f, 1.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(1.0f, 0.0f, 1.0f, 0.0f, 0.0f, REGULAR)); items.put("Fully Used, 100% GCLAB Allocs", - new RegionStat(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, REGULAR)); items.put("Fully Used, 100% Shared Allocs", - new RegionStat(1.0f, 0.0f, 0.0f, 0.0f, 1.0f, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(1.0f, 0.0f, 0.0f, 0.0f, 1.0f, REGULAR)); items.put("Fully Used, 50%/50% TLAB/GCLAB Allocs", - new RegionStat(1.0f, 0.0f, 0.5f, 0.5f, 0.0f, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(1.0f, 0.0f, 0.5f, 0.5f, 0.0f, REGULAR)); 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))); + new RegionStat(1.0f, 0.0f, 1f/3, 1f/3, 1f/3, REGULAR)); items.put("Fully Live", - new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, 0.0f, REGULAR)); items.put("Fully Live + Humongous", - new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, 0.0f, EnumSet.of(HUMONGOUS))); + new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, 0.0f, HUMONGOUS)); items.put("1/3 Live", - new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, 0.0f, REGULAR)); items.put("1/3 Live + In Collection Set", - new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, 0.0f, EnumSet.of(IN_COLLECTION_SET))); + new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, 0.0f, CSET)); items.put("1/3 Live + Pinned", - new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, 0.0f, EnumSet.of(PINNED))); + new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, 0.0f, PINNED)); int i = 1; for (String key : items.keySet()) {
--- a/src/main/java/org/openjdk/shenandoah/Snapshot.java Thu Jun 15 20:09:13 2017 +0200 +++ b/src/main/java/org/openjdk/shenandoah/Snapshot.java Fri Sep 15 12:38:48 2017 +0200 @@ -108,7 +108,7 @@ public long collectionSet() { long used = 0L; for (RegionStat rs : stats) { - if (rs.flags().contains(RegionFlag.IN_COLLECTION_SET)) { + if (rs.state() == RegionState.CSET) { used += regionSize * rs.used(); } } @@ -118,7 +118,7 @@ public long humongous() { long used = 0L; for (RegionStat rs : stats) { - if (rs.flags().contains(RegionFlag.HUMONGOUS)) { + if (rs.state() == RegionState.HUMONGOUS) { used += regionSize * rs.used(); } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/java/org/openjdk/shenandoah/RenderLegendTest.java Fri Sep 15 12:38:48 2017 +0200 @@ -0,0 +1,23 @@ +package org.openjdk.shenandoah; + +import org.junit.Test; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +public class RenderLegendTest { + + @Test + public void test() throws IOException { + BufferedImage img = new BufferedImage(300, 700, BufferedImage.TYPE_INT_RGB); + Graphics2D g = img.createGraphics(); + g.setColor(Color.WHITE); + g.fillRect(0, 0, 300, 700); + ShenandoahVisualizer.Render.renderLegend(g); + ImageIO.write(img, "png", new File("legend.png")); + } + +}