# zu Beginn der main: Heap space ermitteln und hochsetzen



## tomstue (30. Jan 2009)

Hallo zusammen

Wir haben ein rechenintensives Programm, und würde daher gerne den Heap-Space des Rechners voll ausnutzen und so hoch wie möglich setzen. Das diese Grenze von PC zu PC verschieden ist, ist doch richtig oder? und somit muss erst die individuelle Grenze des PC's ermittelt werden bevor man sie setzt...

Wißt ihr wie man dies in Java zu Beginn der main realisieren kann?

mfg

Tom


----------



## maki (30. Jan 2009)

Gar nicht.

Man setzt den Xms und Xmx Parameter beim start der VM.


----------



## Verjigorm (30. Jan 2009)

Wieso sagen immer alle, das würde nicht gehen?

Man kann doch eine jar starten, die den Arbeitsspeicher ermittelt und mit diesen Daten das eigentliche Programm als neuen Prozess mit den ermittelten Übergabeparametern starten


----------



## André Uhres (30. Jan 2009)

1234567890


----------



## maki (30. Jan 2009)

Verjigorm hat gesagt.:
			
		

> Wieso sagen immer alle, das würde nicht gehen?


Weil es auch nciht geht.



			
				Verjigorm hat gesagt.:
			
		

> Man kann doch eine jar starten, die den Arbeitsspeicher ermittelt und mit diesen Daten das eigentliche Programm als neuen Prozess mit den ermittelten Übergabeparametern starten


Damit startet man ja eine neue VM 
Also kein widerspruch zu meiner Aussage.



> maki ist nicht alle


Ach...


----------



## tomstue (30. Jan 2009)

Also ich habe jetzt folgendes gemacht:

	System.gc();

	String userdir = System.getProperty("user.dir");
	String cmd = "java -Xmx1024m -jar \""+userdir+"\\MeineAnwendung.jar\"";
	try {
		Runtime.getRuntime().exec(cmd);
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

	long totalMemory = Runtime.getRuntime().totalMemory();
	long freeMemory = Runtime.getRuntime().freeMemory();

	System.out.println("free Memory: "+ freeMemory);
	System.out.println("total Memory: " + totalMemory);
	System.out.println("totalMemory - freeMemory: " + (totalMemory-freeMemory));



als Ausgabe kommt aber leider:

free Memory: 4949648
total Memory: 5177344
totalMemory - freeMemory: 227696

umgerechnet sind 227696Bytes aber 0.217148MB und nicht 1024 wie oben angegeben.

Was habe ich falsch gemacht?


----------



## SlaterB (30. Jan 2009)

wozu das Runtime.getRuntime().exec(cmd);?

zum Testen kannst du das doch direkt in die Konsole eintippen,
denn der Speicher wird, wie Uns maki bereits sagt, nur in dem neu geöffneten Programm erhöht, nicht im aktuellen Programm,

sieht so aus als stände der Memory-Code im Programm, welches Runtime.getRuntime().exec() ausführt

--------

freeMemory und totalMemory geben eh nur Auskunft über den aktuell genutzen Speicher,

 Runtime.getRuntime().maxMemory()
heißt das Zauberwort


----------



## André Uhres (30. Jan 2009)

1234567890


----------



## tomstue (30. Jan 2009)

Also ich gebe es nicht in die commando-zeile ein weil es ja automatisch im programm ablaufen soll. 

Wenn ich also die Lösung von Andre nehme und sage


```
public static void main(String[] args) {		
		System.out.println("totalMemory:" + Runtime.getRuntime().totalMemory());
		System.out.println("freeMemory: " + Runtime.getRuntime().freeMemory());
		System.out.println("MaxMemory: " + Runtime.getRuntime().maxMemory());
		
		System.gc();
		// TODO Auto-generated method stub
		String userdir = System.getProperty("user.dir");
		String cmd = "java -Xmx1024m -jar \""+userdir+"\\MeineAnwendung.jar\"";
		try {
			Runtime.getRuntime().exec(cmd);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.exit(0);
	}
```

dann soll ja die Anwendung neu gestartet werden. Mein Prob ist

a) das sich bei meiner Ausgabe nichts verändert, auch wenn ich 2mal hintereinander die main ausführe

b) Andre sagt die Anwendung startet nach "System.exit(0)" neu - aber wenn meine main neu gestartet werden würde, würde doch alles erneut ausgeführt oder verstehe ich das falsch? Wenn die main neu ausgeführt werden würde, wäre ich dann nicht in einer endlos-Schleife?


----------



## André Uhres (30. Jan 2009)

1234567890


----------



## tomstue (30. Jan 2009)

leider besteht mein Problem noch - unter dem link sind leider die einzelheiten nicht erläutert. Wie müßte mein code denn aussehen, damit es funktioniert?


----------



## SlaterB (30. Jan 2009)

die Endlosschleife kannst du mit einem Argument 'hör auf' abstellen,
zum Rest arbeite mal mit meinem Testprogramm:


```
package test;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Test {

	public static void main(String[] args) throws Exception {
		System.out.println("args: " + Arrays.toString(args));
		System.out.println("totalMemory:" + Runtime.getRuntime().totalMemory());
		System.out.println("freeMemory: " + Runtime.getRuntime().freeMemory());
		System.out.println("MaxMemory: " + Runtime.getRuntime().maxMemory());

		System.gc();
		String userdir = System.getProperty("user.dir");
		System.out.println(userdir);
		String cmd = "java -Xmx1024m test.Test tubido";
		if (args.length < 1) {
			System.out.println("rekursion");
			Process p = Runtime.getRuntime().exec(cmd);
			Thread.sleep(200);
			BufferedReader in = new BufferedReader(new InputStreamReader(p
					.getInputStream()));
			BufferedReader err = new BufferedReader(new InputStreamReader(p
					.getErrorStream()));
			String line = null;
			while ((line = in.readLine()) != null) {
				System.out.println("line: " + line);
			}
			while ((line = err.readLine()) != null) {
				System.out.println("err: " + line);
			}
		}

		System.out.println("ende");
	}
}

--------

Ausgabe:
args: []
totalMemory:643072
freeMemory: 0
MaxMemory: 9223372036854775807 [interessant unter Ubuntu von Eclipse aus gestartet]
/home/slater/workspace/Test [Test ist auch Name des Projektes]
rekursion
line: args: [tubido]
line: totalMemory:7864320
line: freeMemory: 7642680
line: MaxMemory: 1034027008
line: /home/slater/workspace/Test
line: ende
ende
```


----------

