Autor Thema: Frage zu recycle()  (Gelesen 8220 mal)

Sebastianh

  • Gast
Frage zu recycle()
« am: 12.11.09 - 16:19:28 »
Hallo,

folgender Code:
Code
lotus.domino.Document sDoc = docCollection.getFirstDocument();
	while(sDoc != null){
		docVector.add(sDoc);
		sDoc = docCollection.getNextDocument();
	}
sDoc ist hier ja jetzt zwangsweise irgendwann gleich null. Wenn ich jetzt im Schleifenrumpf, bevor ich sDoc ein neues Dokument zuweise,
Code
sDoc.recycle()
aufrufe, ist dann das entsprechende Dokument im Vektor auch "recycled"? Also, muss ich mich im Endeffekt hier überhaupt um sDoc kümmern, oder reicht es an späterer Stelle, wenn der Vector nicht mehr gebraucht wird, die Objekte in diesem zu recyclen?

Grüße,
Sebastian

Sebastianh

  • Gast
Re: Frage zu recycle()
« Antwort #1 am: 12.11.09 - 16:25:16 »
ok, mit sDoc.recycle() werden auch die Objekte im Vector recycled, bzw. das, worauf Sie verweisen. Was mache ich denn dann mit meinem sDoc-Objekt? Wenn es null ist, kann ich es doch nicht mehr recyclen?!

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Frage zu recycle()
« Antwort #2 am: 12.11.09 - 16:30:14 »
Hä was willst du denn mit den Objekt-Referenzen in dem Vector machen?

Du kannst am Ende deines Codes ein Session.recycle(Vector) aufrufen. Vorher macht das ja keinen Sinn.
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Sebastianh

  • Gast
Re: Frage zu recycle()
« Antwort #3 am: 12.11.09 - 16:45:36 »
Das sind halt Dokumente die ich im weiteren Programmverlauf noch brauche.  Ich frage mich halt nur, wenn ich sDoc auf das erste Dokument der Collection zeigen lasse, dann entsprechend durchiteriere, und am Ende auf null setze, belegt sDoc dann noch in irgendeiner Art und Weise speicher, den ich, wie auch immer, wieder freigeben muss?
(oder reicht es, ganz am Ende des Codes lediglich meine Session zu recyclen (weil ja alle Objekte die ich im Verlaufe meines Code anlege irgendwie davon abhängen)).
« Letzte Änderung: 12.11.09 - 16:47:37 von Sebastianh »

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Frage zu recycle()
« Antwort #4 am: 12.11.09 - 17:56:45 »
Ich finde es verwirrend was du schreibst ;)

Wenn du sDoc auf null setzt, dann leerst du die Refrenzvariable, also nicht das Object sonder den Ort zum Speicher. Um das Object aus dem Speicher zu entfernen musst du ein recycle machen, macht natürlich nur Sinn wenn du es nicht mehr brauchst.

Das "recycle" entfernt auch nicht wirklich das Objekt, das macht dann eigentlich der GarbageCollector von Java.

Deine Refrenzvariable sDoc belegt sowenig Speicher das du das getrost ignorieren kannst.
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Sebastianh

  • Gast
Re: Frage zu recycle()
« Antwort #5 am: 17.11.09 - 14:07:57 »
Das "recycle" entfernt auch nicht wirklich das Objekt, das macht dann eigentlich der GarbageCollector von Java.
Ja, schon klar, dass das Javaobjekt vom Garbagecollector "behandelt" wird. Aber, so wie ich das verstanden hab, sind doch alle Klassen aus lotus.domino.* lediglich Wrapper für die eigentlichen C-Klassen. Ergo wird vom Garbage-Collector lediglich der Teil des Objektes gelöscht, der für Java angelegt worden ist, nicht aber der Teil der für den C-Teil des Objektes reserviert wurde, oder? (ich gehe jetzt mal davon aus, dass wenn ich ein Objekt mit xxx = new DominoObject(); erzeuge, immer auch Speicher reserviert wird, der eben NICHT vom Garbagecollector wieder freigegeben werden kann)

