|
MemoryMonitor |
|
package ij.plugin; import ij.*; import ij.gui.*; import ij.process.*; import java.awt.*; import java.awt.image.*; import java.awt.event.*; /** This plugin continuously plots ImageJ's memory utilization. It could also be used as a starting point for a video acquisition plugin. Hold down the alt/option key when selecting the <code>Monitor Memory</code> command and the plugin will use a 640x480 window and display the frame rate. Click on the status bar in the ImageJ window to force the JVM to do garbage collection. */ public class MemoryMonitor implements PlugIn { int width = 200; int height = 75; long fps, startTime, elapsedTime; ImageProcessor ip; int frames; ImageCanvas ic; float[] mem; int index; long value; int max = 12*1204*1024; // 12MB long maxMemory = IJ.maxMemory(); public void run(String arg) { if (IJ.altKeyDown()) { // simulate frame grabber width = 640; height = 480; } ip = new ByteProcessor(width, height, new byte[width*height], null); ip.setColor(Color.white); ip.fill(); ip.setColor(Color.black); ip.setFont(new Font("SansSerif",Font.PLAIN,12)); ip.setAntialiasedText(true); ip.snapshot(); ImagePlus imp = new ImagePlus("Memory", ip); ImageWindow.centerNextImage(); imp.show(); imp.lock(); ImageWindow win = imp.getWindow(); ic = win.getCanvas(); mem = new float[width+1]; Thread.currentThread().setPriority(Thread.MIN_PRIORITY); startTime = System.currentTimeMillis(); win.running = true; while (win.running) { updatePixels(); showValue(); imp.updateAndDraw(); if (width==640) Thread.yield(); else IJ.wait(100); frames++; } imp.unlock(); } void showValue() { double value2 = (double)value/1048576L; String s = IJ.d2s(value2,value2>50?0:2)+"MB"; if (maxMemory>0L) { double percent = value*100/maxMemory; s += " ("+(percent<1.0?"<1":IJ.d2s(percent,0)) + "%)"; } if (width==640) { elapsedTime = System.currentTimeMillis()-startTime; if (elapsedTime>0) { double scale = ic.getMagnification(); fps = (frames*10000)/elapsedTime; s += ", " + fps/10 + "." + fps%10 + " fps"; } } ip.moveTo(2, 15); ip.drawString(s); } void updatePixels() { long used = IJ.currentMemory(); if (frames%10==0) value=used; if (used>0.9*max) max*=2; mem[index++] = (float)used; if (index==mem.length) index = 0; ip.reset(); int index2 = index+1; if (index2==mem.length) index2 = 0; double scale = (double)height/max; ip.moveTo(0, height-(int)(mem[index2]*scale)); for (int x=1; x<width; x++) { index2++; if (index2==mem.length) index2 = 0; ip.lineTo(x, height-(int)(mem[index2]*scale)); } } }
|
MemoryMonitor |
|