# HG changeset patch # User shade # Date 1494523746 -7200 # Node ID da66467f2884a15316db7f3c6fd761e07dd80e8e # Parent 0aaf8f2911616de10dbe1f676d3213af80942f52 Refactoring. diff -r 0aaf8f291161 -r da66467f2884 src/main/java/org/openjdk/shenandoah/Colors.java --- a/src/main/java/org/openjdk/shenandoah/Colors.java Thu May 11 19:10:06 2017 +0200 +++ b/src/main/java/org/openjdk/shenandoah/Colors.java Thu May 11 19:29:06 2017 +0200 @@ -4,13 +4,18 @@ public class Colors { - 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); - static final Color CSET = Color.YELLOW; - static final Color HUMONGOUS = Color.RED; + static final Color TIMELINE_IDLE = Color.BLACK; + static final Color TIMELINE_MARK = new Color(100, 100, 0); + static final Color TIMELINE_EVACUATING = new Color(100, 0, 0); + static final Color TIMELINE_UPDATEREFS = new Color(0, 100, 100); + + 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); + static final Color CSET = Color.YELLOW; + static final Color HUMONGOUS = Color.RED; } diff -r 0aaf8f291161 -r da66467f2884 src/main/java/org/openjdk/shenandoah/DataProvider.java --- a/src/main/java/org/openjdk/shenandoah/DataProvider.java Thu May 11 19:10:06 2017 +0200 +++ b/src/main/java/org/openjdk/shenandoah/DataProvider.java Thu May 11 19:29:06 2017 +0200 @@ -46,7 +46,7 @@ List stats = new ArrayList<>(); for (int c = 0; c < maxRegions; c++) { StringMonitor mtrx = matrix[c]; - stats.add(new RegionStat(maxSize, data[c].longValue(), (mtrx == null ? "" : mtrx.stringValue()))); + stats.add(new RegionStat(data[c].longValue(), (mtrx == null ? "" : mtrx.stringValue()))); } long time = timestamp.longValue(); diff -r 0aaf8f291161 -r da66467f2884 src/main/java/org/openjdk/shenandoah/RegionStat.java --- a/src/main/java/org/openjdk/shenandoah/RegionStat.java Thu May 11 19:10:06 2017 +0200 +++ b/src/main/java/org/openjdk/shenandoah/RegionStat.java Thu May 11 19:29:06 2017 +0200 @@ -9,22 +9,23 @@ public class RegionStat { private static final int PERCENT_MASK = 0x7f; + private static final int FLAGS_MASK = 0x3f; + 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; + private static final int FLAGS_SHIFT = 58; private final EnumSet flags; private final BitSet incoming; - private final double liveLvl; - private final double usedLvl; - private final double tlabLvl; - private final double gclabLvl; + private final float liveLvl; + private final float usedLvl; + private final float tlabLvl; + private final float gclabLvl; - public RegionStat(double usedLvl, double liveLvl, double tlabLvl, double gclabLvl, EnumSet flags) { - this.incoming = new BitSet(); + public RegionStat(float usedLvl, float liveLvl, float tlabLvl, float gclabLvl, EnumSet flags) { + this.incoming = null; this.usedLvl = usedLvl; this.liveLvl = liveLvl; this.tlabLvl = tlabLvl; @@ -32,11 +33,11 @@ this.flags = flags; } - public RegionStat(long maxSize, long data, String matrix) { - 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; + public RegionStat(long data, String matrix) { + usedLvl = ((data >>> USED_SHIFT) & PERCENT_MASK) / 100F; + liveLvl = ((data >>> LIVE_SHIFT) & PERCENT_MASK) / 100F; + tlabLvl = ((data >>> TLAB_SHIFT) & PERCENT_MASK) / 100F; + gclabLvl = ((data >>> GCLAB_SHIFT) & PERCENT_MASK) / 100F; long stat = (data >>> FLAGS_SHIFT) & FLAGS_MASK; @@ -47,16 +48,20 @@ if ((stat & 4) > 0) flags.add(RegionFlag.HUMONGOUS); if ((stat & 8) > 0) flags.add(RegionFlag.PINNED); - this.incoming = new BitSet(); - int idx = 0; - for (char c : matrix.toCharArray()) { - c = (char) (c - 32); - incoming.set(idx++, (c & (1 << 0)) > 0); - incoming.set(idx++, (c & (1 << 1)) > 0); - incoming.set(idx++, (c & (1 << 2)) > 0); - incoming.set(idx++, (c & (1 << 3)) > 0); - incoming.set(idx++, (c & (1 << 4)) > 0); - incoming.set(idx++, (c & (1 << 5)) > 0); + if (!matrix.isEmpty()) { + this.incoming = new BitSet(); + int idx = 0; + for (char c : matrix.toCharArray()) { + c = (char) (c - 32); + incoming.set(idx++, (c & (1 << 0)) > 0); + incoming.set(idx++, (c & (1 << 1)) > 0); + incoming.set(idx++, (c & (1 << 2)) > 0); + incoming.set(idx++, (c & (1 << 3)) > 0); + incoming.set(idx++, (c & (1 << 4)) > 0); + incoming.set(idx++, (c & (1 << 5)) > 0); + } + } else { + this.incoming = null; } } @@ -126,38 +131,38 @@ RegionStat that = (RegionStat) o; - if (Double.compare(that.liveLvl, liveLvl) != 0) return false; - if (Double.compare(that.usedLvl, usedLvl) != 0) return false; + if (Float.compare(that.liveLvl, liveLvl) != 0) return false; + 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; - return incoming.equals(that.incoming); + return incoming != null ? incoming.equals(that.incoming) : that.incoming == null; } @Override public int hashCode() { - int result; - long temp; - result = flags.hashCode(); - result = 31 * result + incoming.hashCode(); - temp = Double.doubleToLongBits(liveLvl); - result = 31 * result + (int) (temp ^ (temp >>> 32)); - temp = Double.doubleToLongBits(usedLvl); - result = 31 * result + (int) (temp ^ (temp >>> 32)); + int result = flags.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); + result = 31 * result + (tlabLvl != +0.0f ? Float.floatToIntBits(tlabLvl) : 0); + result = 31 * result + (gclabLvl != +0.0f ? Float.floatToIntBits(gclabLvl) : 0); return result; } - public double live() { + public float live() { return liveLvl; } - public double used() { + public float used() { return usedLvl; } - public double tlabAllocs() { + public float tlabAllocs() { return tlabLvl; } - public double gclabAllocs() { + public float gclabAllocs() { return gclabLvl; } diff -r 0aaf8f291161 -r da66467f2884 src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java --- a/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java Thu May 11 19:10:06 2017 +0200 +++ b/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java Thu May 11 19:29:06 2017 +0200 @@ -204,16 +204,16 @@ switch (s.phase()) { case IDLE: - g.setColor(Color.BLACK); + g.setColor(Colors.TIMELINE_IDLE); break; case MARKING: - g.setColor(new Color(100, 100, 0)); + g.setColor(Colors.TIMELINE_MARK); break; case EVACUATING: - g.setColor(new Color(100, 0, 0)); + g.setColor(Colors.TIMELINE_EVACUATING); break; case UPDATE_REFS: - g.setColor(new Color(0, 100, 100)); + g.setColor(Colors.TIMELINE_UPDATEREFS); break; default: g.setColor(Color.WHITE); @@ -241,40 +241,40 @@ Map items = new LinkedHashMap<>(); items.put("Unused", - new RegionStat(0.0, 0.0, 0.0, 0.0, EnumSet.of(UNUSED))); + new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, EnumSet.of(UNUSED))); items.put("Empty", - new RegionStat(0.0, 0.0, 0.0, 0.0, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); items.put("1/2 Used", - new RegionStat(0.5, 0.0, 0.0, 0.0, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(0.5f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); items.put("Fully Used", - new RegionStat(1.0, 0.0, 0.0, 0.0, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(1.0f, 0.0f, 0.0f, 0.0f, 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))); + new RegionStat(1.0f, 0.0f, 1.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); items.put("Fully Used, 100% GCLAB Allocs", - new RegionStat(1.0, 0.0, 0.0, 1.0, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(1.0f, 0.0f, 0.0f, 1.0f, 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))); + new RegionStat(1.0f, 0.0f, 0.5f, 0.5f, EnumSet.noneOf(RegionFlag.class))); items.put("Fully Live", - new RegionStat(1.0, 1.0, 0.0, 0.0, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); items.put("Fully Live + Humongous", - new RegionStat(1.0, 1.0, 0.0, 0.0, EnumSet.of(HUMONGOUS))); + new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, EnumSet.of(HUMONGOUS))); items.put("1/3 Live", - new RegionStat(1.0, 0.3, 0.0, 0.0, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); items.put("1/3 Live + In Collection Set", - new RegionStat(1.0, 0.3, 0.0, 0.0, EnumSet.of(IN_COLLECTION_SET))); + new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, EnumSet.of(IN_COLLECTION_SET))); items.put("1/3 Live + Pinned", - new RegionStat(1.0, 0.3, 0.0, 0.0, EnumSet.of(PINNED))); + new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, EnumSet.of(PINNED))); int i = 1; for (String key : items.keySet()) { @@ -303,15 +303,17 @@ for (int f = 0; f < snapshot.regionCount(); f++) { RegionStat s = snapshot.get(f); BitSet bs = s.incoming(); - for (int t = 0; t < snapshot.regionCount(); t++) { - if (bs.get(t)) { - int f_rectx = (int) ((f % cols + 0.5) * sqSize); - int f_recty = (int) ((f / cols + 0.5) * sqSize); - int t_rectx = (int) ((t % cols + 0.5) * sqSize); - int t_recty = (int) ((t / cols + 0.5) * sqSize); + if (bs != null) { + for (int t = 0; t < snapshot.regionCount(); t++) { + if (bs.get(t)) { + int f_rectx = (int) ((f % cols + 0.5) * sqSize); + int f_recty = (int) ((f / cols + 0.5) * sqSize); + int t_rectx = (int) ((t % cols + 0.5) * sqSize); + int t_recty = (int) ((t / cols + 0.5) * sqSize); - g.setColor(BASE); - g.drawLine(f_rectx, f_recty, t_rectx, t_recty); + g.setColor(BASE); + g.drawLine(f_rectx, f_recty, t_rectx, t_recty); + } } } }