Neustart der Anwendung

strahlenglanz

Grünschnabel
Hei zusammen,

also ich schreib gerade ein Programm zu Steuerung von Objekten. Ziel is es anhand eines Bildes auszumachen wo jemand sitzt und anhand dessen die jeweiligen Objekte anzusteuern.

Ich starte zuerst einen Restarter, damit ich sowohl den Heap von Java als auch von der genutzen Lib ImageJ zu erhöhen. Aus diesem heraus wird dann die .jar gestartet. Soweit alles ohne Probleme.

Mein Problem liegt jetzt darin: alle 2 sec soll ein Bild von der Kamera gelesen und mit dem Referenzbild verglichen werden - soweit auch kein Problem. Allerdings komme ich mir mit ImageJ ins Gehege - trotz mehrfachen aufrufen des GarbageCollectors und sparsamen Umgang mit ImageJ- Sachen wie ImagePlus, kommt nach ca 80min der Knall - Heapspace übervoll. Man kann auch richtig zusehen wie die Anwendung Speicher frisst.
Leider bin ich auch im ImageJ-Forum zu keiner Lösung gekommen wie man diesen Speicherverbrauch reduzieren kann.
Daher is meine Lösung jetzt (ich hab nur noch 5 Tage und will's wenigstens zum dauerhaften Laufen bringe) ich starte das Programm nach 1000 Durchläufen (in 80min sind ca.1400 möglich) neu mit der aktuellen Konfiguration.

Die Umsetzung ist weiter auch nicht schwierig. Allerdings versuche ich meine aktuelle Konfiguration als .xml zu speichern.
Wenn ich dann allerdings aus meinem Thread heraus (der zum alle 2sec einlesen der Bilder) system.exit(0) aufrufe, wird die .xml gelöscht. Ich erstelle die xml vor dem starten des Threads.

seh ich den Wald vor lauter Bäumen grad nicht? Meine Vermutung ist, dass es was mit den Threads zu tun hat.

restarter -> java heap + imagej hochsetzen, starten der eigentlich app.jar
app.jar -> eigentliche Programmausführung, das zeitabhängige Bildereinlesen erfolgt in eigenem Thread


Danke schonmal für eventuelle Tipps!!
 
Hi strahlenglanz und Herzlich Willkommen bei Tutorials,
wenn ich dein Problem ich richtig erkannt habe und deinen Lösungvorschlag in betracht ziehe, würde ich auf folgende Lösung kommen.
Du machst dir ein Java-Programm, von welchem du deine App startest. In diesem "Handler"-Programm sag ich jetzt mal, kannst du auch deine XML-Datei lagern. Oder diese Daten direkt in einem Objekt halten (wäre fast sinnvoller). Wenn du die App dann über den Handler startest, kannst du die XML-Datei/Objekt mit übergeben, dass die App auf die Daten ebenfalls zugriff hat.

Allerdings ist das aus meiner Sicht keine all zu tolle Lösung.
Ich würde die Programme nicht splitten, sondern als ein Programm zusammenfassen und die Programme als Objekte dann sehen. Sprich App-Programm als Objekt und Handler-Programm als Objekt. Also ungefähr so:
Java:
import java.io.File;

public class PictureModifier
{
	private final File xmlFile;
	private App app;
	
	public PictureModifier(File xmlFile) {
		this.xmlFile = xmlFile;
	}

	private void run() {
		app = new App(xmlFile);
		String returnValue = app.run();
		// Den returnValue könntest du dann auswerten
		// ...
		// Das Objekt "App" auf null setzen. Dann wird es vom GC entfernt.
		app = null;
		// System.gc(); <-- kannst du aufrufen, sollte aber Java normalerweiße automatisch machen
	}
	
	public static void main(String[] args) {
		File xmlFile = new File(args[0]); // oder einlesen, je nachdem wie du es machst
		new PictureModifier(xmlFile).run();
	}
}

Gruß

Fabio
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück