OutOfMemoryError in nebenläufigen Threads

Morchel

Mitglied
Hallöchen,

aktuell arbeite ich an einer Anwendung, die unter Anderem in einem bestimmten Ordner alle bestimmten Dateien auslesen und parsen soll. Problem hierran ist, dass es dabei bei bestimmten Dateien zu einem OutOfMemoryError führen kann, da sie schlicht zu groß sind (Sind aber keine schlichten Textdateien, die man einfach Zeilenweise auslesen kann).

Dass man keine Error abfangen soll ist mir klar, da man so nicht genau weiß, ob noch der komplette Speicherbereich korrekt ist. Wie verhällt es sich dabei aber, wenn ich diese "risikoreichen" Operationen in einen eigenen Thread auslagere? Wenn dieser erfolgreich durchläuft, möchte ich die ermittelten Daten auslesen, ansonsten sollen sie vollständig verworfen werden.

Mein Ziel soll dabei sein, dass, wenn es zu einem Fehler kommt, die nachfolgenden Dateien trotzdem ausgelesen werden können und der Anwender ggf. eine Meldung bekommt, dass es bei Datei XY zum Problem kam.

So hab ich das testweise auch schon umgesetzt und es wirkt oberflächlich (!) betrachtet i.O.
Ist es in dem Fall i.O so vorzugehen oder ist es trotzdem zu heikel die Anwendung weiterlaufen zu lassen, anstatt sterben zu lassen?

Das ganze läuft unter Tomcat. Wie handhabt dieser das eigentlich? Wenn durch bestimmte Seitenaufrufe ein Error auftritt zeigt dieser ja auch nur ne Fehlermeldung an, lässt aber soweit die JVM weiterlaufen, oder nicht?

Ich bedanke mich schonmal für die Antworten.


Schönen Gruß
Morchel
 

timbeau

Gesperrter Benutzer
Ich weiß nicht, wie Tomcat diesen Fall behandelt aber willst du nicht einfach Dateien ab einer bestimmten Größe überspringen? Wäre doch sinnvoller als immer bis zur OOME laufen zu lassen.
 
M

maki

Gast
OutOfMemoryError bezieht sich auf die gesamte JVM, nicht nur auf einzelne Threads.

Wenn ein OOME auftritt, hast du schon verloren, danach gibt es keine Garantieren mehr für deterministisches Verhalten, wenn du es richtig machst wird die JVM danach beendet, fangen von OOME ist was für Experten, und die werfen sie weiter nach eventuellem Logging (obwohl letzteres eben nciht mehr Garantiert ist).

Kurz: Du hast gepfuscht.

Ist nicht böse gemeint, soll aber deutlich machen was du da fabriziert hast.

So, nachdem das geklärt ist, mal zu den Alternativen.

1. Du must nicht immer die ganzen Dateien auf einmal in den RAM laden.
2. Wie hat du den die Tomcat Parameter für die JVM bez. Speicher konfiguriert? Tomcat hat per Default sehr wenig zugewiesen.
 
S

SlaterB

Gast
'irgendein Error', etwa 'Xy nicht gefunden', ist aber nicht unbedingt mit OutOfMemoryError zu vergleichen, das betrifft fast alles,

besonders tückisch: dein Nebenthread könnte gerade 99% des Speichers belegen und in dem Moment ein 'normaler' Thread drankommen,
nur seine drei Objekte erzeugen und dann DORT der OutOfMemoryError auftreten,
voll ist voll, egal wer für die Hauptlast verantwortlich ist,

vielleicht solltest du lieber bisschen kontrollieren, was eingelesen wird, vorher Dateigröße anschauen, eingelesene Bytes mitzählen oder daraus erzeugte Objekt-Mengen ungefähr abschätzen,
natürlich muss dann die Gesamtsituation bekannt sein, ob nicht mehrere derartiger Brocken-Threads gleichzeitig laufen,

Nebenläufigkeit ist generell eigentlich nicht nötig, egal ob du zählst oder die Exception abfängst, das geht in einem Thread genauso wie im normalen Programm,

auch nicht zu verachten ist die direkte Abfrage des Speicher-Zustandes des Programms über Runtime-Klasse
 

Morchel

Mitglied
Ich weiß nicht, wie Tomcat diesen Fall behandelt aber willst du nicht einfach Dateien ab einer bestimmten Größe überspringen? Wäre doch sinnvoller als immer bis zur OOME laufen zu lassen.

