OutOfMemoryError

Shoox

Mitglied
Hallo an alle,
ich habe anscheinend ein kleines Problem mit dem RAM, ich bekomme nml einen OutOfMemoryError (Java heap space).

Mal zur Erläuterung:
Ich lese Daten von einer mySQL-DB mit ~400.000 Datensätzen. Der DB-Server läuft lokal. Ich gehe jeden Datensatz einzeln durch und schreibe ihn in eine entfernte DB. Sobald ich einen Satz geschrieben hab, mach ich ein update auf der mySQL-DB.

Der Vorgang sieht ungefähr so aus:
Connection c1 aufbauen, autocommit(false)
Connection c2 aufbauen, autocommit(false)
ResultSet rs = SELECT auf c1 um die Daten zu holen
while(rs.next()) {
HashMap hm = getMySqlData(rs)
insertC2(hm)
updateC1(hm)
}
wenn alles korrekt abgelaufen ist: c1.commit() c2.commit() und abschließend die connections wieder schließen.

Was vielleicht noch Bedeutung sein könnte ist, dass es nicht nur ein insert ist, sondern bis zu 6.
So, jetzt geht mir laut Fehlermeldung der RAM aus. Wie könnte ich diese Abfolge umstrukturieren damit der RAM nicht so ausgelastet wird?

Meine Befürchtung und auch der Grund, warum ich alles in einem Durchlauf mache, ist, dass inkonsistente Daten entstehen könnten. Es kann ja sein, dass während meinem Batchlaufs irgendjemand anders auf die Idee kommt die Daten zu verändern (nur auf der mySQL-DB möglich) gibt es da Einstellungen um Dirty Read & Write zu unterbinden? Das ich sozusagen sage: "Du bist gesperrt bis ich fertig bin"

Ich hab mir auch ein paar andere Sachen überlegt: Das update könnte ich mit einem Schlag nach den inserts durchführen. Dann wäre mal ein großer Brocken weg (hoffe ich). Ein weiterer Punkt ist, dass ich kein ResultSet nehme sondern ein CachedRowSet oder etwas in der Art - bringt das performance mäßig was? Auch ist mein update ein eigenes PreparedStatement ... könnte ich, bzw sollte ich das update mithilfe des ResultSets machen?

Ich danke euren Gehirnzellen und Nervensträngen schon im vorraus.
LG Shoox
 

Shoox

Mitglied
Ich brauche viel ... war natürlich auch mein erster Gedanke: "Was? Mein Code kann nicht schuld sein" Heap Space muss erhöht werden! ^^ hat aber nichts geholfen.
€: Ich vermute halt mal, dass man bei solchen Datenmengen und mit dem Wunsch alles in einem Durchgang zu machen zu solch hoher RAM Belastung kommt. Kann natürlich auch sein, dass mein Code jz nicht der performanteste der Welt ist ...
 
G

Gast2

Gast
Hast du dir, z.b. mit VisualVM, schonmal deinen Heap angeschaut was da soviel Speicher braucht?
 

Shoox

Mitglied
visualVM kenn ich nicht, wär aber nicht schlecht zu wissen was im heap so vor sich geht, werd mir das gleich mal ansehen, danke für den tipp :)
ein Datensatz kommt um den Daumen gerechnet auf 1kB
 

FArt

Top Contributor
Musst du zwischendurch immer commiten? Sonst kannst du ja alle Inserts in einer Transaktion zusammenfassen, dann bist du auf der sicheren Seite. Das sollte immer der erste Ansatz sein.

So weit ich weiß gibt es aber auch für die DB die Möglichkeit extern Tabellen zu locken... google doch mal danach.
 

Shoox

Mitglied
Ich commite eh nicht zwischendurch, ich hab mir nur gedacht, dass ich so den RAM etwas entlasten könnte, wenn ich zB nach 5000 inserts mal ein commit mache.
Das mit der Sperre war natürlich auch nur eine erste Idee, ich find das irgendwie nicht so gut wenn ich einfach die Tabelle sperre, eine elegantere Lösung wäre mir lieber ;) aber wenn es nicht anders geht ... nja
 

FArt

Top Contributor
Es geht sicher besser, aber dafür muss man sich deinen Code genau ansehen und die Randparameter kennen. Also z.B. mal nachsehen (Profiler), wo denn der Speicher verbraucht wird.
Eine pauschale Aussage ist selten möglich.
 

Shoox

Mitglied
Uh, hab meinen Fehler gefunden ... ich habe eine HashMap für jeden Datensatz neu instanziert, dadurch hat sich das schnell summiert. Aber trotzdem Danke für die Tipps, vorallem für die netten Tools um den Heap/CPU/etc zu verfolgen. Praktische Sache

@FArt pauschal kann man meistens sagen: "Schau dir deinen Code bitte nochmal genau an bevor du nutzlose Threads erstellst" ^^
 

FArt

Top Contributor
Uh, hab meinen Fehler gefunden ... ich habe eine HashMap für jeden Datensatz neu instanziert, dadurch hat sich das schnell summiert. Aber trotzdem Danke für die Tipps, vorallem für die netten Tools um den Heap/CPU/etc zu verfolgen. Praktische Sache

@FArt pauschal kann man meistens sagen: "Schau dir deinen Code bitte nochmal genau an bevor du nutzlose Threads erstellst" ^^

Mist, das sage ich sonst immer, werde aber dafür nur angeblökt..;(
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Apache fop - OutOfMemoryError Allgemeine Java-Themen 10
L Java OutOfMemoryError Java heap space Allgemeine Java-Themen 3
B OutOfMemoryError kommt nicht/Bug in Java? Allgemeine Java-Themen 2
Maxim6394 OutOfMemoryError nicht nachvollziehbar Allgemeine Java-Themen 8
reibi OutOfMemoryError bei Behandlung von BufferedImage's Allgemeine Java-Themen 6
E OutOfMemoryError bei Verschlüsselungsalgorithmus Allgemeine Java-Themen 3
L java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 10
H java.lang.OutOfMemoryError bei der wiederholten Erzeugng von Threads Allgemeine Java-Themen 8
D OutOfMemoryError:Java hep space Allgemeine Java-Themen 7
M OutOfMemoryError in nebenläufigen Threads Allgemeine Java-Themen 6
C nach ca. 1 Stunde OutOfMemoryError Allgemeine Java-Themen 15
J Crawler selbst geschreiben: OutOfMemoryError Allgemeine Java-Themen 14
A OutOfMemoryError: Java heap space Allgemeine Java-Themen 11
K OutOfMemoryError: Java heap space troz -Xms1024m Allgemeine Java-Themen 2
P OutOfMemoryError beim XML erstellen bzw parsen, mehr RAM? Allgemeine Java-Themen 4
R OutofMemoryError bei CharArraywriter Allgemeine Java-Themen 5
F OutOfMemoryError: Java heap space - Speicher verändern Allgemeine Java-Themen 8
J java Thread java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 7
B OutOfMemoryError und Arraylisten Allgemeine Java-Themen 2
G Error: java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 2
S java.lang.OutOfMemoryError: Java Allgemeine Java-Themen 22
M java.lang.OutOfMemoryError Allgemeine Java-Themen 2
F java.lang.OutOfMemoryError: Java heap space Allgemeine Java-Themen 22
S fehlermeldung java.lang.OutOfMemoryError Allgemeine Java-Themen 5
G outOfMemoryError beim Einlesen einer Datei abfangen? Allgemeine Java-Themen 13
H Skalieren von Image -> java.lang.OutOfMemoryError - WARUM Allgemeine Java-Themen 18
G jTable-Problem --> java.lang.OutOfMemoryError Allgemeine Java-Themen 5
F java.lang.OutOfMemoryError Allgemeine Java-Themen 13
C OutOfMemoryError lokalisieren Allgemeine Java-Themen 9
M java.lang.OutOfMemoryError Allgemeine Java-Themen 7
T jva.lang.OutOfMemoryError Allgemeine Java-Themen 8
F java.lang.OutOfMemoryError Allgemeine Java-Themen 17

Ähnliche Java Themen

Neue Themen


Oben