Im Endeffekt geht es mir darum, dass ich mehrere tausend Dokumente durchiteriere, da macht recycle oder nicht recycle schon was aus denke ich.

Offline atbits

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 708
  • Geschlecht: Männlich
  • sei Du selbst die Veränderung, die Du Dir wünschst
    • atBits
Re: Frage zu recycle()
« Antwort #6 am: 17.11.09 - 14:10:06 »
Was Sebastian schreibt ist zu 100% korrekt.
Nur der Java-Teil wird vom GC behandelt, der C-Teil nicht.

Grüße David
David Schiffer
================================
atBits GmbH & Co. KG - https://atbits.de
im Einsatz: Lotus Domino 8.5, 9, 10

Sebastianh

  • Gast
Re: Frage zu recycle()
« Antwort #7 am: 17.11.09 - 14:15:49 »
was zurück zu meiner eigentlichen Frage führt, ich habe irgend ein x-beliebiges DominoObject (in diesem Fall halt lotus.domino.document), arbeite damit, setze es dann später auf "null". Jetzt kann ich auf dem Objekt kein "recycle()" mehr aufrufen, der Speicher (der C-Teil des Objektes) sollte nach meinem Verständnis aber noch im Speicher dem Objekt zugewiesen sein. Wie gebe ich diesen Speicher wieder frei, ohne die Möglichkeit zu haben, "recycle()" aufzurufen, oder muss ich mich darum nicht kümmern?

Offline atbits

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 708
  • Geschlecht: Männlich
  • sei Du selbst die Veränderung, die Du Dir wünschst
    • atBits
Re: Frage zu recycle()
« Antwort #8 am: 17.11.09 - 14:41:37 »
Doch Du mußt Dich darum kümmern, sonst läuft Dir der Speicher voll.

Warum machst Du nicht

Code
doc.recycle();
doc == null;

Grüße David
David Schiffer
================================
atBits GmbH & Co. KG - https://atbits.de
im Einsatz: Lotus Domino 8.5, 9, 10

Sebastianh

  • Gast
Re: Frage zu recycle()
« Antwort #9 am: 17.11.09 - 14:48:11 »
siehe mein erster Post, ich befinde mich in einer while-Schleife, die als Abbruchbedinung eben prüft, ob mein Object gleich "null" ist, was bei der DocumentCollection ja irgendwann automatisch passiert. Wenn ich jetzt innerhalb des Schleifenrumpfes bereits recycle() aufrufe, dann recycle ich doch den C-Teil des Objektes das ich in den Vector stecke, was dazu führt, dass ich später darauf nicht mehr zugreifen kann.

Offline atbits

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 708
  • Geschlecht: Männlich
  • sei Du selbst die Veränderung, die Du Dir wünschst
    • atBits
Re: Frage zu recycle()
« Antwort #10 am: 17.11.09 - 14:53:40 »
Sorry hatte ich nicht gelesen

iteriere doch einfach am Ende Deiner Methode über den Vector und rufe auf allen Objekten deines Vectors ein recycle() auf.

Oder stehe ich auf dem Schlauch und verstehe das Problem nicht?

David
David Schiffer
================================
atBits GmbH & Co. KG - https://atbits.de
im Einsatz: Lotus Domino 8.5, 9, 10

Sebastianh

  • Gast
Re: Frage zu recycle()
« Antwort #11 am: 17.11.09 - 15:01:11 »
Also, muss ich mich im Endeffekt hier überhaupt um sDoc kümmern, oder reicht es an späterer Stelle, wenn der Vector nicht mehr gebraucht wird, die Objekte in diesem zu recyclen?

Das war eine Option die ich in Betracht gezogen hatte. Ich war mir halt nicht ganz sicher, ob dann der Speicherplatz der für das "sDoc"-Objekt reserviert wurde, auch wieder mit freigegeben wird.

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Frage zu recycle()
« Antwort #12 am: 17.11.09 - 15:31:37 »
Du scheinst mir Variablen und Objekte durcheinander zu bringen.
sDoc ist nur die Variable, die im Laufe des Prozesses des Iterierens auf unterschiedliche Objekte referenziert.
Variablen und das Objekte sind 2 unterschiedliche Dinge.

