Transfertool + Speicherauslastung

Akeshihiro

Erfahrenes Mitglied
Moin ^^

Ich bin im Moment in einem Praktikum und als Aufgabe hat es sich mehr oder weniger spontan ergeben, dass ich ein System bastel, das einige Tabelle vom betriebsinternen Server mit den Tabellen auf einem Webserver abgleicht.

Mit den online liegenden Daten sollen dann die Kunden arbeiten können.

Mein Problem ist die recht hohe Speicherauslastung. An sich klappt alles, jedenfalls scheint es so. Aber irgendwann, wenn die Speicherauslastung bei einem Wert von ca. 120MB ist, bekomm ich nen Fehler (OutOfMemoryError) und das Programm beendet sich.

Ich gehe davon aus, dass das mit den 128MB zusammenhängt, die JVM standartmäßig als Max-Speicher festlegt.

Ich habe hier auch zwei oder drei Threads gefunden, in denen es um eine ähnliche Problematik ging. Aber es kann nicht sein, dass die einzige Lösung die ist, dass man der JVM mehr RAM verpasst.

Ich habe im Code schon alle möglichen Speicherfresser ausgelöscht, sprich alle Objekte, die nicht mehr benötigt werden nach dem Gebraucht auf null (null) gesetzt, zwinge sogar an vier Stellen den GC zu starten.

An sich hat die ganze Aktion die Performence erheblich verbessert (auch wenn die Fummelarbeit zum kotzen war...), aber weiter weiß ich im Moment leider auch nicht.

Meine Vermutung ist die, dass die Statements die ausgeführten Anfragen mit ihren Ergebnissen speichern und dass das dann zu dem Speicherüberlauf führt. Ich finde aber keine Möglichkeit, diese zu leeren, das heißt falls es überhaupt stimmt.

Weiß irgend jemand eine Möglichkeit, wie man die Speicherauslastung reduzieren kann? Die Sache ist die: Ich habe es hier mit rund 700.000-800.000 Datensätzen zu tun und die Datenmenge entspricht in etwa 130-140MB, kann aber auch locker auf über 1.000.000 Datensätze ansteigen und entsprechend auch die Datenmenge.

Der Ablauf sieht so aus, dass ich jeden eingelesenen Datensatz auch gleich wieder wegschicke an die zweite Datenbank. Es werden keine Datensätze gespeichert oder sonwas mit ihnen angestellt, einfach nur eingelesen und verschickt. Ich kann mich auch irren, aber eigentlich müssten diese "Müll"-Daten dann für das Aufräumkommando freigegeben sein und somit löschbar und wie gesagt, für den Fall, dass der GC nicht von allein starten sollte, wird er an verschiedenen Stellen dazu gezwungen.

Die einzige Stelle, wo jetzt die Daten nicht freigegeben werden (können) sind die Statements.

Das Problem nervt mich jetzt schon seit Tagen, ich sitze schon seit Anfang der Woche an der Verbesserung der Performence und wie gesagt, es hat auch einiges gebracht, reicht aber immer nocht nicht.
Ich bin daher für jeden Vorschlag dankbar.

mfg
 
Hallo,

Meine Vermutung ist die, dass die Statements die ausgeführten Anfragen mit ihren Ergebnissen speichern und dass das dann zu dem Speicherüberlauf führt. Ich finde aber keine Möglichkeit, diese zu leeren, das heißt falls es überhaupt stimmt.
Arbeitest du hier viel "manuell" mit JDBC? Hast du auch die Statements / ResultSets etc. nach der Verwendung via mit close() geschlossen ? Machst du bei Batch Statements auch ein clearBatch()?

Gruß Tom
 
Ich bin jetzt nicht mehr im Betrieb, kann daher grad keine Code-Ausschnitte posten, aber es kommt nicht mal soweit, dass ich die Verbindungen schließen kann, weil ja während der Verarbeitung ein Datensatz aus einer Datenbank in eine andere übertragen werden muss. Während der Verarbeitung ist also die Verbindung die ganze Zeit vorhanden, da sie verwendet wird.

Das Schließen der Verbindungen geschieht im finally-Block, das heißt egal ob die Verarbeitung sauber war oder ob ein Fehler aufgetreten ist, geschlossen werden die Verbindungen, das sehe ich auch an der Log-Datei, in der ich die Schritte loge, die passieren.

Und ja, es wird viel mit JDBC gemacht, weil das alles mit Schleifen abläuft und naja, wie gesagt, bei ca. 700.000 Datensätzen passiert da schon recht viel...
 
Zurück