here is a simple program i use to launch xterms/ssh on the machines
from our network.
it is a program that reads a property file that looks a lot like the
one from xbuffy and displays as many buttons you specified with the
foreground/background color you chose and the command executed when
clicked.

i catch mouseEvents to paint the border of the buttons when the mouse
is over them, that looks like a roll-over button.
here is my problem: if i mouve the mouse around fast and a lot, the
memory use grows damn fast and i reach 22 megs used by that damn small 
thing (xbuffy with much more code takes not even 1meg).
then at 22 it hangs...

so i decided to put a thread that would look every ten seconds for
events generated and lauch a System.gc() just to see if the memory was 
taken back.

well NO !!!
test it yourself:
lauch the app, launch 'top' ordered my memory usage ('M') and look at
the memory use:
move the mouse over a button and out.
the memory grows slightly, then my GC thread goes doing stuff (which
takes memory, normal...) and 'garbage-collects'...
then some memory used by the GC thread is recovered but you'll see
some missing during the process.

only a little bit, but this is only for TWO MOUSE EVENTS AND A GC !!!
so imagine what it could mean for a real app...

now roll your mouse over the buttons during 10 minutes and you'll see
the meory disaster happen.
now get rid of the GC thread and you can only play with rolling your
mouse during one or two minutes.

can anybody tell me if this is normal behaviour ?
-- 
~~~~~~~~~~~~
~          ~ This morning, i found representatives of our business
~  Stef    ~ model finishing my meal and visiting my turtle. Looks
~   the    ~ like it means we're becoming aggressive.
~ i     n  ~
~ n     a  ~
~ f     i  ~
~ ormagic  ~
~          ~
~~~~~~~~~~~~

These are only some stupid signatures, i never said you had to read
 them...
package util;

import javax.swing.border.LineBorder;
import javax.swing.JButton;
import javax.swing.JFrame;
import java.lang.Runtime;
import java.lang.String;
import java.lang.Math;
import java.lang.Integer;
import java.util.StringTokenizer;
import java.util.ResourceBundle;
import java.util.MissingResourceException;
import java.util.Locale;

import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Hashtable;
import java.util.Vector;
import java.awt.Color;

public class XTerms extends JFrame{

	private static ResourceBundle resources;
	boolean mouseEvents=false;

	static {
		try {
			resources = ResourceBundle.getBundle("XTerms", 
																					 Locale.getDefault());
		} catch (MissingResourceException mre) {
			System.err.println("XTerms.properties not found");
			System.exit(1);
		}
	}

		
	void getAttr(String[] args){
		String[] attrs={"geometry"};

		for(int i=0;i<args.length;i++){
			int c=0;
			for(c=0;c<attrs.length ;c++){
				if(args[i].equals("-"+attrs[c])){
					if(++i <args.length){
						attributes.put(attrs[c],args[i]);
						break;
					}else 
						attError();
				}
			}
			if(c==attrs.length){
				if(args[i].equals("--help"))
					attHelp();
				else
					attError();
			}
		}
	}

	void attError(){
		System.err.println("usage: XTerms [-geometry -/+X-/+X]");
		System.exit(0);
	}
	void attHelp(){
		System.out.println("usage: XTerms [-geometry -/+X-/+X]");
		System.exit(0);
	}

	Point getLoc(String str){
		// syntax is (-|+)X(-|+)X where X is a number
		Dimension d=Toolkit.getDefaultToolkit().getScreenSize();
		int index=str.lastIndexOf('+');
		int index2=str.lastIndexOf('-');
		index=Math.max(index,index2);

		int x=Integer.parseInt(str.substring(1,index));
		if(str.charAt(0)=='-'){
			x=d.width-getSize().width-x;
		}

		int y=Integer.parseInt(str.substring(index+1,str.length()));
		if(str.charAt(index)=='-'){
			y=d.height-getSize().height-y;
		}
		return new Point(x,y);
	}

	protected String getResourceString(String nm) {
		String str;
		try {
	    str = resources.getString(nm);
		} catch (MissingResourceException mre) {
			System.err.println("(missing ressource..."+nm+") ");
	    str = null;
		}
		return str;
	}

	protected String[] tokenize(String input) {
		Vector v = new Vector();
		StringTokenizer t = new StringTokenizer(input);
		String cmd[];

		while (t.hasMoreTokens())
	    v.addElement(t.nextToken());
		cmd = new String[v.size()];
		for (int i = 0; i < cmd.length; i++)
	    cmd[i] = (String) v.elementAt(i);

		return cmd;
	}

	public XTerms(String[] args){
		super("choose an xterm");
		addWindowListener(new AppCloser());
		getAttr(args);

		String[] buttonNames=tokenize(getResourceString("ButtonNames"));
		getContentPane().setLayout(new GridLayout(buttonNames.length,1));

		for(int i=0;i<buttonNames.length;i++){
			JButton button=new JButton(buttonNames[i]);
			button.addActionListener(new TermLauncher(getResourceString(buttonNames[i]+"Command").trim()));
			button.setForeground(stringToColor(getResourceString(buttonNames[i]+"FG").trim()));
			button.setBackground(stringToColor(getResourceString(buttonNames[i]+"BG").trim()));
			button.setBorderPainted(false);
			button.setFocusPainted(false);
			button.setRolloverEnabled(true);
			button.setBorder(new LineBorder(stringToColor(getResourceString(buttonNames[i]+"FG").trim())));
			button.addMouseListener(new RolloverPainter(button));
			getContentPane().add(button);
		}

		//		setSize(100,300);
		pack();
		if(attributes.containsKey("geometry"))
			setLocation(getLoc((String)attributes.get("geometry")));

		(new GarbageThread()).start();
	}

