Mercurial > hg > shenandoah-visualizer
changeset 16:a54d31fa9630
Introduce enums for region flags.
author | shade |
---|---|
date | Wed, 01 Feb 2017 10:16:06 +0100 |
parents | fac0698361e5 |
children | 5324a16e1e63 |
files | src/main/java/org/openjdk/shenandoah/RegionFlag.java src/main/java/org/openjdk/shenandoah/RegionStat.java src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java |
diffstat | 3 files changed, 53 insertions(+), 38 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/org/openjdk/shenandoah/RegionFlag.java Wed Feb 01 10:16:06 2017 +0100 @@ -0,0 +1,15 @@ +package org.openjdk.shenandoah; + +public enum RegionFlag { + + UNUSED, + + HUMONGOUS, + + IN_COLLECTION_SET, + + RECENTLY_ALLOCATED, + + PINNED, + +}
--- a/src/main/java/org/openjdk/shenandoah/RegionStat.java Wed Feb 01 10:04:06 2017 +0100 +++ b/src/main/java/org/openjdk/shenandoah/RegionStat.java Wed Feb 01 10:16:06 2017 +0100 @@ -1,6 +1,7 @@ package org.openjdk.shenandoah; import java.awt.*; +import java.util.EnumSet; public class RegionStat { @@ -11,23 +12,14 @@ private static final int FLAGS_MASK = 0x3f; private static final int FLAGS_SHIFT = 58; - private final boolean unused; - private final boolean humongous; - private final boolean inCset; - private final boolean newlyAllocated; - private final boolean pinned; + private final EnumSet<RegionFlag> flags; private final double liveLvl; private final double usedLvl; - private long ma; - public RegionStat(double usedLvl, double liveLvl, boolean unused, boolean humongous, boolean inCset, boolean newlyAllocated) { + public RegionStat(double usedLvl, double liveLvl, EnumSet<RegionFlag> flags) { this.usedLvl = usedLvl; this.liveLvl = liveLvl; - this.unused = unused; - this.humongous = humongous; - this.inCset = inCset; - this.newlyAllocated = newlyAllocated; - this.pinned = false; + this.flags = flags; } public RegionStat(long maxSize, long data) { @@ -38,11 +30,14 @@ liveLvl = Math.min(1D, 1D * live / maxSize); long stat = (data >>> FLAGS_SHIFT) & FLAGS_MASK; - unused = (stat & 1) > 0; - inCset = (stat & 2) > 0; - humongous = (stat & 4) > 0; - newlyAllocated = (stat & 8) > 0; - pinned = (stat & 16) > 0; + + 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); } public void render(Graphics g, int x, int y, int width, int height) { @@ -51,13 +46,13 @@ int usedWidth = (int) (width * usedLvl); g.setColor( - newlyAllocated ? + flags.contains(RegionFlag.RECENTLY_ALLOCATED) ? new Color(0, 250, 250) : new Color(150, 150, 150) ); g.fillRect(x, y, usedWidth, height); - if (!newlyAllocated) { + if (!flags.contains(RegionFlag.RECENTLY_ALLOCATED)) { int liveWidth = (int) (width * liveLvl); g.setColor(new Color(0, 200, 0)); g.fillRect(x, y, liveWidth, height); @@ -66,27 +61,27 @@ g.drawLine(x + liveWidth, y, x + liveWidth, y + height); } - if (inCset) { + if (flags.contains(RegionFlag.IN_COLLECTION_SET)) { g.setColor(Color.YELLOW); g.fillRect(x, y, width, height / 3); g.setColor(Color.BLACK); g.drawRect(x, y, width, height / 3); } - if (humongous) { + if (flags.contains(RegionFlag.HUMONGOUS)) { g.setColor(Color.RED); g.fillRect(x, y, width, height / 3); g.setColor(Color.BLACK); g.drawRect(x, y, width, height / 3); } - if (unused) { + if (flags.contains(RegionFlag.UNUSED)) { g.setColor(Color.BLACK); g.drawLine(x, y, x + width, y + height); g.drawLine(x, y + height, x + width, y); } - if (pinned) { + if (flags.contains(RegionFlag.PINNED)) { g.setColor(Color.RED); g.fillOval(x + width/2, y + height/2, width/4, height/4); } @@ -102,20 +97,16 @@ RegionStat that = (RegionStat) o; - if (unused != that.unused) return false; - if (humongous != that.humongous) return false; - if (inCset != that.inCset) return false; if (Double.compare(that.liveLvl, liveLvl) != 0) return false; - return Double.compare(that.usedLvl, usedLvl) == 0; + if (Double.compare(that.usedLvl, usedLvl) != 0) return false; + return flags.equals(that.flags); } @Override public int hashCode() { int result; long temp; - result = (unused ? 1 : 0); - result = 31 * result + (humongous ? 1 : 0); - result = 31 * result + (inCset ? 1 : 0); + result = flags.hashCode(); temp = Double.doubleToLongBits(liveLvl); result = 31 * result + (int) (temp ^ (temp >>> 32)); temp = Double.doubleToLongBits(usedLvl);
--- a/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java Wed Feb 01 10:04:06 2017 +0100 +++ b/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java Wed Feb 01 10:16:06 2017 +0100 @@ -29,6 +29,7 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; +import java.util.EnumSet; import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.Executors; @@ -36,6 +37,8 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import static org.openjdk.shenandoah.RegionFlag.*; + class ShenandoahVisualizer { private static final int INITIAL_WIDTH = 1000; @@ -157,28 +160,34 @@ Map<String, RegionStat> items = new LinkedHashMap<>(); items.put("Unused", - new RegionStat(0.0, 0.0, true, false, false, false)); + new RegionStat(0.0, 0.0, EnumSet.of(UNUSED))); items.put("Empty", - new RegionStat(0.0, 0.0, false, false, false, false)); + new RegionStat(0.0, 0.0, EnumSet.noneOf(RegionFlag.class))); items.put("1/2 Used", - new RegionStat(0.5, 0.0, false, false, false, false)); + new RegionStat(0.5, 0.0, EnumSet.noneOf(RegionFlag.class))); items.put("Fully Used", - new RegionStat(1.0, 0.0, false, false, false, false)); + new RegionStat(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 Live", - new RegionStat(1.0, 1.0, false, false, false, false)); + new RegionStat(1.0, 1.0, EnumSet.noneOf(RegionFlag.class))); items.put("Fully Live + Humongous", - new RegionStat(1.0, 1.0, false, true, false, false)); + new RegionStat(1.0, 1.0, EnumSet.of(HUMONGOUS))); items.put("1/3 Live", - new RegionStat(1.0, 0.3, false, false, false, false)); + new RegionStat(1.0, 0.3, EnumSet.noneOf(RegionFlag.class))); items.put("1/3 Live + In Collection Set", - new RegionStat(1.0, 0.3, false, false, true, false)); + new RegionStat(1.0, 0.3, EnumSet.of(IN_COLLECTION_SET))); + + items.put("1/3 Live + Pinned", + new RegionStat(1.0, 0.3, EnumSet.of(PINNED))); { int i = 1;