Problemlösungvorschläge zum beliebten Java Fehler : java.lang.OutOfMemoryError:

Hi,

bei Client-/Serveranwendungen (wie überall) ist die Performance sehr wichtig. Daher würde ich meinen Vorrednern beipflichten - unterteile Deine Ergebnisse in Häppchen.
Bei Strings z.B. kann man im Extremfall byte weise übertragen.

Noch ein anderes Problem: Selbst ein gutes DBMS ist nicht schnell, wenn man ein select macht, bei welchem n-tausend Zeilen herauskommen. Deshalb hier ein Denkansatz mit etwas Pseudocode.
Du solltest die Ergebnisspalten von vornherein mit einem "limit" SQL Befehl begrenzen. Oder/und: Du könntest die Abfrage nach IDs in Intervalle unterteilen (where id between startIndex and endIndex).
Dann iterierst Du die Indexe hoch, z.B.:

- startIndex=0, endIndex =100
- Abfrage
- wenn Ergebnis wirklich 99 Zeilen umfasst, zähle hoch
- startIndex = 101, endIndex = 200
- Abfrage
- usw...

Zusätzlich kannst Du probieren,
Jedes Ergebnis ResultSet zeilenweise zu senden/empfangen.
Das Senden initiierst Du, indem Du einen Buffer (z.B. ResulSet Array) einrichtest,
der beim Senden abgearbeitet wird. D.h. für jede erfolgreiche Abfrage fügst Du einem (z.B.) ArrayList Buffer dieses ResultSet hinzu. Dann iterierst Du die BufferList durch,
gibst die Ergebnisse in dem jeweiligen ResultSet aus

Noch ein Tipp: Check mal Dein Programm auf Rekursionen.
Selbst bei noch so vielen Array Einträgen, ist ein OOME unwahrscheinlich.
In Deinem Code gibt es Möglichkeiten für Rekursionen in Methoden, allerdings kann ich die ja nicht einsehen/nachprüfen.
Ruft Dein Programm sich irgendwo irgendwie selbst auf?

VG Tim
 
Der out of Memory ist hier gar nicht so unwahrscheinlich, auch ohne Rekursion.
Ein Result Objekt hat immerhin 100 Strings (geschätzt) bei 10 k Ergebnissen kommt man auf 1Mio Strings. lass die jeweils im Schnitt 128Byte groß sein, und schon Kommst du auf einen Speicherbedarf von 128MByte was dem schon beträchtlich nah kommen sollte, was der Server einem einzelnen Prozess zugestehen dürfte.

Die vorgeschlagene Lösung fürs portionieren scheint mir der beste weg. da so keine Änderungen an der Serverseite nötig werden.
 
Zurück