Ja, hatte ich auch schon im Hinterkopf. Irgendwie anhand des maximalen oder noch verfügbaren Speichers ermitteln, wie groß die Datei sein darf etc.

Kurz: Du hast gepfuscht.

Ist nicht böse gemeint, soll aber deutlich machen was du da fabriziert hast.
Deswegen frage ich ja nochmal nach, bevor ichs so lasse. Hab mir schon beinahe (aber eben nur beinahe) gedacht, dass man so dennoch weiterhin die Probleme hat. Ich hab zwar viel danach gesucht, habe aber keine genaue Antwort auf meine Frage gefunden gehabt. Wollte nun einfach nochmal sichergehen.


So, nachdem das geklärt ist, mal zu den Alternativen.

1. Du must nicht immer die ganzen Dateien auf einmal in den RAM laden.
2. Wie hat du den die Tomcat Parameter für die JVM bez. Speicher konfiguriert? Tomcat hat per Default sehr wenig zugewiesen.

Das 2. zuerst ; ) : Der Speicher wurde schon erhöht, nur irgendwann ist auch mal gut, damit die JVM nicht zu viel RAM blockiert, nur weil alle paar Tage mal acht mal so viel Speicher, als üblich benötigt wird.

1. Schon klar, wir verwenden allerdings eine externe Bibliothek. Genauer gesagt Apache Tika (was ja wiederrum u.A. Apache POI verwenden).
Hier gibt es zwar auch einen Parser (ForkParser), der das auslesen in einen externen Prozess verschiebt, allerdings wirkt dieser auf mich noch recht experimentell, weswegen ich diesen nicht direkt einsetzen möchte. Dazu ist er auch noch so gut, wie gar nicht dokumentiert. Hatte da die Tage auch schon viel probiert, aber nie richtig zum laufen gebracht.
 
M

maki

Gast
Hast du mal nach deiner Tika Verion (?) gegoogelt, scheint ein Problem mit einer alten Version zu geben.
Ansonsten führt eine Googlesuche mit "Tika OutofmemoryError" schon zu einigen Ergebnissen und ein paar Workarounds (es zB. nciht zu nutzen).

Würde mal in der Tika Mailinglist posten bzw. suchen, ist recht speziell dein Problem.
 

Morchel

Mitglied
Hast du mal nach deiner Tika Verion (?) gegoogelt, scheint ein Problem mit einer alten Version zu geben.
Ansonsten führt eine Googlesuche mit "Tika OutofmemoryError" schon zu einigen Ergebnissen und ein paar Workarounds (es zB. nciht zu nutzen).

Würde mal in der Tika Mailinglist posten bzw. suchen, ist recht speziell dein Problem.

Jop, hab da natürlich schon viel gesucht und auch mehrere und neuere Versionen getestet (auch den aus dem Trunk). Speicherverbrauch wurde geringer und auslesen auch schneller.
Aber meine ursprüngliche Frage habe ich ja auch bewusst allgemein gehalten. Wollte einfach meine Vermutung bestätigen lassen. : )
Werde mich aber mit den spezielleren Fragen auch wohl direkt an die dort wenden.

Oder eben (vorerst) eine schlichtere, wenn auch weniger Optimale Lösung suchen. Zu viel Zeit kann ich im Moment dafür auch nicht aufbringen, da es insgesamt auch eh recht selten auftritt.
 
Ä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
C nach ca. 1 Stunde OutOfMemoryError Allgemeine Java-Themen 15
Shoox OutOfMemoryError Allgemeine Java-Themen 10
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
B Alternative zu nebenläufigen Prozessen Allgemeine Java-Themen 4
S Keine NullPointerExceptions in nebenläufigen Threads Allgemeine Java-Themen 21
rode45e Java Threads Allgemeine Java-Themen 4
M Threads Allgemeine Java-Themen 1
L Threads Threads in Chatroom Allgemeine Java-Themen 30
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
CptK Backpropagation parallelisieren: Kommunikation zwischen den Threads Allgemeine Java-Themen 7
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
W Wieviele Threads sind sinnvoll? Allgemeine Java-Themen 8
W Alternative für Threads Allgemeine Java-Themen 6
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
T Multithreading: Wie viele Threads sollte ich erstellen? Allgemeine Java-Themen 12
G Threads vom Mainprogramm steuern Allgemeine Java-Themen 8
S BlockingQueue mit dynamischer Anpassung der Anzahl von Producer und Consumer Threads Allgemeine Java-Themen 1
x46 Threads Threads anhalten Allgemeine Java-Themen 1
J Threads verbessern die Performance NICHT ? Allgemeine Java-Themen 8
W Threads Problem Allgemeine Java-Themen 15
T Threads Tic Tac Toe mit Threads Allgemeine Java-Themen 1
M Threads über Kommandozeile Allgemeine Java-Themen 5
mrbig2017 Threads Chat Programm mit Threads? Allgemeine Java-Themen 2
J Threads - java.lang.IllegalThreadStateException Allgemeine Java-Themen 6
J Internet Broswer in Threads öffnen Allgemeine Java-Themen 1
B Threads Multithreading Threads sollen warten Allgemeine Java-Themen 12
N 1000 MQTT Messages die Sekunde - 1000 Threads erstellen ? Allgemeine Java-Themen 10
D Threads Parallel laufende Threads Allgemeine Java-Themen 4
J Unvorhersehbares Verhalten - benutze ich die falsche Bedingungsprüfung oder brauche ich Threads? Allgemeine Java-Themen 12
D Eine Forschleife mit Threads abarbeiten um es zu schneller zu machen. Ist das möglich? Allgemeine Java-Themen 20
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
P Threads Parallelisierte DB-Abfragen mit variabler Anzahl an Threads Allgemeine Java-Themen 4
J Threads Threads Allgemeine Java-Themen 9
Viktim Threads Liste In unterschiedlichen Threads bearbeiten Allgemeine Java-Themen 23
E Threads Ausführung in Threads ist langsamer als ohne Threads Allgemeine Java-Themen 13
A Anzahl an Threads Systemweit Allgemeine Java-Themen 2
Tausendsassa Input/Output Problem mit der gleichzeitigen Ausgabe zweier Threads Allgemeine Java-Themen 8
S Alle Methodenaufrufe eines Threads notieren..? Allgemeine Java-Themen 7
M Threads JPanel eingeforen mit Threads Allgemeine Java-Themen 2
F Threads Allgemeine Java-Themen 6
F Threads Allgemeine Java-Themen 2
M Sinn von Threads? Allgemeine Java-Themen 1
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
L Abfragen ob Threads fertig Allgemeine Java-Themen 3
P Threads Java Zugreifen Allgemeine Java-Themen 6
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
K KeyEvent in Threads Allgemeine Java-Themen 11
V Threads Weshalb funktionieren meine Threads nicht? Allgemeine Java-Themen 2
Thallius Speicherverhalten von Properties und mehreren Threads Allgemeine Java-Themen 5
L Threads beenden Allgemeine Java-Themen 4
P Threads Threads nicht gleichzeitig starten Allgemeine Java-Themen 3
S Threads Threads werden nicht beendet Allgemeine Java-Themen 2
S Start des zweiten Threads erst nach Beenden des ersten Threads Allgemeine Java-Themen 13
N Threads statische Methoden in Threads Allgemeine Java-Themen 5
P 4 Threads in einer Methode Allgemeine Java-Themen 2
M Eclipse Mehrere Threads, mehrere Konsolen Allgemeine Java-Themen 4
OnDemand Threads und synchronized Allgemeine Java-Themen 9
R LinkedList und Threads: Strukturprobleme bez. löschen von Elementen Allgemeine Java-Themen 3
R LinkedList und Threads - welche Methode ist besser? Allgemeine Java-Themen 2
OnDemand Threads und synvhronized Allgemeine Java-Themen 2
S Problem mit Threads Allgemeine Java-Themen 1
W Threads Threads warten lassen Allgemeine Java-Themen 5
H Optimierung durch Threads Allgemeine Java-Themen 31
B Threads halten sich irgendwie auf... Allgemeine Java-Themen 6
M Threads Allgemeine Java-Themen 8
K JNI: Methoden aus unterschiedlichen Threads aufrufen Allgemeine Java-Themen 3
A Applet Alle Threads beim schließen des Applets beenden Allgemeine Java-Themen 8
A Problem mit der Synchronisierung von Threads Allgemeine Java-Themen 15
R SecurityManager für einzelne Klassen/Threads? Allgemeine Java-Themen 38
O Threads und If Befehle Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben