Mercurial > hg > shenandoah-visualizer
changeset 28:e22defb2a606
Handle shared allocations profiling.
author | shade |
---|---|
date | Tue, 13 Jun 2017 13:20:06 +0200 |
parents | 0a0c91d93ea2 |
children | a5a481b56059 |
files | src/main/java/org/openjdk/shenandoah/Colors.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 src/main/java/org/openjdk/shenandoah/SnapshotView.java |
diffstat | 5 files changed, 74 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/src/main/java/org/openjdk/shenandoah/Colors.java Fri May 12 10:59:42 2017 +0200 +++ b/src/main/java/org/openjdk/shenandoah/Colors.java Tue Jun 13 13:20:06 2017 +0200 @@ -9,6 +9,8 @@ static final Color TIMELINE_EVACUATING = new Color(100, 0, 0); static final Color TIMELINE_UPDATEREFS = new Color(0, 100, 100); + static final Color SHARED_ALLOC = new Color(250, 129, 0); + static final Color SHARED_ALLOC_BORDER = new Color(142, 71, 0); 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);
--- a/src/main/java/org/openjdk/shenandoah/RegionStat.java Fri May 12 10:59:42 2017 +0200 +++ b/src/main/java/org/openjdk/shenandoah/RegionStat.java Tue Jun 13 13:20:06 2017 +0200 @@ -15,6 +15,7 @@ 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 SHARED_SHIFT = 28; private static final int FLAGS_SHIFT = 58; private final EnumSet<RegionFlag> flags; @@ -23,13 +24,15 @@ private final float usedLvl; private final float tlabLvl; private final float gclabLvl; + private final float sharedLvl; - public RegionStat(float usedLvl, float liveLvl, float tlabLvl, float gclabLvl, EnumSet<RegionFlag> flags) { + public RegionStat(float usedLvl, float liveLvl, float tlabLvl, float gclabLvl, float sharedLvl, EnumSet<RegionFlag> flags) { this.incoming = null; this.usedLvl = usedLvl; this.liveLvl = liveLvl; this.tlabLvl = tlabLvl; this.gclabLvl = gclabLvl; + this.sharedLvl = sharedLvl; this.flags = flags; } @@ -38,6 +41,7 @@ liveLvl = ((data >>> LIVE_SHIFT) & PERCENT_MASK) / 100F; tlabLvl = ((data >>> TLAB_SHIFT) & PERCENT_MASK) / 100F; gclabLvl = ((data >>> GCLAB_SHIFT) & PERCENT_MASK) / 100F; + sharedLvl = ((data >>> SHARED_SHIFT) & PERCENT_MASK) / 100F; long stat = (data >>> FLAGS_SHIFT) & FLAGS_MASK; @@ -73,26 +77,38 @@ g.setColor(USED); g.fillRect(x, y, usedWidth, height); - if (gclabLvl > 0 || tlabLvl > 0) { + int liveWidth = (int) (width * liveLvl); + g.setColor(LIVE); + g.fillRect(x, y, liveWidth, height); + + g.setColor(LIVE_BORDER); + g.drawLine(x + liveWidth, y, x + liveWidth, y + height); + + if (gclabLvl > 0 || tlabLvl > 0 || sharedLvl > 0) { + int sharedWidth = (int) (width * sharedLvl); int tlabWidth = (int) (width * tlabLvl); int gclabWidth = (int) (width * gclabLvl); + + int h = height / 3; + int ly = y + (height - h); + int lx = x; + g.setColor(TLAB_ALLOC); - g.fillRect(x, y, tlabWidth, height); + g.fillRect(lx, ly, tlabWidth, h); g.setColor(TLAB_ALLOC_BORDER); - g.drawLine(x + tlabWidth, y, x + tlabWidth, y + height); + g.drawRect(lx, ly, tlabWidth, h); - int lx = x + tlabWidth; + lx += tlabWidth; g.setColor(GCLAB_ALLOC); - g.fillRect(lx, y, gclabWidth, height); + g.fillRect(lx, ly, gclabWidth, h); 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); + g.drawRect(lx, ly, gclabWidth, h); - g.setColor(LIVE_BORDER); - g.drawLine(x + liveWidth, y, x + liveWidth, y + height); + lx += gclabWidth; + g.setColor(SHARED_ALLOC); + g.fillRect(lx, ly, sharedWidth, h); + g.setColor(SHARED_ALLOC_BORDER); + g.drawRect(lx, ly, sharedWidth, h); } if (flags.contains(RegionFlag.IN_COLLECTION_SET)) { @@ -120,7 +136,7 @@ g.fillOval(x + width/2, y + height/2, width/4, height/4); } - g.setColor(Color.BLACK); + g.setColor(Color.GRAY); g.drawRect(x, y, width, height); } @@ -166,6 +182,10 @@ return gclabLvl; } + public float sharedAllocs() { + return sharedLvl; + } + public EnumSet<RegionFlag> flags() { return flags; }
--- a/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java Fri May 12 10:59:42 2017 +0200 +++ b/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java Tue Jun 13 13:20:06 2017 +0200 @@ -222,6 +222,8 @@ g.setColor(Colors.USED); g.drawRect(x, (int) Math.round(graphHeight - s.used() * stepY), 1, 1); + g.setColor(Colors.SHARED_ALLOC); + g.drawRect(x, (int) Math.round(graphHeight - s.sharedAllocs() * 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); @@ -241,40 +243,46 @@ Map<String, RegionStat> items = new LinkedHashMap<>(); items.put("Unused", - new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, EnumSet.of(UNUSED))); + new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, EnumSet.of(UNUSED))); items.put("Empty", - new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); items.put("1/2 Used", - new RegionStat(0.5f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(0.5f, 0.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); items.put("Fully Used", - new RegionStat(1.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); items.put("Fully Used, 100% TLAB Allocs", - new RegionStat(1.0f, 0.0f, 1.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(1.0f, 0.0f, 1.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); items.put("Fully Used, 100% GCLAB Allocs", - new RegionStat(1.0f, 0.0f, 0.0f, 1.0f, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); + + items.put("Fully Used, 100% Shared Allocs", + new RegionStat(1.0f, 0.0f, 0.0f, 0.0f, 1.0f, EnumSet.noneOf(RegionFlag.class))); items.put("Fully Used, 50%/50% TLAB/GCLAB Allocs", - new RegionStat(1.0f, 0.0f, 0.5f, 0.5f, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(1.0f, 0.0f, 0.5f, 0.5f, 0.0f, EnumSet.noneOf(RegionFlag.class))); + + 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))); items.put("Fully Live", - new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); items.put("Fully Live + Humongous", - new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, EnumSet.of(HUMONGOUS))); + new RegionStat(1.0f, 1.0f, 0.0f, 0.0f, 0.0f, EnumSet.of(HUMONGOUS))); items.put("1/3 Live", - new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); + new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, 0.0f, EnumSet.noneOf(RegionFlag.class))); items.put("1/3 Live + In Collection Set", - new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, EnumSet.of(IN_COLLECTION_SET))); + new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, 0.0f, EnumSet.of(IN_COLLECTION_SET))); items.put("1/3 Live + Pinned", - new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, EnumSet.of(PINNED))); + new RegionStat(1.0f, 0.3f, 0.0f, 0.0f, 0.0f, EnumSet.of(PINNED))); int i = 1; for (String key : items.keySet()) { @@ -288,11 +296,12 @@ public synchronized void renderRegions(Graphics g) { int area = regionWidth * regionHeight; int sqSize = Math.max(1, (int) Math.sqrt(1D * area / snapshot.regionCount())); - int cols = regionWidth / sqSize; + int cellSize = sqSize + 3; + int cols = regionWidth / cellSize; for (int i = 0; i < snapshot.regionCount(); i++) { - int rectx = (i % cols) * sqSize; - int recty = (i / cols) * sqSize; + int rectx = (i % cols) * cellSize; + int recty = (i / cols) * cellSize; RegionStat s = snapshot.get(i); s.render(g, rectx, recty, sqSize, sqSize);
--- a/src/main/java/org/openjdk/shenandoah/Snapshot.java Fri May 12 10:59:42 2017 +0200 +++ b/src/main/java/org/openjdk/shenandoah/Snapshot.java Tue Jun 13 13:20:06 2017 +0200 @@ -97,6 +97,14 @@ return r; } + public long sharedAllocs() { + long r = 0L; + for (RegionStat rs : stats) { + r += regionSize * rs.sharedAllocs(); + } + return r; + } + public long collectionSet() { long used = 0L; for (RegionStat rs : stats) {
--- a/src/main/java/org/openjdk/shenandoah/SnapshotView.java Fri May 12 10:59:42 2017 +0200 +++ b/src/main/java/org/openjdk/shenandoah/SnapshotView.java Tue Jun 13 13:20:06 2017 +0200 @@ -9,6 +9,7 @@ private final long live; private final long tlabAllocs; private final long gclabAllocs; + private final long sharedAllocs; private final long humongous; private final long collectionSet; @@ -18,6 +19,7 @@ total = total(); used = s.used(); live = s.live(); + sharedAllocs = s.sharedAllocs(); tlabAllocs = s.tlabAllocs(); gclabAllocs = s.gclabAllocs(); humongous = s.humongous(); @@ -40,6 +42,10 @@ return used; } + public long sharedAllocs() { + return sharedAllocs; + } + public long tlabAllocs() { return tlabAllocs; }