Autor Thema: Speicher wieder freigeben nach JavaAgent  (Gelesen 2284 mal)

Offline rbo

  • Frischling
  • *
  • Beiträge: 11
  • Ich liebe dieses Forum!
Speicher wieder freigeben nach JavaAgent
« am: 21.02.05 - 13:55:10 »
Hallo zusammen,

ich schreibe momentan gerade einen relativ mächtigen Dialog in Java, der nachher unter Notes 6 aus einer DB heraus clientseitig aufgerufen werden soll. Dummerweise belegt das Ding 36 KB virtuellen Speicher und ich habe keine Ahnung wie ich dieses Speicher nach Beendigung des Dialoges wieder freigeben kann. Der Dialog wird geschlossen über

JFrame.dispose();

da

System.exit(0);

ja nicht funktioniert. Aus einer Standalone Applikation klappt das auch alles wunderbar, nur aus Notes heraus wird der belegte Speicher nach Beendigung nicht weniger.

Hat jemand ne idea?? Wäre für jeden Tipp dankbar.

MfG, René

Marinero Atlántico

  • Gast
Re: Speicher wieder freigeben nach JavaAgent
« Antwort #1 am: 21.02.05 - 14:39:21 »
Bist du ganz sicher, dass der Agent wirklich terminiert?
Damit du überhaupt eine GUI in einem Agenten erzeugen kannst, musst du den Agenten ja in einer Art Endlosschleife halten.
Ich dachte, dass würde wieder freigegeben, sobald der Agent terminiert.
Kannst du vielleicht mal den code des Agenten posten (ohne den GUI-code) ?

Axel 

Offline rbo

  • Frischling
  • *
  • Beiträge: 11
  • Ich liebe dieses Forum!
Re: Speicher wieder freigeben nach JavaAgent
« Antwort #2 am: 21.02.05 - 15:09:32 »
Hi,

erstmal einen Dank für deine schnelle Antwort.

Aber nein, ich bin mir eben nicht sicher ob der Agent wirklich terminiert.
Der Dialog wird folgendermaßen aufgerufen:

import lotus.domino.*;
import de.timetoact.xmleditor.gui.MainFrame;


public class JavaAgent extends AgentBase {

   public void NotesMain() {

      try {
         Session session = getSession();
         AgentContext agentContext = session.getAgentContext();
         Database db = agentContext.getCurrentDatabase();
         View view = db.getView("LookXMLs");
         DocumentCollection col = agentContext.getUnprocessedDocuments();
         Document xml = col.getFirstDocument();         
         Document dtd = view.getDocumentByKey("test.dtd");
         
         //MainFrame = erweiterte JFrame
         MainFrame f = new MainFrame(xml,dtd);
         

      } catch(Exception e) {
         e.printStackTrace();
      }
   }
}

Der MainFrame-Klasse habe ich nen WindowAdapter hinzugefügt, die beim Schliessen, sprich beim Klicken auf das "X" rechts oben, die Methode

dispose();

auf dem MainFrame-Object ausführt. Diese Methode sorgt dafür, dass der Dialog zugeht und als Standalone Applikation auch aus dem Speicher verschwindet.

Gruß René

Marinero Atlántico

  • Gast
Re: Speicher wieder freigeben nach JavaAgent
« Antwort #3 am: 21.02.05 - 15:52:51 »
Interessantes Problem. Java in Notes ist wirklich ein bischen Geisterbahn.


Aber nein, ich bin mir eben nicht sicher ob der Agent wirklich terminiert.
der Agent terminiert, MainFrame wird aber nicht garbageCollected.
Garbage Collection kann man nicht erzwingen.

Versuch mal so:
Code
import lotus.domino.*;
import de.timetoact.xmleditor.gui.MainFrame;


public class JavaAgent extends AgentBase {
         public static boolean stayingAlive = true; 
	public void NotesMain() {

		try {
			Session session = getSession();
			AgentContext agentContext = session.getAgentContext();
			Database db = agentContext.getCurrentDatabase();
			View view = db.getView("LookXMLs");
			DocumentCollection col = agentContext.getUnprocessedDocuments();
			Document xml = col.getFirstDocument();			
			Document dtd = view.getDocumentByKey("test.dtd");
			
			//MainFrame = erweiterte JFrame
                        
			MainFrame f = new MainFrame(xml,dtd);
			while (stayingAlive) { }
                         f = null; 
                         dtd.recycle();
                         xml.recycle();
                         col.recycle();
                         session.recycle();

		} catch(Exception e) {
			e.printStackTrace();
		}
	}
}

In dem WindowsAdapter dann die Zeile:
Code
JavaAgent.stayingAlive = false;  

« Letzte Änderung: 21.02.05 - 15:55:06 von Marinero Atlántico »

Offline rbo

  • Frischling
  • *
  • Beiträge: 11
  • Ich liebe dieses Forum!
