changeset 5:98d295144a63

Split out DataProvider.
author shade
date Wed, 14 Dec 2016 20:00:08 +0100
parents b3656d96320f
children eae0bc17379a
files src/main/java/org/openjdk/shenandoah/DataProvider.java src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java
diffstat 2 files changed, 51 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/openjdk/shenandoah/DataProvider.java	Wed Dec 14 20:00:08 2016 +0100
@@ -0,0 +1,44 @@
+package org.openjdk.shenandoah;
+
+import sun.jvmstat.monitor.*;
+
+public class DataProvider {
+
+    private final int maxRegions;
+    private final long maxSize;
+    private final LongMonitor[] data;
+    private final LongMonitor status;
+
+    public DataProvider(String id) throws Exception {
+        MonitoredHost host = MonitoredHost.getMonitoredHost(id);
+        MonitoredVm vm = host.getMonitoredVm(new VmIdentifier(id));
+        LongMonitor max_regions_mon = (LongMonitor) vm.findByName("sun.gc.shenandoah.regions.max_regions");
+        maxRegions = (int) max_regions_mon.longValue();
+        LongMonitor max_size_mon = (LongMonitor) vm.findByName("sun.gc.shenandoah.regions.region_size");
+        maxSize = max_size_mon.longValue();
+        status = (LongMonitor) vm.findByName("sun.gc.shenandoah.regions.status");
+
+        data = new LongMonitor[maxRegions];
+        for (int i = 0; i < maxRegions; i++) {
+            LongMonitor mon = (LongMonitor) vm.findByName("sun.gc.shenandoah.regions.region." + i + ".data");
+            if (mon != null) {
+                data[i] = mon;
+            } else {
+                throw new IllegalStateException("Insufficient shared memory for all region counters. " +
+                        "Try -XX:PerfDataMemorySize=512K or higher when running the monitored program.");
+            }
+        }
+    }
+
+    public int maxRegions() {
+        return maxRegions;
+    }
+
+    public long status() {
+        return status.longValue();
+    }
+
+    public RegionStat regionStat(int i) {
+        return new RegionStat(maxSize, data[i].longValue());
+    }
+}
--- a/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java	Wed Dec 14 19:51:03 2016 +0100
+++ b/src/main/java/org/openjdk/shenandoah/ShenandoahVisualizer.java	Wed Dec 14 20:00:08 2016 +0100
@@ -22,11 +22,6 @@
  */
 package org.openjdk.shenandoah;
 
-import sun.jvmstat.monitor.LongMonitor;
-import sun.jvmstat.monitor.MonitoredHost;
-import sun.jvmstat.monitor.MonitoredVm;
-import sun.jvmstat.monitor.VmIdentifier;
-
 import javax.swing.*;
 import java.awt.*;
 import java.awt.event.ComponentAdapter;
@@ -90,20 +85,8 @@
             System.err.println("missing VM identifier");
             System.exit(-1);
         }
-        MonitoredHost host = MonitoredHost.getMonitoredHost(args[0]);
-        MonitoredVm vm = host.getMonitoredVm(new VmIdentifier(args[0]));
-        LongMonitor max_regions_mon = (LongMonitor) vm.findByName("sun.gc.shenandoah.regions.max_regions");
-        int max_regions = (int) max_regions_mon.longValue();
-        LongMonitor max_size_mon = (LongMonitor) vm.findByName("sun.gc.shenandoah.regions.region_size");
-        long max_size = max_size_mon.longValue();
-        LongMonitor status_mon = (LongMonitor) vm.findByName("sun.gc.shenandoah.regions.status");
 
-        System.out.println("max_regions: " + max_regions);
-        LongMonitor[] mons_data = new LongMonitor[max_regions];
-        for (int i = 0; i < max_regions; i++) {
-            mons_data[i] = (LongMonitor) vm.findByName("sun.gc.shenandoah.regions.region." + i + ".data");
-            //System.out.println("region " + i + " used: " + mons[i].longValue());
-        }
+        DataProvider data = new DataProvider(args[0]);
 
         img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
         VisPanel p = new VisPanel();
@@ -122,27 +105,22 @@
                 doRepaint = false;
             }
         });
-        int cols = (int) Math.floor(Math.sqrt(max_regions));
-        int rows = (int) Math.floor(max_regions / cols);
+        int cols = (int) Math.floor(Math.sqrt(data.maxRegions()));
+        int rows = (int) Math.floor(data.maxRegions() / cols);
         while (doRepaint) {
             long start = System.currentTimeMillis();
             synchronized (ShenandoahVisualizer.class) {
-                isMarking = (status_mon.longValue() & 0x1) > 0;
-                isEvacuating = (status_mon.longValue() & 0x2) > 0;
+                isMarking = (data.status() & 0x1) > 0;
+                isEvacuating = (data.status() & 0x2) > 0;
 
                 int rectWidth = img.getWidth() / cols;
                 int rectHeight = img.getHeight() / rows;
                 Graphics g = img.getGraphics();
-                for (int i = 0; i < max_regions; i++) {
+                for (int i = 0; i < data.maxRegions(); i++) {
                     int rectx = (i % cols) * rectWidth;
                     int recty = (i / rows) * rectHeight;
 
-                    if (mons_data[i] == null) {
-                        System.err.println("Insufficient shared memory for all region counters. Try -XX:PerfDataMemorySize=512K or higher when running the monitored program.");
-                        System.exit(-1);
-                    }
-
-                    RegionStat s = new RegionStat(max_size, mons_data[i].longValue());
+                    RegionStat s = data.regionStat(i);
                     s.render(g, rectx, recty, rectWidth, rectHeight);
                 }
                 g.dispose();