/*
* @(#)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
*/
package net.sourceforge.dvb.projectx.gui;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.util.Date;
import javax.swing.*;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import net.sourceforge.dvb.projectx.common.Common;
/**
* Tracks Memory allocated & used, displayed in graph form.
*/
public class MemoryMonitor extends JPanel {
public Surface surf;
JPanel controls;
boolean doControls;
JTextField tf;
JCheckBox box;
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,14));
controls.add(tf);
controls.add(label = new JLabel("ms"));
box = new JCheckBox("call gc()");
box.setPreferredSize(new Dimension(80,14));
box.setSelected(true);
controls.add(box);
controls.setPreferredSize(new Dimension(100, 36));
controls.setMaximumSize(new Dimension(100, 36));
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, 36);
}
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, 0.5f + ascent * 2);
float maxmem = 82;
float usedmem = ((totalMemory - freeMemory) * maxmem) / totalMemory;
// .. Memory Used ..
big.drawRect(4, h - 10, (int)maxmem, 6);
big.setColor(new Color(0, 150, 0));
big.fillRect(5, h - 9, (int)usedmem - 2, 5);
if (gc_counter > 4)
{
if (thread != null && box.isSelected() && freeMemory < 2048000L)
{
big.setColor(Color.red);
big.fillRect(90, h - 9, 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;
}
}
}