Das Notes Forum

Lotus Notes / Domino Sonstiges => Java und .NET mit Notes/Domino => Thema gestartet von: Florian_H am 31.01.06 - 16:11:22

Titel: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Florian_H am 31.01.06 - 16:11:22
Hallo

Dank der Suche haben sich einige Fragen bei mir schon vorher geklärt allerdings stehe ich noch vor einem Problem und zwar geht es um Folgendes:

Im Rahmen eines Projektes sollen aus einer Notes Datenbank die selektierten Dokumente mithilfe von Charts ausgewertet werden.
Ein Pflichtenheft muss dafür zuerst erstellt werden und ich hänge noch am Mengengerüst.

Nehmen wir an ein Benutzer wählt 1000 Dokumente aus um diese Auszuwerten ein Textfeld in Notes hat maximal 32KB, 4 Felder sidn für die Auswertung relevant. Macht:

32KB x 4 x 1000 = 128MB

Bis die 128MB vom Server bei einer Geschwindigkeit von 2Mbit in mein Java Programme geladen sind dauert das ne ganze Weile, soll es aber nicht.
Wie schaut die Speicherverwaltung der JVM aus ? Kann ich da mit dem Garbage Collector oder der Recycle Methode arbeiten.
Was ist mit der Speicherverwaltung der JVM überhaupt möglich ?

Der Chef meint man kann den Kunden ja nicht 60 Minuten vom Arbeitsplatz fernhalten bis er sein Diagramm auswerten kann.
Klar hat er da Recht, doch einerseits sollen unheimlich viele Dokumente ausgewertet werden und andererseits soll sich das schnell von statten gehen.

Vielleicht hat ja jemand eine Lösung parat für mein Problem.

Danke

Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: m3 am 31.01.06 - 16:16:09
Wo kommen die 2 Mbit her?  ???
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Florian_H am 31.01.06 - 16:18:52
Damit meinte ich die Geschwindigkeit von DSL die der Server via Internet zum Client hat. Kann auch ruhig ignoriert werden is jetzt nicht so wichtig.
Es geht mit eher um die Speicherverwaltung.
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: koehlerbv am 31.01.06 - 16:19:54
Und was wertest Du denn in Charts aus aus Textfeldern, die 32 kB Inhalt haben? Bist Du sicher, dass solche "Füllstände" überhaupt erreicht werden können (in vito)?
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Florian_H am 31.01.06 - 16:23:34
Klar werden 32KB nicht wirklich erreicht, aber da es möglich ist diesen Wert doch zu erreichen, soll ich von diesem Fall ausgehen, damit der Kunde ziemlich genau weiss wieviel Speicherplatz er benötigt usw.

Hier mal mein bissheriges Mengengerüst:

Input
Das Analysetool greift auf den „Audit-Trail“ der Dokumente zu und liest die vier, für die Auswertung relevanten Textfelder aus. Ein Textfeld ist unter Lotus Notes auf 32KB beschränkt. Pro angewähltes Dokument fallen somit also 128 KB (4 x 32KB) Speicherplatzbedarf an. Somit ist es also auch möglich relativ große Workflows mit vielen Dokumenten auszuwerten. Eine Datenauslagerung ist nicht notwendig.

Bsp.:
Speicherbedarf bei 1000 angewählten Dokumenten:
4 x 32KB x 1000 = 128 MB

Output
Das Analyse Tool wird in der Lage sein 15 verschiedene Status pro Ansicht darzustellen, ohne dass das Diagramm überladen und dadurch unübersichtlich wird. Für die Auswertung größerer Workflows ist eine Darstellung über mehrere Seiten geplant.
Des Weiteren ist zu bedenken, dass eine gespeicherte Auswertung/Grafik ca. 500 KB Festplattenspeicher benötigt.
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: m3 am 31.01.06 - 16:34:07
Zugriff via IIOP, oder ist es ein in eine Notes-DB eingebettetes Applet?
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Florian_H am 31.01.06 - 16:36:13
Das ganze soll als Agent gestartet werden, der eine Java Swing Gui aufbaut.
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: m3 am 31.01.06 - 16:37:35
Also in der DB? Dann würd ich doch die DB als lokale Replik halten, dann brauchst keine Daten über Leitungen saugen und das Laden der Daten in den Java-Agent ist blitzartig erledigt.
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Florian_H am 31.01.06 - 16:49:22
Noch eine Frage anbei:

