package jas.hist.test; import jas.hist.DataSource; import jas.hist.HasDataSource; import jas.hist.HasStyle; import jas.hist.HistogramUpdate; import jas.hist.JASHist1DHistogramStyle; import jas.hist.JASHistStyle; import jas.hist.Rebinnable1DHistogramData; import jas.hist.Statistics; import jas.hist.util.ObserverAdapter; import java.util.Observable; public class MemoryDataSource extends ObserverAdapter implements HasDataSource, Rebinnable1DHistogramData, HasStyle { private static final HistogramUpdate hdr = new HistogramUpdate(HistogramUpdate.DATA_UPDATE,true); private static final int SECONDS = 60; public MemoryDataSource() { super(t); } public DataSource getDataSource(String param) { return this; } public double[][] rebin(int nbin, double min, double max, boolean wantErrors, boolean hurry) { double[] result = t.getSnapshot(); double[][] r = { result }; return r; } public double getMin() { return -SECONDS; } public double getMax() { return 0; } public int getBins() { return SECONDS; } public boolean isRebinnable() { return false; } public int getAxisType() { return Rebinnable1DHistogramData.INTEGER; } public String[] getAxisLabels() { return null; } public Statistics getStatistics() { return null; } public String getTitle() { return "Java Memory Usage"; } public JASHistStyle getStyle() { JASHist1DHistogramStyle style = new JASHist1DHistogramStyle(); style.setShowErrorBars(false); style.setShowDataPoints(true); style.setShowLinesBetweenPoints(true); style.setShowHistogramBars(false); return style; } private static MemoryThread t = new MemoryThread(); private static class MemoryThread extends Observable implements Runnable { MemoryThread() { bins = new double[SECONDS]; for (int i=0; i<SECONDS; i++) bins[i] = Double.NaN; thread = new Thread(this); thread.setDaemon(true); thread.start(); } public void run() { try { Runtime r = Runtime.getRuntime(); for (;;) { synchronized (this) { bins[index++] = (r.totalMemory() - r.freeMemory())/1000000.; if (index>=SECONDS) index = 0; } setChanged(); notifyObservers(hdr); thread.sleep(1000); } } catch (InterruptedException x) { } } synchronized double[] getSnapshot() { double[] result = new double[SECONDS]; int j=0; for (int i=index; i<SECONDS; i++) result[j++] = bins[i]; for (int i=0; i<index; i++) result[j++] = bins[i]; return result; } private Thread thread; private int index = 0; private double[] bins; } }