Sie haben miteinander ungefähr so viel zu tun, wie der offizielle Referenzkurs des venezuelanischen Bolivars mit dem Dollar UND die reale agregierte Nachfrage der Wirtschaftssubjekte der Bolibananischen Republik Venezuela Bolivars in Dollars umzutauschen. Nämlich nix, nada, nothing, zilch.

 
Wenn du so einen code schreibst.
Code
Integer a = new Integer(2); 
Integer b = a; 
hast du 2 Bezeichner, mit dem du auf das gleiche Objekt zugreifen kannst (a und b). 2 Bezeichner, 1 Objekt.

Wenn du so einen Code schreibst
Code
 
Iterator it = list.iterator();
while (it.hasNext()) {
 Integer a = (Integer)it.next(); 
}
verweist die lokale Variable a in ihrem Lebenszyklus auf unterschiedliche Objekte.

Variablen haben eine Bezeichner-Funktion. Über sie ist es möglich auf Objekte zuzugreifen.

Wenn du Dokumente aus einer DocumentCollection in eine Collection schreibst (benutze besser java.util.List statt java.util.Vector) dann macht recycle keinen Sinn. Schließlich willst du die Objekte in der Collection ja nochmal verwenden. Sonst wärs ziemlich sinnlos, sie erst überhaupt in die Collection zu tun.

recycle() rufst du nicht auf die Variablen auf. Sondern du referenzierst die Objekte mit der Variable und rufst dann recycle() auf das Objekt auf (wenn du es nicht mehr brauchst).

Dein Reflex recycle in einer Schleife aufzurufen, war schon richtig. Nur mußt du halt noch die Konzepte Variablen/Bezeichner und Objekte trennen.

Hoffe es hilft.    

Übrigens macht es mit sehr hoher Wahrscheinlichkeit keinen Sinn Dokumente aus einer DocumentCollection in eine java Collection umzupacken. Die DocumentCollection ist ja schon eine Art Collection, über die du iterieren, etc. kannst. Aber das ist ein anderes Thema.

In der Praxis würds reichen im geeigneten Moment documentCollection.recycle() aufzurufen. Damit rufen die Notes Objekte selbst recycle auf alle darin referenzierten Notes-Dokument-Objekte auf. Oder noch besser: documentCollections werden mit einem DB-Objekt erzeugt. Du musst nur recycle auf das db-Objekt aufrufen. Dann wird recycle auf die daraus erzeugte DocumentCollection und die darin enthaltenden Notes-Dokumente automatisch aufgerufen.
Nur wenn du halt sehr viele Notes-Objekte aufrufst, macht es oft Sinn, jedes einzeln in der Schleife zu recyclen. Schreib beispielsweise oft den für das Programm interessanten Feldwerte eines Notes-Klasse in ein Java Bean (Java Objekt mit gettern und settern).

Hier ein praxisverwandtes Beispiel, in dem recycle in einer Schleife benutzt wird.

Code
Document  docMy = docCollection.getFirstDocument(); 

List bean = new ArrayList(); 
while (docCollection.hasNextDocument(docMy)) {
   Document docLast = docMy; 
   MyBean mrBean = cDocBeanMapper.do(docMy); // erzeugt ein MyBean Objekt und schreibt die Werte aus dem Dokument in ein Java Bean. 
   bean.add(mrBean); 
   docMy = docCollection.getNextDocument(docMy); 
   docLast.recycle(); // das Objekt wird nie mehr benötigt, weil alle mich interessierenden Daten in dem Bean stehen. 
}

   
« Letzte Änderung: 17.11.09 - 15:52:03 von Pitiyankee »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Sebastianh

  • Gast
Re: Frage zu recycle()
« Antwort #13 am: 17.11.09 - 15:49:12 »
ok, Danke!

Das hat meine Frage beantwortet.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz