Domino 9 und frühere Versionen > ND8: Entwicklung
Java Agent recyclen
Ralf_M_Petter:
Ja aber wie lang sind die Strings?
Grüße
Ralf
Ralf_M_Petter:
Vielleicht arbeitest du in dem Code der fehlt auch mit Trim oder substring was deine Probleme leicht erklären würde.
Grüße
Ralf
Matze84:
Ja substring verwende ich mehrfach. Meinst du, dass durch die dadurch bedingte Neu-Bildung von Strings wäre der erhöhte Speicherbedarf zu erklären ? (Thema Strings und immutable)
Ralf_M_Petter:
Nein das Gegenteil ist das Problem. In der Notes JVM belegt ein Substring genau den gleichen Speicherplatz wie der String aus dem er herausgeschnitten wurde.
Ein Beispiel:
Du liest eine Datei ein, in der jeder Datensatz kommaseparierte Werte enthält. Du liest jeden Satz und schneidest mit substring das Feld heraus, das du brauchst und nimmst als Schlüssel einer Hashmap. Dein Wert den du herausschneidest ist kurz deshalb sollte der Hauptspeicherverbrauch gering sein. Das ist er jedoch nicht, da jeder Substring den Hauptspeicher des gesamten Satzes benötigt. Wobei man fairerweise sagen muss, dass sich alle Substrings den selben Hauptspeicherbereich teilen. Das heisst wenn du alle Felder aus dem kommaseparierten String verwenden würdest hättest du keinen Nachteil.
Erklärung ein String besteht im großen und ganzen aus einem char Array. Wenn du nun Funktionen wie z.B. trim oder substring aufrufst, wird zwar ein neues String Objekt erzeugt, aber die Referenz des char Arrays verweist auf das selbe Array wie beim Ursprungsstring. Im String Objekt werden nur 2 ints gespeichert, die angeben, wo der ausgeschnittene String beginnt und wo er wieder endet. Das sollte eine bessere Performance und Hauptspeicherersparnis bringen. Da mittlerweile die Nachteile überwiegen, wurde diese Vorgehendsweise in Java 7.x geändert. Notes verwendet aber noch immer Version 6.x. Deshalb Vorsicht wenn du Daten mit Substring ausschneidest und dann in einer Hashmap speicherst.
Grüße
Ralf
eknori:
Habe mir den Code mal angesehen und noch ein paar Minuten meiner Pause übrig.
Zunächst einmal
--- Code: ---HashMap<String, LogEntry> listLogEntries = new HashMap<String,LogEntry>(100000);
--- Ende Code ---
Das kann dynamisch erledigt werden, also die 100000 weglassen. Sollte aber nicht das Problem sein.
Dein recycling ist soweit OK, aber ich würde den Code etwas anders aufbauen. Zunächst mal die Dokumente / Values in eine Collection zu saugen und dann in ein neues Object, das in der Map gespeichert wird ...
Ich würde mir eine view bauen, die die paar daten als Spalten enthält ( spart dir die Berechnung im Code )
Dann mit ViewNavigator über die View laufen und aus jeder Zeile ein neues Dokument schreiben. ( spart dir das "öffnen" des documents, da die Werte direkt aus der View gelesen werden.
Du hast dann auch keine Collection und Hashmap mehr ( spart eindeutig ein paar Byte im Speicher )
Nach dem catch { ... } würde ich noch einen finally block einfügen und das recycle der globalen Objekte ( db, session, viewNavigator, ... ) dorthin verlagern.
Zum Thema ViewNavigator bin ich schon einige Male auf diversen veranstaltungen vertreten gewesen http://www.eknori.de/2012-06-03/xgrid-and-performance-optimization/
( Das JSON brauche ich in meinem Beispiel nur für das Grid, du kommst ohne aus. )
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln