Debugging die "Zu viele Dateien geöffnet" Problem
Die Anwendung, die ich arbeite, plötzlich stürzte mit
java.io.IOException: ... Too many open files
Als ich verstehe das Problem, es bedeutet, dass Dateien geöffnet, aber nicht geschlossen.
Stacktrace natürlich passiert, nach der Tat und kann nur helfen, zu verstehen, was vor Ereignis Fehler aufgetreten.
Was wäre ein intelligenter Weg, um suchen Sie Ihre code-Basis zu finden, dieses Problem scheint nur auftreten, wenn app ist unter hoher Belastung.
- Sind Sie multi-threading, das Datei-handling, oder ist es alles der gleiche thread? Und haben Sie sich überlegt Parallelität Drosselung zu verwalten, die Arbeitsbelastung?
- Ich bin multi-threading-die Datei handling. Und das problem erscheint nur wenn ich mehrere threads. Ich habe eine Liste von jobs und nur spin up-die Anzahl der threads mit der Anzahl der Kerne auf dem Gerät (z.B. 4) es gibt also nur 4 threads verarbeiten der job-queue zu einem bestimmten Zeitpunkt. Und die jobs sind sehr schnell. Irgendwelche Ideen? Was ist Parallelität Drosselung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, der beste Weg, um ein Werkzeug zu verwenden, speziell für den Zweck, wie diese eine:
Ich glaube mich zu erinnern YourKit auch mit einigen Einrichtungen in der Nähe, aber finde keine konkreten Informationen im moment.
verwenden
lsof -p pid
zu überprüfen, was die Ursache des Lecks von Datei-Referenzen;verwenden
ulimit -n
zu sehen, die Grenze der geöffneten Datei verweist auf einen einzelnen Prozess;überprüfen Sie alle E /a-Ressourcen in Ihrem Projekt,sind Sie veröffentlichten in der Zeit?,Beachten Sie, dass
File
,Process
,Socket
(und Http-verbindungen) sind alle IO-Ressourcen.manchmal zu viele threads die dieses problem verursachen auch.
lsof -p pid
ich habe 3000 Dateien momentan geöffnet, während dieulimit -n
ist 2560. Wahrscheinlich der erste Befehl count etwas anderes als Datei-ReferenzenWelches OS? Wenn es linux/mac gibt es Informationen unter /proc das sollte helfen. Verwenden Sie unter Windows die Process Explorer.
So weit wie die Suche nach dem code-Basis, vielleicht für code, fängt oder hebt
IOException
- ich denke, I/O-Methoden, die schon catch/erhöhen diese haben eine hohe Wahrscheinlichkeit, dass eineclose()
nennen.Haben Sie versucht, die Befestigung an den Laufenden Prozess mit jvisualvm (Java 5.0 und höher in den JDK-bin-Verzeichnis). Sie können öffnen Sie den Laufenden Prozess und tun einen heap-dump (die, wenn Sie eine ältere JDK müssen Sie analysieren mithilfe von eclipse oder intellij oder netbeans et. al.).
Im JDK 7 die heap-dump-Taste unter dem "Monitor" - Registerkarte. Es wird ein heap-dump-Registerkarte "Klassen" sub-Registerkarte, können Sie überprüfen und sehen, ob irgendwelche Klassen, die geöffnete Dateien existieren in großen Mengen. Ein weiteres sehr nützliches feature ist die heap-dump vergleichen, so können Sie einen Referenz-heap-dump, lassen Sie Ihre app ausführen, ein wenig, und dann nehmen Sie eine andere heap-dump und die beiden vergleichen (der link zu vergleichen ist, die auf die "[heapdump]" Registerkarte erhalten Sie, wenn Sie eine nehmen. Es ist auch ein flag in java für einen heapdump über Absturz oder OOM-Ausnahme, Sie können gehen, dass die route, wenn der Vergleich heap-dumps nicht geben Sie eine offensichtliche Klasse, die das problem verursacht. Auch "Instanzen" - Tab in der heap-dump-diff wird Ihnen zeigen, was reserviert wurde in der Zeit zwischen den beiden heap-dumps, die können auch helfen.
jvisualvm ist ein tolles Werkzeug, das nicht genug erwähnt.