view src/main/java/org/openjdk/shenandoah/DataProvider.java @ 5:98d295144a63

Split out DataProvider.
author shade
date Wed, 14 Dec 2016 20:00:08 +0100
parents
children 8dc27cf89d58
line wrap: on
line source

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());
    }
}