Oder 2

1. Wo liegt den eingentlich die Begrenzung der JVM was Speicherplatz betrifft ?

2. Wenn ich die Dokuemente mit einer DocumentCollection in einer Schleife durchlaufe, lese ich die Dokumente doch nur sequentiell aus, ist dann der Speicherplatz verbraucht noch relevant  ?
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: flaite am 31.01.06 - 17:08:49
Die 32 Kb Rechnung erscheint mir unrealistisch. Die meisten Notes-Felder haben deutlich weniger Inhalt.
V.a. Felder die für eine statistische Auswertung benötigt werden. Das dürften doch meist kleine Strings oder Zahlen sein, oder?
 
Probiers doch einfach mal mit einem kleineren Satz an realistischen Testdaten aus.

Ob Teile dieser Daten zwischendurch garbage collected werden können, hängt von dem Progrämmsche ab, dass die Graphiken generiert.   
Ausserdem kannst du vielleicht Daten auf dem Server cachen, um die Netzwerklatenz zu verringern. Notes-Dokumente haben ein lastUpdate property.

Wo die genaue Obergrenze ist, weiss ich nicht. Jedenfalls kannst du aber den JVM-Heap Speicher per -Xmx (heap space) und -Xms (initial heap space) verändern. Beim starten der VM. java -X etc.
Beispiel
java -Xms256m -Xmx512m DeinProg

gibt dem Programm 256 MegaByte Heap Speicher beim Starten und maximal 512 MegaByte. Wenn es mehr als 512 MegaByte braucht, dann gibt es eine OutOfMemoryException.
Ich setz z.B. Eclipse grundsätzlich hoch.
 
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Ralf_M_Petter am 01.02.06 - 08:31:41
Wenn du über 1000 Dokumente liest in einem Java Agenten MUSST du mit Recycle arbeiten sonst ist der Out of Memory vorprogrammiert.

Merksatz: Zugriff auf Notes Objekte ausserhalb von Schleifen recycle nicht nötig.
Zugriff auf Notes Objekte in Schleifen. Recycle unbedingt erforderlich.

Was du mit "Kann ich hier mit Garbage Collection arbeiten" meinst ist mir schleierhaft. So weit ich weiß arbeitet der GC immer.

Grüße

Ralf
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Thomator am 01.02.06 - 11:27:52
@Ralf

bist Du sicher, dass außerhalb von Schleifen nicht recycle't werden muss?
Das C-Objekt kann doch so oder so nicht zerstört werden. Damit dauert es außerhalb von Schleifen sicher länger, aber grundsätzlich kommt der Speicherüberlauf irgendwann, da der Speicher ja nicht freigegeben wird.

Oder bin ich hier falsch informiert?

Thomas
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Ralf_M_Petter am 01.02.06 - 11:32:27
@Thomas!

In diesem Thread geht es um einen Agenten und es ist tatsächlich so, dass du in einem Agenten im Prinzip nicht recyceln musst zumindest laut Agent FAQ auf Notes.net, da sich Notes um das Recyceln selber kümmert. In allen anderen Java Programmen, Servlets und JSP sollte man immer zum Schluß die Session recyceln.

Aufpassen muß der Ursprungsfrager nur höllisch wenn er Swing einsetzt und auch vom Event Thread auf Notes zugreifen will. Das erfordert besondere Vorkehrungen und würde ich ehrlich gesagt vermeiden, da es nicht best practise entspricht.

Grüße

Ralf
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: flaite am 01.02.06 - 11:37:08
bist Du sicher, dass außerhalb von Schleifen nicht recycle't werden muss?
Das C-Objekt kann doch so oder so nicht zerstört werden. Damit dauert es außerhalb von Schleifen sicher länger, aber grundsätzlich kommt der Speicherüberlauf irgendwann, da der Speicher ja nicht freigegeben wird.

Oder bin ich hier falsch informiert?

