Mercurial > hg > shenandoah-visualizer
changeset 11:9f6523b535b6
Print more interesting data.
author | shade |
---|---|
date | Wed, 14 Dec 2016 23:05:07 +0100 |
parents | fc25e75f82ee |
children | 0d3cba812224 |
files | src/main/java/org/openjdk/shenandoah/DataProvider.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 |
diffstat | 4 files changed, 83 insertions(+), 34 deletions(-) [+] |
line wrap: on
line diff
--- a/src/main/java/org/openjdk/shenandoah/DataProvider.java Wed Dec 14 22:40:22 2016 +0100 +++ b/src/main/java/org/openjdk/shenandoah/DataProvider.java Wed Dec 14 23:05:07 2016 +0100 @@ -41,7 +41,7 @@ boolean isMarking = (status.longValue() & 0x1) > 0; boolean isEvacuating = (status.longValue() & 0x2) > 0; - return new Snapshot(System.currentTimeMillis(), stats, isMarking, isEvacuating); + return new Snapshot(System.currentTimeMillis(), maxSize, stats, isMarking, isEvacuating); } }
--- a/src/main/java/org/openjdk/shenandoah/RegionStat.java Wed Dec 14 22:40:22 2016 +0100 +++ b/src/main/java/org/openjdk/shenandoah/RegionStat.java Wed Dec 14 23:05:07 2016 +0100 @@ -16,6 +16,7 @@ private final boolean inCset; private final double liveLvl; private final double usedLvl; + private long ma; public RegionStat(double usedLvl, double liveLvl, boolean unused, boolean humongous, boolean inCset) { this.usedLvl = usedLvl; @@ -103,4 +104,12 @@ result = 31 * result + (int) (temp ^ (temp >>> 32)); return result; } + + public double live() { + return liveLvl; + } + + public double used() { + return usedLvl; + } }
--- a/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java Wed Dec 14 22:40:22 2016 +0100 +++ b/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java Wed Dec 14 23:05:07 2016 +0100 @@ -29,6 +29,8 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -41,6 +43,7 @@ static volatile BufferedImage renderedImage; private static volatile int width; private static volatile int height; + static final long START_TIME = System.currentTimeMillis(); static class VisPanel extends JPanel { public void paint(Graphics g) { @@ -99,7 +102,7 @@ Graphics g = img.getGraphics(); final int PAD = 20; - final int LINE = 30; + final int LINE = 20; final int PAD_TOP = 100; final int PAD_RIGHT = 300; @@ -113,38 +116,9 @@ g.setColor(Color.WHITE); g.fillRect(0, 0, width, height); - // Draw time + // Draw extra data g.setColor(Color.BLACK); - g.drawString(String.valueOf(snapshot.time()), PAD, PAD); - - // Draw legend - final int LEGEND_X = width - PAD_RIGHT; - final int LEGEND_Y = PAD_TOP; - final int LABEL_X = (int) (LEGEND_X + sqSize * 1.5); - - new RegionStat(0.0, 0.0, true, false, false) - .render(g, LEGEND_X, LEGEND_Y + 1 * LINE, sqSize, sqSize); - g.drawString("Unused", LABEL_X, LEGEND_Y + 1 * LINE + sqSize); - - new RegionStat(0.0, 0.0, false, false, false) - .render(g, LEGEND_X, LEGEND_Y + 2 * LINE, sqSize, sqSize); - g.drawString("Empty", LABEL_X, LEGEND_Y + 2 * LINE + sqSize); - - new RegionStat(1.0, 1.0, false, false, false) - .render(g, LEGEND_X, LEGEND_Y + 3 * LINE, sqSize, sqSize); - g.drawString("Live", LABEL_X, LEGEND_Y + 3 * LINE + sqSize); - - new RegionStat(1.0, 1.0, false, true, false) - .render(g, LEGEND_X, LEGEND_Y + 4 * LINE, sqSize, sqSize); - g.drawString("Live + Humongous", LABEL_X, LEGEND_Y + 4 * LINE + sqSize); - - new RegionStat(1.0, 0.3, false, false, false) - .render(g, LEGEND_X, LEGEND_Y + 5 * LINE, sqSize, sqSize); - g.drawString("1/3 Live", LABEL_X, LEGEND_Y + 5 * LINE + sqSize); - - new RegionStat(1.0, 0.3, false, false, true) - .render(g, LEGEND_X, LEGEND_Y + 6 * LINE, sqSize, sqSize); - g.drawString("1/3 Live + In Collection Set", LABEL_X, LEGEND_Y + 6 * LINE + sqSize); + g.drawString("Time: " + (snapshot.time() - START_TIME) + " ms", PAD, PAD); // Draw status g.setColor(Color.BLACK); @@ -160,6 +134,50 @@ } g.drawString("Status: " + status, PAD, PAD + 1 * LINE); + g.drawString("Total: " + (snapshot.total() / 1024 / 1024) + " MB", PAD, PAD + 2 * LINE); + g.drawString("Used: " + (snapshot.used() / 1024 / 1024) + " MB", PAD, PAD + 3 * LINE); + g.drawString("Live: " + (snapshot.live() / 1024 / 1024) + " MB", PAD, PAD + 4 * LINE); + + // Draw legend + final int LEGEND_X = PAD + fieldWidth + sqSize; + final int LEGEND_Y = PAD_TOP; + + Map<String, RegionStat> items = new LinkedHashMap<>(); + + items.put("Unused", + new RegionStat(0.0, 0.0, true, false, false)); + + items.put("Empty", + new RegionStat(0.0, 0.0, false, false, false)); + + items.put("1/2 Used", + new RegionStat(0.5, 0.0, false, false, false)); + + items.put("Fully Used", + new RegionStat(1.0, 0.0, false, false, false)); + + items.put("Fully Live", + new RegionStat(1.0, 1.0, false, false, false)); + + items.put("Fully Live + Humongous", + new RegionStat(1.0, 1.0, false, true, false)); + + items.put("1/3 Live", + new RegionStat(1.0, 0.3, false, false, false)); + + items.put("1/3 Live + In Collection Set", + new RegionStat(1.0, 0.3, false, false, true)); + + { + int i = 1; + for (String key : items.keySet()) { + int y = (int) (LEGEND_Y + i * sqSize * 1.5); + items.get(key).render(g, LEGEND_X, y, sqSize, sqSize); + g.drawString(key, (int) (LEGEND_X + sqSize * 1.5), y + sqSize); + i++; + } + } + // Draw region field for (int i = 0; i < snapshot.regionCount(); i++) {
--- a/src/main/java/org/openjdk/shenandoah/Snapshot.java Wed Dec 14 22:40:22 2016 +0100 +++ b/src/main/java/org/openjdk/shenandoah/Snapshot.java Wed Dec 14 23:05:07 2016 +0100 @@ -5,12 +5,14 @@ public class Snapshot { private final long time; + private final long regionSize; private final List<RegionStat> stats; private final boolean isMarking; private final boolean isEvacuating; - public Snapshot(long time, List<RegionStat> stats, boolean isMarking, boolean isEvacuating) { + public Snapshot(long time, long regionSize, List<RegionStat> stats, boolean isMarking, boolean isEvacuating) { this.time = time; + this.regionSize = regionSize; this.stats = stats; this.isMarking = isMarking; this.isEvacuating = isEvacuating; @@ -55,4 +57,24 @@ public int regionCount() { return stats.size(); } + + public long total() { + return regionSize * regionCount(); + } + + public long used() { + long used = 0L; + for (RegionStat rs : stats) { + used += regionSize * rs.used(); + } + return used; + } + + public long live() { + long live = 0L; + for (RegionStat rs : stats) { + live += regionSize * rs.live(); + } + return live; + } }