	class GarbageThread extends Thread{
		public void run(){
			while(true){
				try{
					sleep(10000);
				}catch(InterruptedException xxx){
					xxx.printStackTrace();
				}
				if(mouseEvents){
					System.runFinalization();
					System.gc();
					mouseEvents=false;
				}
			}
		}
	}

	class RolloverPainter implements MouseListener{
		JButton button;
		public RolloverPainter(JButton button){
			this.button=button;
		}
		public void mouseEntered(MouseEvent e){
			mouseEvents=true;
			button.setBorderPainted(true);
			button.repaint();
		}
		public void mouseExited(MouseEvent e){
			mouseEvents=true;
			button.setBorderPainted(false);
			button.repaint();
		}
		public void mouseClicked(MouseEvent e){

		}
		public void mousePressed(MouseEvent e){

		}
		public void mouseReleased(MouseEvent e){

		}
	}

	class TermLauncher implements ActionListener{
		String cmd;

		public TermLauncher(String command){
			cmd=command;
		}
		public void actionPerformed(ActionEvent e){
			mouseEvents=true;
			try{
				Runtime.getRuntime().exec(cmd);
			}catch(java.io.IOException ex){
				System.err.println("exception in command exec");
				ex.printStackTrace();
			}
		}
	}

	//listener to shut down
	class AppCloser extends WindowAdapter {
		public void windowClosing(WindowEvent e) {
	    System.exit(1);
		}
	}

	Hashtable attributes=new Hashtable();

	public static void main(String[] args){
		XTerms xterms=new XTerms(args);
		xterms.show();
	}

	/**
	 * Convert a "#FFFFFF" hex string to a Color.
	 * If the color specification is bad, an attempt
	 * will be made to fix it up.
	 */
	static final Color hexToColor(String value) {
		if (value.startsWith("#")) {
			String digits = value.substring(1, Math.min(value.length(), 7));
			String hstr = "0x" + digits;
			Color c = Color.decode(hstr);
			return c;
		}
		return null;
	}

	/**
     * Convert a color string "RED" or "#NNNNNN" to a Color.
     * Note: This will only convert the HTML3.2 colors strings
     *       or string of length 7
     *       otherwise, it will return null.
     */
	public Color stringToColor(String str) {
		Color color = null;

		if (str.charAt(0) == '#')
			color = hexToColor(str);
		else if (str.equalsIgnoreCase("Black"))
			color = hexToColor("#000000");
		else if(str.equalsIgnoreCase("Silver"))
			color = hexToColor("#C0C0C0");
		else if(str.equalsIgnoreCase("Gray"))
			color = hexToColor("#808080");
		else if(str.equalsIgnoreCase("White"))
			color = hexToColor("#FFFFFF");
		else if(str.equalsIgnoreCase("Maroon"))
			color = hexToColor("#800000");
		else if(str.equalsIgnoreCase("Red"))
			color = hexToColor("#FF0000");
		else if(str.equalsIgnoreCase("Purple"))
			color = hexToColor("#800080");
		else if(str.equalsIgnoreCase("Fuchsia"))
			color = hexToColor("#FF00FF");
		else if(str.equalsIgnoreCase("Green"))
			color = hexToColor("#008000");
		else if(str.equalsIgnoreCase("Lime"))
			color = hexToColor("#00FF00");
		else if(str.equalsIgnoreCase("Olive"))
			color = hexToColor("#808000");
		else if(str.equalsIgnoreCase("Yellow"))
			color = hexToColor("#FFFF00");
		else if(str.equalsIgnoreCase("Navy"))
			color = hexToColor("#000080");
		else if(str.equalsIgnoreCase("Blue"))
			color = hexToColor("#0000FF");
		else if(str.equalsIgnoreCase("Teal"))
			color = hexToColor("#008080");
		else if(str.equalsIgnoreCase("Aqua"))
			color = hexToColor("#00FFFF");
		return color;
	}

}
ButtonNames=machine1 machine2 machine3

machine1Command=nohup xterm -fg red -bg black -vb -sb -sl 1024 -T tangleterm -e ssh -X 
machine1
machine1FG=red
machine1BG=black

machine2Command=nohup xterm -fg green -bg black -vb -sb -sl 1024 -T machine2term -e 
ssh -X machine2
machine2FG=green
machine2BG=black

machine3Command=nohup xterm -fg #00ffff -bg black -vb -sb -sl 1024 -T machine3term -e 
ssh -X machine3
machine3FG=#00ffff
machine3BG=black

machine4Command=nohup xterm -fg #00ffff -bg black -vb -sb -sl 1024 -T machine4term -e 
ssh -X machine4
machine4FG=#00ffff
machine4BG=black

machine5Command=nohup xterm -fg #00ffff -bg black -vb -sb -sl 1024 -T machine5term -e 
ssh -X machine5
machine5FG=#00ffff
machine5BG=black

machine6Command=nohup xterm -fg #00ffff -bg black -vb -sb -sl 1024 -T machine6term -e 
ssh -X machine6
machine6FG=#00ffff
machine6BG=black

machine7Command=nohup xterm -fg #00ffff -bg black -vb -sb -sl 1024 -T machine7term -e 
ssh -X machine7
machine7FG=#00ffff
machine7BG=black

machine8Command=nohup xterm -fg #00ffff -bg black -vb -sb -sl 1024 -T machine8term -e 
ssh -X machine8
machine8FG=#00ffff
machine8BG=black

machine9Command=nohup xterm -fg #00ffff -bg black -vb -sb -sl 1024 -T machine9term -e 
ssh -X machine9
machine9FG=#00ffff
machine9BG=black

machine10Command=nohup xterm -fg #00ffff -bg black -vb -sb -sl 1024 -T machine10term 
-e ssh -X machine10
machine10FG=#00ffff
machine10BG=black

Reply via email to