Ich würd sagen, dass normalerweise, die Menge der erzeugten Objekte nicht so hoch ist.
Nur in Schleifen werden halt quasi von Natur aus sehr viele Objekte erzeugt.
Und wo mehr Dreck erzeugt wird, muss man eben mehr aufräumen.
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Thomator am 01.02.06 - 15:31:56
Das ist mir schon klar.
Aber sauber programmiert ist so eine Anwendung für mich, wenn sie keine Speicherleichen hinterlässt, egal wie wenige das sind oder wie klein die auch sein mögen.

Aber ich will hier keine Grundsatzdisskussion anzetteln...
 :-X

Thomas
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Ralf_M_Petter am 01.02.06 - 15:54:16
Hallo Thomas!

Ich denke du hast auf Axel geantwortet. Aber hier nochmal zur Klarstellung. Meine Angaben bezogen sich auf Agenten und hier steht in der Agent FAQ ganz klar, dass man sich wenn man alle Objekte aus der Session des Agents gewinnt sich um Recycle keine Gedanken machen muß, ausser man erstellt soviele Objekte, dass man Memoryprobleme bekommt. Wenn der Agent beendet ist, kümmert sich Notes um das Recycle der Session. Genauso reicht es in einfachen Javprogrammen die keine Schleifen und ähnliches haben, am Ende des Programms die Session zu recyceln, da diese alle abhängigen Objekte mitrecycelt.

Recyceln im Programm kann sinnvoll sein, aber auch sehr gefährlich nämlich dann wenn man Objekte die man noch verwenden will recycelt hat.

Ist mir selber schon passiert in grossen Programmen, das ich auf ein Objekt mehrere Referenzen hat. Dann habe ich bei einer Referenz weil ich ja ein braver Recycler bin recycle aufgerufen und wie ich dann über eine andere Referenz auf das Objekt zugreifen wollte. Bumm

Grüße

Ralf
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: flaite am 01.02.06 - 16:24:03
Wieso Grundsatzdiskussion?

In Java braucht man sich nur dahingehend darum kümmern, dass man nicht zu viele Objekte erzeugt und einen gewissen Überblick behält, wie die Referenzen gesetzt sind. Ein Objekt wird garbage collected, wenn es null ist und kein anderes Objekt mehr eine Referenz auf es hält (wenn ich mich recht erinnere).
Bei Notes-Objekten ist das ein bischen anders. Man braucht diese recycle()-Methode.

Speicherallokation ist im Grunde ein Scope/Lebenszyklus-Problem.
Objekte haben im Programm meist sehr unterschiedliche Lebenszyklen.
 
Schleifen besitzen nun einen klar definierten engen scope der mehrmals durchlaufen wird.
Objekte, die im scope des Schleifenkörpers erzeugt wurden, haben einen Lebenszyklus von genau einer Iteration dieser Schleife.

In
Code
for (int i=0; i < 10; i++) {
Document doc = vw.getNthDocument(i)
}
werden über die eine Zeile in der Schleife eine Menge lokaler Objekte erzeugt, die nur für genau eine Iteration der Schleife im aktiven scope sind und danach nicht mehr gebraucht werden. Man kann sie auch nicht referenzieren. Sie sind lebenszyklustechnisch eindeutig auf dem Weg in den Himmel (katholisch gesprochen).
 
Zwar verweist immer die gleiche Referenzvariable auf besagte Objekte. Die Objekte sind aber unterschiedlich!!!
In Java ist das ein geringeres Problem, da sie automatisch garbage-collected werden. Notes-Java-Objekte benötigen aber den Aufruf von recycle(), um wirklich garbage collected werden zu können (vereinfacht gesprochen).
Wegen dem schnellen scope-Wechsel in Schleifen, macht der häufige Aufruf von recycle() sehr viel Sinn und das ist in keinster Weise eine irgendwie unscharfe Idee.
   
So ungefähr jedenfalls.
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Thomator am 01.02.06 - 16:45:59
@Ralf