Re: Speicher wieder freigeben nach JavaAgent
« Antwort #4 am: 21.02.05 - 16:49:14 »
hmm, die idea ansich ist garnet mal schlecht. leider ist mir ne korrekte umsetzung noch net gelungen. mit der übergabe der objekte scheint noch irgendwas schiefzulaufen, das versuche ich aber morgen zu beheben. werde dann nochmal ne rückmeldung geben obs tatsächlich funktioniert.

bis denne, René

Marinero Atlántico

  • Gast
Re: Speicher wieder freigeben nach JavaAgent
« Antwort #5 am: 22.02.05 - 08:51:28 »
Es ist auf jeden Fall ein übler Hack.
Sehr vermutlich sollte man die GUI in einem eigenen Thread wrappen.
Aber selbst dann geht ein nicht unbeträchtlicher Teil der CPU-Zyklen für das rumpoltern in der Endlosschleife drauf.
Code
while (stayingAlive) { }
Sofern du den Source Code von TimeToAct vorliegen hast kannst du es auch so machen: vermutlich besser:

Übergebe dem Constructor des MainFrame Objekts das Session Objekt des Agenten und recycle das beim schliessen der GUI.
Grundsätzlich sind aber Notes Agenten nicht für sowas gedacht.

Hast du mal darüber nachgedacht, die GUI eventuell als Standalone app über Java Web Start zu verteilen?

Axel

Offline rbo

  • Frischling
  • *
  • Beiträge: 11
  • Ich liebe dieses Forum!
Re: Speicher wieder freigeben nach JavaAgent
« Antwort #6 am: 22.02.05 - 10:09:34 »
Hi,
ich muss doch sagen, Notes bringt mich immer wieder zum schmunzeln:)
Habe deine neue Lösung nun implementiert. Es funktioniert zwar, aber lustigerweise nur wenn schon ein gewisser Speicherplatz erreicht ist. Sprich, der Speicher steigt bis zu nem gewissen Punkt, und erst wenn dieser Punkt erreicht ist wird nun auch meine finalize() Methode aufgerufen. Naja, werde es wohl so lassen. Trotzdem vielen Dank für eine Hilfe, hast mir wirklich sehr geholfen.

Ich hab den Code von TimeToAct nich nur vorliegen, ich habe ihn entwickelt. Und leider kann man den Code nicht über WebStart verteilen, da dieser XML-Editor als Dialog in ein auf Notes/Domino basiertes CMS integriert werden soll um alle möglichen Settings-Dokumente, die in XML-Form vorhanden sind, grafisch editieren zu können.

Gruss, René

Marinero Atlántico

  • Gast
Re: Speicher wieder freigeben nach JavaAgent
« Antwort #7 am: 22.02.05 - 11:19:05 »
Es funktioniert zwar, aber lustigerweise nur wenn schon ein gewisser Speicherplatz erreicht ist. Sprich, der Speicher steigt bis zu nem gewissen Punkt, und erst wenn dieser Punkt erreicht ist wird nun auch meine finalize() Methode
aufgerufen. Naja, werde es wohl so lassen. Trotzdem vielen Dank für eine Hilfe, hast mir wirklich sehr geholfen.
Normles Verhalten des Java GarbageCollectors!
finalize KANN MAN NICHT TRAUEN.
Garbage Collector startet erst, wenn ein bestimmter Teil des Speichers belegt ist (kannst du setzen über jvm Startparameter -Xmx-> max. Heap Size).
Selbst dann kann es Objekte geben, die nicht garbage collected werden (interne Optimierung des Garbage Collector).
Kannst du den Code aus dem finalize nicht einfach in den EventHandler von dem Window.close()-Event tun?

Ich hab den Code von TimeToAct nich nur vorliegen, ich habe ihn entwickelt.
Gruß an Michael Kamp  :)
Und leider kann man den Code nicht über WebStart verteilen, da dieser XML-Editor als Dialog in ein auf Notes/Domino basiertes CMS integriert werden soll um alle möglichen Settings-Dokumente, die in XML-Form vorhanden sind, grafisch editieren zu können.
Überlege dir Dringend dies als externe Komponente ausserhalb von Notes zu halten.
Z.B: Installation des jars über einen Button. Starten des Dings über den execute (?) Befehl von LotusScript.

Zitat

Offline rbo

  • Frischling
  • *
  • Beiträge: 11
  • Ich liebe dieses Forum!
Re: Speicher wieder freigeben nach JavaAgent
« Antwort #8 am: 22.02.05 - 11:51:35 »
Hi,
die Grüße sind ausgerichtet :)

In meiner finalize() Methode stand jetzt nichts weltbewegendes drin, mich hat halt nur mal interessiert wann sie ausgeführt wird.

Und zu entscheiden ob das Ding als externe Komponente mitgeliefert wird liegt leider nicht in meiner Hand. Werde es aber zumindest mal vorschlagen, da mir eine solche Lösung auch wesentlich besser gefallen würde.

Gruß René

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz