Deshalb gilt folgender Merksatz: Jedes Notesobjekt soll so rasch als möglich wieder recycelt werden. Spätestens jedoch bevor es derefenziert wird.
Ein Beispiel:
if(flag) Document doc=view.getFirstDocument(); System.out.println(doc.getItemValueString("Test"); }
Die Variable doc ist nur innerhalb des ifs gültig und muss deshalb noch innerhalb des if's recycelt werden.
if(flag){ Document doc=view.getFirstDocument(); System.out.println(doc.getItemValueString("Test"); doc.recycle(); }
Es gibt beim Recycle jedoch eine Erleichterung, die einem einige Arbeit spart. Das recyceln von übergeordneten Objekten recycelt alle abgeleiteten Objekte mit.
Auf unser Beispiel übertragen:
View view=cdb.getView("Test"); if(flag){ Document doc=view.getFirstDocument(); System.out.println(doc.getItemValueString("Test"); // doc.recycle(); kann man sich sparen, da das Dokument beim Recyclen der View mitrecycelt wird } else{ Document doc=view.getLastDocument(); System.out.println(doc.getItemValueString("Test"); // doc.recycle(); kann man sich sparen, da das Dokument beim Recyclen der View mitrecycelt wird } view.recycle();
Man sollte dieses implizite Recycle aber nur dann verwenden, wenn man wie in unseren Beispiel gewährleisten kann, dass nur sehr wenige Objekte erzeugt werden und diese auch nicht mit der Datenmenge mehr werden.
Fatal wäre folgender Code:
View view=cdb.getView("Test"); Document doc=view.getFirstDocument(); while(doc!=null){ //Mach was mit doc doc=view.getNextDocument(); } view.recycle();
Dieser Code wird spätestens, bei ein paar Hundert Dokumenten in der View crashen.
Man muß also doc bei jedem Schleifendurchlauf recyceln. Das ist jedoch nicht ganz einfach, da doc ja nach getNextDocument nicht mehr da ist und vorher darf ich es nicht recyclen, da sonst getNextDocument() nicht mehr funktioniert, wenn das aktuelle Dokument recycelt wird. Folgendes Pattern hat sich bewährt:
View view=cdb.getView("Test"); Document doc=view.getFirstDocument(); while(doc!=null){ //Mach was mit doc Document tempdoc=doc; doc=view.getNextDocument(); tempdoc.recycle(); } view.recycle();
Aufpassen muß man natürlich auch darauf, dass man nicht Objekte implizit bereinigt die man noch gerne verwenden möchte:
View view=cdb.getView("Test"); Document doc=view.getFirstDocument(); view.recycle(); //Hier wird doc implizit mitrecycelt. Man darf doc nicht mehr verwenden. System.out.println(doc.getItemValueString("form")); //Hier wird das Programm crashen.
Ich hoffe etwas Licht in die Sache gebracht zu haben. Würde mich auch über Kommentare zu spezifischen Problemen freuen, die ich dann im 3. Teil behandeln werde.