| 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 |