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
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