Author: bback
Date: 2006-02-19 14:14:42 +0000 (Sun, 19 Feb 2006)
New Revision: 8069
Added:
trunk/apps/frost-0.7/source/frost/util/gui/MemoryMonitor.java
Log:
added a memory monitor (see help menu)
Added: trunk/apps/frost-0.7/source/frost/util/gui/MemoryMonitor.java
===================================================================
--- trunk/apps/frost-0.7/source/frost/util/gui/MemoryMonitor.java
2006-02-19 14:14:15 UTC (rev 8068)
+++ trunk/apps/frost-0.7/source/frost/util/gui/MemoryMonitor.java
2006-02-19 14:14:42 UTC (rev 8069)
@@ -0,0 +1,360 @@
+package frost.util.gui;
+/*
+ * @(#)MemoryMonitor.java 1.26 99/04/23
+ *
+ * Copyright (c) 1998, 1999 by Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
+ * modify and redistribute this software in source and binary code form,
+ * provided that i) this copyright notice and license appear on all copies of
+ * the software; and ii) Licensee does not utilize the software in a manner
+ * which is disparaging to Sun.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
+ * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
+ * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
+ * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
+ * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
+ * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
+ * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * This software is not designed or intended for use in on-line control of
+ * aircraft, air traffic, aircraft navigation or aircraft communications; or in
+ * the design, construction, operation or maintenance of any nuclear
+ * facility. Licensee represents and warrants that it will not use or
+ * redistribute the Software for such purposes.
+ */
+
+/**
+ * 05/07/31, added sequential system.gc() call
+ */
+
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.geom.*;
+import java.awt.image.*;
+
+import javax.swing.*;
+
+/**
+ * Tracks Memory allocated & used, displayed in graph form.
+ */
+public class MemoryMonitor extends JPanel {
+
+ public Surface surf;
+// JPanel controls;
+// boolean doControls;
+// JTextField tf;
+// JCheckBox box;
+
+ JFrame dialog = null;
+ boolean isShown = false;
+
+ private JFrame getDialog() {
+ if( dialog == null ) {
+ dialog = new JFrame();
+ dialog.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
+ dialog.add(this);
+ dialog.setSize(225,130);
+ dialog.setTitle("Frost Memory Monitor");
+ dialog.addWindowListener(new WindowAdapter() {
+ public void windowClosing(WindowEvent e) {
+ surf.stop();
+ isShown = false;
+ dialog.setVisible(false);
+ }
+ });
+ }
+ return dialog;
+ }
+
+ public void showDialog() {
+ if( isShown ) {
+ return;
+ }
+ surf.start();
+ isShown = true;
+ getDialog().setVisible(true);
+ }
+
+ public MemoryMonitor() {
+ setLayout(new BorderLayout());
+// setBorder(new TitledBorder(new EtchedBorder(), "Memory Monitor"));
+ add(surf = new Surface());
+// controls = new JPanel();
+// controls.setToolTipText("click to start/stop monitoring + memory
saving");
+// Font font = new Font("serif", Font.PLAIN, 10);
+// JLabel label;
+// tf = new JTextField("1000");
+// tf.setPreferredSize(new Dimension(40,20));
+// controls.add(tf);
+// controls.add(label = new JLabel("ms"));
+//
+// box = new JCheckBox("call gc()");
+// box.setPreferredSize(new Dimension(80,20));
+// box.setSelected(true);
+// controls.add(box);
+//
+// controls.setPreferredSize(new Dimension(100, 80));
+// controls.setMaximumSize(new Dimension(100, 80));
+// label.setFont(font);
+// label.setForeground(Color.black);
+// addMouseListener(new MouseAdapter() {
+// public void mouseClicked(MouseEvent e)
+// {
+// removeAll();
+//
+// if ((doControls = !doControls))
+// {
+// surf.stop();
+// add(controls);
+// }
+// else
+// {
+// try {
+// long val =
Long.parseLong(tf.getText().trim());
+//
+// if (val >= 50)
+// surf.sleepAmount = val;
+// } catch (Exception ex) {}
+//
+// surf.start();
+// add(surf);
+// }
+// validate();
+// repaint();
+// }
+// });
+ }
+
+
+ public class Surface extends JPanel implements Runnable {
+
+ public Thread thread;
+ public long sleepAmount = 1000;
+ private int w, h;
+ private BufferedImage bimg;
+ private Graphics2D big;
+ private Font font = new Font("Times New Roman", Font.PLAIN, 11);
+ private Runtime r = Runtime.getRuntime();
+ private int columnInc;
+ private int pts[];
+ private int ptNum;
+ private int ascent, descent;
+ private float freeMemory, totalMemory;
+ private Rectangle graphOutlineRect = new Rectangle();
+ private Rectangle2D mfRect = new Rectangle2D.Float();
+ private Rectangle2D muRect = new Rectangle2D.Float();
+ private Line2D graphLine = new Line2D.Float();
+ private Color graphColor = new Color(46, 139, 87);
+ private Color mfColor = new Color(0, 100, 0);
+ private String usedStr;
+
+ private int gc_counter = 0;
+
+ public Surface() {
+ setBackground(Color.black);
+// addMouseListener(new MouseAdapter() {
+// public void mouseClicked(MouseEvent e) {
+// if (thread == null) start(); else stop();
+// }
+// });
+ }
+
+ public Dimension getMinimumSize() {
+ return getPreferredSize();
+ }
+
+ public Dimension getMaximumSize() {
+ return getPreferredSize();
+ }
+
+ public Dimension getPreferredSize() {
+ return new Dimension(100, 80);
+ }
+
+
+ public void paint(Graphics g) {
+
+ if (big == null) {
+ return;
+ }
+
+ big.setBackground(getBackground());
+ big.clearRect(0,0,w,h);
+
+ float freeMemory = (float) r.freeMemory();
+ float totalMemory = (float) r.totalMemory();
+
+ // .. Draw allocated and used strings ..
+ big.setColor(Color.green);
+ big.drawString(String.valueOf((int) totalMemory/1024) + "K
allocated", 4.0f, (float) ascent+0.5f);
+ usedStr = String.valueOf(((int) (totalMemory - freeMemory))/1024)
+ + "K used";
+ big.drawString(usedStr, 4, h-descent);
+
+ // Calculate remaining size
+ float ssH = ascent + descent;
+ float remainingHeight = (float) (h - (ssH*2) - 0.5f);
+ float blockHeight = remainingHeight/10;
+ float blockWidth = 20.0f;
+ float remainingWidth = (float) (w - blockWidth - 10);
+
+ // .. Memory Free ..
+ big.setColor(mfColor);
+ int MemUsage = (int) ((freeMemory / totalMemory) * 10);
+ int i = 0;
+ for ( ; i < MemUsage ; i++) {
+ mfRect.setRect(5,(float) ssH+i*blockHeight,
+ blockWidth,(float) blockHeight-1);
+ big.fill(mfRect);
+ }
+
+ // .. Memory Used ..
+ big.setColor(Color.green);
+ for ( ; i < 10; i++) {
+ muRect.setRect(5,(float) ssH+i*blockHeight,
+ blockWidth,(float) blockHeight-1);
+ big.fill(muRect);
+ }
+
+ // .. Draw History Graph ..
+ big.setColor(graphColor);
+ int graphX = 30;
+ int graphY = (int) ssH;
+ int graphW = w - graphX - 5;
+ int graphH = (int) remainingHeight;
+ graphOutlineRect.setRect(graphX, graphY, graphW, graphH);
+ big.draw(graphOutlineRect);
+
+ int graphRow = graphH/10;
+
+ // .. Draw row ..
+ for (int j = graphY; j <= graphH+graphY; j += graphRow) {
+ graphLine.setLine(graphX,j,graphX+graphW,j);
+ big.draw(graphLine);
+ }
+
+ // .. Draw animated column movement ..
+ int graphColumn = graphW/15;
+
+ if (columnInc == 0) {
+ columnInc = graphColumn;
+ }
+
+ for (int j = graphX+columnInc; j < graphW+graphX; j+=graphColumn) {
+ graphLine.setLine(j,graphY,j,graphY+graphH);
+ big.draw(graphLine);
+ }
+
+ --columnInc;
+
+ if (pts == null) {
+ pts = new int[graphW];
+ ptNum = 0;
+ } else if (pts.length != graphW) {
+ int tmp[] = null;
+ if (ptNum < graphW) {
+ tmp = new int[ptNum];
+ System.arraycopy(pts, 0, tmp, 0, tmp.length);
+ } else {
+ tmp = new int[graphW];
+ System.arraycopy(pts, pts.length-tmp.length, tmp, 0,
tmp.length);
+ ptNum = tmp.length - 2;
+ }
+ pts = new int[graphW];
+ System.arraycopy(tmp, 0, pts, 0, tmp.length);
+ } else {
+ big.setColor(Color.yellow);
+ pts[ptNum] = (int)(graphY+graphH*(freeMemory/totalMemory));
+ for (int j=graphX+graphW-ptNum, k=0;k < ptNum; k++, j++) {
+ if (k != 0) {
+ if (pts[k] != pts[k-1]) {
+ big.drawLine(j-1, pts[k-1], j, pts[k]);
+ } else {
+ big.fillRect(j, pts[k], 1, 1);
+ }
+ }
+ }
+ if (ptNum+2 == pts.length) {
+ // throw out oldest point
+ for (int j = 1;j < ptNum; j++) {
+ pts[j-1] = pts[j];
+ }
+ --ptNum;
+ } else {
+ ptNum++;
+ }
+ }
+
+ if (gc_counter > 4)
+ {
+ //if (!Common.isRunningProcess() && thread !=
null && box.isSelected() && freeMemory < 2048000L)
+ if (thread != null /*&& box.isSelected()*/ &&
freeMemory < 2048000L)
+ {
+ big.setColor(Color.red);
+ big.fillRect(84, h - descent - 6, 4, 4);
+
+ System.gc();
+ }
+
+ gc_counter = 0;
+ }
+ else
+ gc_counter++;
+
+ g.drawImage(bimg, 0, 0, this);
+ }
+
+
+ public void start() {
+ thread = new Thread(this);
+ thread.setPriority(Thread.MIN_PRIORITY);
+ thread.setName("MemoryMonitor");
+ thread.start();
+ }
+
+
+ public synchronized void stop() {
+ thread = null;
+ notify();
+ }
+
+
+ public void run() {
+
+ Thread me = Thread.currentThread();
+
+ while (thread == me && !isShowing() || getSize().width == 0) {
+ try {
+ thread.sleep(500);
+ } catch (InterruptedException e) { return; }
+ }
+
+ while (thread == me && isShowing()) {
+ Dimension d = getSize();
+ if (d.width != w || d.height != h) {
+ w = d.width;
+ h = d.height;
+ bimg = (BufferedImage) createImage(w, h);
+ big = bimg.createGraphics();
+ big.setFont(font);
+ FontMetrics fm = big.getFontMetrics(font);
+ ascent = (int) fm.getAscent();
+ descent = (int) fm.getDescent();
+ }
+
+ repaint();
+
+ try {
+ thread.sleep(sleepAmount);
+ } catch (InterruptedException e) { break; }
+ }
+ thread = null;
+ }
+ }
+}