ich bin da wohl in meinem Denken ein bisschen versaut,weil ich in Java-Agenten meist mit eigenen DIIOP-Sessions arbeite (Remote-Zugriffe in 5'er Server-Landschaften), bin ich gezwungen, alle Objekte selber zu recyclen. Auch bei der Arbeit mit der API aus anderen Java-Applikationen ist es meines Wissens nach nötig, alle Objekte zu recyclen, da das Recyclen der Session alleine nur die Session, nicht die daraus  erworbenen Objekte betrifft.

@Axel
Die Java-Objekte an sich werden ja schon von der Garbage-Collection zerstört, oder? Nur die C-Objekte für die nativen Zugriffe benötigen das Recyclen, da ja C-Objekte immer explizit zerstört werden müssen.

Das ist übrigens eine Frage, die mich schon länger beschäftigt: Hätte man die API nicht grundsätzlich so aufbauen können, dass in der finalize-Methode des Objekts das Recyclen mit durchgeführt wird? Dann würde die Garbage-Collection auch die Speicherbereinigung übernehmen.

Thomas
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Ralf_M_Petter am 01.02.06 - 16:53:10
@Thomas!

Nein Recyceln der Session reicht. Es gab mal in frühren 5er ein paar Ausnahmen, aber nichts tragisches auf Grund von Bugs. Aber in 6er funktioniert das recyceln von Session einwandfrei. Unsere gesamte Webseite ist auf diesen Mechanismus aufgebaut und selbst bei tausenden Zugriffen am Tag wo die Session und viele abhängige Objekte tausende mal erstellt und über die Session recycelt wurden treten keine Memory leaks auf.

Bezüglich des GC hast du Recht nur leider kann man das finalize nicht verwenden, da finalize vom GC Thread aufgerufen wird und das recycle in dem Thread gemacht werden soll in dem die Session erstellt wurde. Ich mach prinzipiell in jedem Thread eine eigene Session.

Grüße

Ralf
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: flaite am 01.02.06 - 17:11:04

@Axel
Die Java-Objekte an sich werden ja schon von der Garbage-Collection zerstört, oder? Nur die C-Objekte für die nativen Zugriffe benötigen das Recyclen, da ja C-Objekte immer explizit zerstört werden müssen.
Ralfs Erklärung mit den Threads kannte ich noch gar nicht. Das hört sich irgendwie schlüssig an.

Ich sah das bisher so (und ich bin mir nicht 100% sicher, ob das stimmt): In einem Garbage Collection Lauf werden gar nicht alle Objekte-eligible-for-garbage-collection garbage collected. Kleinere Objekte bleiben liegen. Das hat Optimierungsgründe. Aus Sicht des GC sind aber die Notes Wrapper um die C-Objekte kleine Objekte (obwohl sie massiv C-Zeugs binden, aber das sieht der GC nicht).
Das Problem ist, dass sie zulange liegen bleiben.
Und beim stoppen der VM wird nicht unbedingt auf allen Objekten finalize() aufgerufen. Auch übrigens dann nicht, wenn im finalize() vorher eine Exception geworfen wurde.
Man sollte sich nicht auf finalize() verlassen, es sei denn, man weiss wirklich was man tut. Ich habe die finalize() Methode noch nie benutzt (ausser für kleinere Tests). 
Wie das meiste in diesem Theater, ist garbage-collection nicht so einfach wie es zunächst aussieht.

Gruß Axel
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Ralf_M_Petter am 01.02.06 - 17:17:02
Die Erklärung mit dem das finalize nicht zuverlässig ist, stimmt natürlich auch.

Übrigens ist soweit ich weiß bei SWT ja die selbe Problematik.

Grüße

Ralf
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: flaite am 01.02.06 - 21:33:18
Yup. Ich habe diese Problematik vor 2 Jahren bestimmt überbetont.
(ich habe Bier getrunken und werde esoterisch)
Der wahre Zen ist vermutlich sogar, dass dies ein Teil einer noch größeren Problematik ist, zu der beispielsweise auch wirklich threadsafe HttpConnections mit apache.jakarta.commons.HttpClient gehören. Oder sicher LotusScript programmieren, wovon Bernhard manchmal spricht.
Manche Ressourcen sind in einem Netzwerk einfach knapp und man muß das als Programmierer managen. Die Frage ist nur welche, wann und wie.
Andere Ressourcen sollen nur genau einmal und nicht dupliziert oder nicht dupliziert pro Thread vorhanden sein (ok, threadsafe gehört hierhin). Auch das muß man oft als Programmierer selbst managen. Aber es ist irgendwie auch nur ein Aspekt der Ressourcen-Management-Thematik.
Und das kann nicht durch Tools, Frameworks, Design Patterns oder ähnlichem wirklich aufgelöst werden, da es oft auf den Einzelfall ankommt. 
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: koehlerbv am 01.02.06 - 21:58:25
... (ich habe Bier getrunken und werde esoterisch) ... Oder sicher LotusScript programmieren, wovon Bernhard manchmal spricht.

Irgendwie mag ich es, wenn Du Bier getrunken hast  ;D

Bei der Fülle der gegebenen Möglichkeiten ist der Einsatzspielraum von LotusScript etwas ... dünn, sagen wir mal. Dafür sollte man es dann aber wenigstens beherrschen und das, was man damit bezwecken will. Und damit schliesst sich wieder der Kreis, denn das gilt für jede "Ausdrucksform" gegenüber der Maschine.

Ich freue mich gerade (wieder) auf ein grosses Projekt, in dem sich die verschiedensten Welten sich vereinigen müssen. Ich glaube, dabei wird wie immer keiner dümmer. Ich bin da schon sehr gespannt.

Bernhard
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Thomator am 02.02.06 - 12:38:03
@Axel,
die GarbageCollection ist (zumindest Ansatzweise) schon beeinflussbar. Die JVM-Parameter -XMX und -XMS sind dafür maßgeblich mitentscheidend.

Beispiel: JMeter
Ich hatte JMeter immer mit den Standard-Einstellungen laufen, wo XMX = XMS ist. Wenn ich also mit zu vielen Threads einen Test gestartet habe kam immer ein OutOfMemory.
Dann habe ich mal gelesen, dass der XMS-Wert bestimmt, wann die Garbage-Collection anfängt, 'gründlich' sauberzumachen. Also habe ich den XMX-Wert auf 3/4 des XMS-Wertes gesetzt, und siehe da, seitedem ist das Problem nie wieder aufgetreten. Man kann in der Console auch schön beobachten, dass die 'full GC' beizeiten ausgelöst wird und somit das Problem nicht mehr auftritt.
Mit diesem Wissen habe ich mich dann am Tomcat probiert und auch dort das OutOfMemory-Problem, mit dem ich zuvor lange gekämpft hatte, gelöst.
Wann die 'kleineren Objekte' von der GarbageCollection eingesammelt und zerstört werden hängt also offensichtlich auch von dem Verfügbaren Speicher ab (ist ja auch logisch).

Die Problematik mit den Threadsicheren HTTP-Connections ist mir grade im Domino-Umfeld gut bekannt. (Hängende HTTP-Requests, die das herunterfahren des Servers verhindern). Da hat der Commons.HTTPClient wirklich eine Lücke geschlossen.

Aber es gibt da offensichtlich noch andere Probleme mit dem Thread-Handling. So passiert es mir unter großer Last immer wieder mal, dass die JVM (mit JAVA-API Zugriffen) wegraucht. Im hs_pid stehen dann auch so Thread-Geschichten, die auf Memory-Leaks hinweisen, welche beim Aufruf der Thread.stop()-Methode entstehen. Diese Methode wird allerdings aus den API-Klassen (NotesThread.stermThread()) selbst aufgerufen.


@Ralf
Dass das recyclen der Session auch alle daraus instanziierten Objekte mit-recycelt ist mir neu. Aber gut zu wissen.

Thomas
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: flaite am 02.02.06 - 17:39:43
Hallo Thomas,

es ist schon richtig, dass man mit diesen Parametern tunen kann. Eine wirklich 100% zuverlässige Kontrolle über den garbage collector hat man aber nicht. OutOfMemoryExceptions können auch als Hinweis auf eine unsaubere Stelle im Code angesehen werden.
Notes Zugriffe haben bestimmt noch ein paar Rätsel. Wir haben hier z.B. gerade das Problem, dass ein im debug Modus gestarteter JBoss Exceptions wirft, die er im normalen Modus nicht wirft. Und das wird von Notes-Klassen geworfen.

Gruß Axel
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Snowaddy am 13.02.06 - 16:03:09
Seid Notes 4.x habe ich schon ein Problem mit Java Applets in Notes Dokumenten.
Im Web funktioniert alles wunderbar (SUN JVM etc.)
Im Notes Client jedoch summiert sich der Speicherverbrauch des Notes-Tasks mit jedem Öffnen des Dokumentes, das das Applet enthält.
Das Applet ist ca. 300KB groß, lädt relativ viel nach und erzeugt auch sehr viele Objekte..
-> Einmal Öffnen kann schon mal 5MB verbrauchen.

Diese werden aber nach dem Schließen nicht wieder zur Verfügung gestellt.
Gegen Ende der Fahnenstange (JavaMaxHeapSize erreicht) wird Notes dann langsam und bleibt schließlich hängen.

Man kann natürlich in der notes.ini JavaMaxHeapSize hoch setzen. Aber das kann doch nicht die Lösung sein...

Außerdem habe ich den Eindruck, dass das Ablegen der Applet-Klassen lokal auf dem Rechner und setzten des Pfades (JavaUserClasses) in der notes.ini etwas hilft...

Woran kann das liegen ?

Wie gesagt: Mit SUN JVM funktioniert alles ohne Probleme.

Gruß, Dirk.
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Ralf_M_Petter am 13.02.06 - 16:07:12
Verwendet das Applet das Notes API?

Grüße

Ralf
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Snowaddy am 13.02.06 - 16:11:46
Ja, schon..

Die werden aber alle recycled. Bei der Session bin ich mir nicht ganz sicher...
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Ralf_M_Petter am 13.02.06 - 16:14:31
Ohne den Code jetzt zu sehen, werden wir da auf keinen grünen Zweck kommen. Versuche einen Testcase zu gernerieren, der so einfach wie möglich ist, bei dem das Problem jedoch noch auftritt. Dann poste den Source dazu dann schau ich mal kurz rein.

Grüße

Ralf

P.S. Bei Applets muß man wie bei allen Gui Sachen extrem auf das Threading aufpassen. Vor allem auf die NotesThread.sinit und term Problematik.
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Snowaddy am 13.02.06 - 16:25:56
Hier einige Code-Schnipsel für das Laden der Daten :


                // Session holen
      try {
         session = openSession();
      } catch (NotesException e) {
         e.printStackTrace();
      }

                // DB usw. öffnen
      try {
         Database db = session.getDatabase(model.dbServer, model.dbPath);
         Document document = null;
         if (model.doc != null)
            document = db.getDocumentByID(model.doc);
         else
            document = db.getDocumentByUNID(model.docUNID);
                        // Daten laden
         ladeDaten (db.getParent(), document);
      } catch (Exception e) {
         e.printStackTrace();
      }



   public void ladeDaten(Object session, Object doc) {
      Database    db = ((Document)doc).getParentDatabase();
      View        view = db.getView(name);
                //....
                //(Kein NotesThread.sinit() oder sterm().....)
                //........
                if (view != null)
          view.recycle();
      if (db != null)
          db.recycle();
                //..........
                // Kein session.recycle
        }



Kann das fehlende session.recycle denn die Ursache sein ? Es werden ca. 100 kb Daten geladen. Aus denen werden dann viele Objekte erzeugt, die nichts mit der Notes-API zu tun haben. Der Speicherverbrauch deutet eher darauf hin, dass diese Objekte nicht wieder aufgeräumt werden.

Wo muss ich mit dem Threading aufpassen ?
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Ralf_M_Petter am 13.02.06 - 16:34:33
Ohne Böse zu sein, aber deine Code schnippsel sagen praktisch gar nichts aus. Gerade bei so vertrakten Problemen wie Memory leaks, benötigt man auf jeden Fall den gesamten Code der das Problem auslöst, sonst ist das nur ein Blick in die Kristallkugel.

Also mein Tip. Mach dir die Arbeit und mach ein einfaches Beispiel mit so wenig Code wie möglich wo du den Fehler reproduzieren kannst.

Verwendest du Swing in deinem Applet? Eventuell sind es deine Swing Objekte die sich irgendwie gegenseitig referenzieren. in dem Bereich hatte ich schon mal Probleme.

Grüße

Ralf
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Snowaddy am 13.02.06 - 16:44:40
Vielen Dank für Deine schnellen Antworten..

Ich kann kaum die ganzen 300kb Code posten (Source-Code noch viel mehr). Der gepostete Code beschreibt grob das Laden der Daten...

Wieso muss ich mit NotesThread.sinit/sterm aufpassen ? Muss ich diese überhaupt verwenden (es funktioniert ja auch so) ?

Kann es sein, dass Objekt von der Notes-JVM nicht wieder freigegeben werden ?

Danke, Dirk.
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Ralf_M_Petter am 13.02.06 - 16:53:51
Drum habe ich ja gesagt, du sollst ein kurzes Beispiel machen bei dem das Problem auch auftritt. Das ist die normale Vorgehendsweise bei solchen Problemen. Das Applet soweit wie möglich zu reduzieren.


Zu NotesThread.sinit sterm ist zu sagen, wenn du die Notes API nur im Standard Thread verwendest, wirst du es nicht brauchen. Wenn du es jedoch auch z.B. im Event Handler Thread verwenden willst, dann musst du diesen Thread unbedingt für Notes initialisieren und auch wieder beenden. Man sollte auch nicht Notes Objekte in mehreren Threads verwenden. Vorsicht, das gilt aber nur bei Verwendung des lokalen Zugriffs. Wenn du DIIOP verwendest was im Webbrowser wahrscheinlich so ist, darf man NotesThread nirgends verwenden. In Notes wird aber sehr wohl der Lokale Zugriff verwendet.

Aber wie gesagt ohne vollständigen Code ist alles Kaffeesudleserei.

Grüße

Ralf
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Snowaddy am 13.02.06 - 18:20:43
Ok, danke für die Hilfe.

Ich werde jetzt nicht alle 20000 Codezeilen posten..

Was ich nur traurig finde ist, dass sich der Notes Client verabschiedet, sobald der Java Speicher am Ende ist..

Es liegt mit Sicherheit auch nicht an der Benutzung der Notes-API.
Es mag sein, dass nicht alle Objekte beim Beenden sauber auf NULL gesetzt werden, aber es sollte doch auch ohne das explizite Setzen auf NULL funktionieren.
Tut es ja in anderen JVMs auch.

Gruß, Dirk.
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: Ralf_M_Petter am 13.02.06 - 18:29:55
Entschuldige kannst du mir vielleicht sagen was an dem Satz "Du sollst ein einfaches Beispiel bringen wo das Problem auftritt" du nicht verstehst? In einem 20000 Zeilen Code Monster wirst du den Fehler sowieso nie finden. Deshalb ist wie ich bereits mehrmals geschrieben habe die richtige Vorgehendsweise bei solchen Problemen den Fehler mit einem einfachen Beispiel zu reproduzieren.

Meiner Erfahrung nach liegt es meistens daran dass man in Swing nicht ordentlich aufgeräumt hat. Ein Teil deines Applets läuft dann nach Beendigung des Codes einfach weiter. Das liegt meiner Meinung auch ein wenig darin begründet, da Notes die JVM nach Beenden des Applets nicht einfach beendet. Notes verwendet auch nur eine JVM für alle Aktivitäten.

Wie gesagt, helfe gerne aber wenn du dafür nichts machen willst, wendest du dich wohl besser nicht an ein Forum sondern an den kostenpflichtigen Support. Leider für dich werden die auch ein Beispiel anfordern an dem das Problem reproduzierbar ist.

Grüße

Ralf
Titel: Re: Speicherverwaltung Java + Lotus Notes Domino
Beitrag von: flaite am 13.02.06 - 19:07:31
Was ich nur traurig finde ist, dass sich der Notes Client verabschiedet, sobald der Java Speicher am Ende ist..
ich nicht. Ich glaub das wäre eventuell eine Sicherheitslücke, wenn das nicht so wäre. Die JVM ist so spezifiziert, dass sie diesen Error (nicht Exception) werfen muß.

Du kannst es mal mit Profiling Tools versuchen.
Wir arbeiten aber auch noch daran, dieses Thema einigermassen stabil und nicht chaotisch in den Griff zu kriegen. Es gibt in diesem Bereich immer mehr, bessere und komfortablere Tools. Leider sind die besten nicht umsonst.
Vielleicht poste ich mal was dazu.

Gruß Axel