Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern

Einführung

Ich bin der Idiot, der seit Jahren Java macht und vergessen hat zu schließen und einen Fehler verursacht hat.

Probleme, die aufgetreten sind

Bei der Durchführung kontinuierlicher Auslastungstests auf einem in der Entwicklung befindlichen Server wurde das Verhalten der Anwendung im Laufe der Zeit merkwürdig. Es gab kein Problem mit der CPU- oder Speichernutzung, und die Ursache blieb unbekannt. Wenn ich sie jedoch ein oder zwei Wochen lang verließ, starb die Anwendung mit einem Fehler wie "Datei kann nicht mehr geöffnet werden" im Protokoll. .. Nachdem die Anwendung die Anzahl der geöffneten Dateideskriptoren überprüft hatte, wurde bestätigt, dass die maximale Anzahl der pro Prozess geöffneten Dateideskriptoren erreicht wurde.

Code in Frage

return Files.list(Paths.get(dirPathStr)).map(path -> path.getFileName().toString())
            .collect(Collectors.toSet());

Der betreffende Code ist oben. Eine Methode, die mithilfe der Stream-API eine Liste von Dateinamen in einem Verzeichnis zurückgibt, das von Files.list () geöffnete Verzeichnis jedoch nicht geschlossen wird. Selbst wenn ich vergesse zu schließen, denke ich, dass der Speicher selbst von GC freigegeben wird, die Dateideskriptoren jedoch nicht freigegeben werden, sodass die Anzahl der Dateideskriptoren bei jeder Ausführung weiter zunimmt. Wenn Sie Eclipse für die Entwicklungsumgebung (Scannerklasse usw.) verwenden und vergessen, die Instanz der Klasse zu schließen, die die Datei öffnet, werden Sie gewarnt, aber (ab Eclipse 4.7) der obige Code warnt Sie nicht. Warum……

Geänderter Code

try (Stream<Path> paths = Files.list(Paths.get(dirPathStr))) {
	return paths.map(path -> path.getFileName().toString()).collect(Collectors.toSet());
}

Ich habe versucht, es richtig zu schließen. Die Zunahme der Dateideskriptoren tritt nicht mehr auf und die Anwendung funktioniert einwandfrei.

abschließend

Lektionen unten

Recommended Posts

Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
Die Geschichte des Schreibens von Java in Emacs
Rufen Sie die öffentliche URL der privaten Datei von Flickr in Java ab
So ermitteln Sie die Länge einer Audiodatei mit Java
[Beispiel für eine Java-Verbesserung] Erfahrung mit dem Erlernen von Java in 2 Monaten und dem Wechsel von Jobs zu einem Programmierer
Ich möchte die MD5-Prüfsumme einer Datei in Java finden und das Ergebnis als Zeichenfolge in hexadezimaler Notation erhalten.
Die Geschichte des einfachen String-Vergleichs in Java
Die Geschichte eines gewöhnlichen Othello in Java
Eine Geschichte über das JDK in der Java 11-Ära
Die Geschichte des Lernens von Java in der ersten Programmierung
Messen Sie die Größe eines Ordners mit Java
Die Geschichte des Versuchs, JAVA File zu bedienen
So finden Sie heraus, welche Java-Version der Klassendatei kompiliert wurde
Beispielprogramm, das den Hashwert einer Datei in Java zurückgibt
So ermitteln Sie den absoluten Pfad eines in Java ausgeführten Verzeichnisses
So komprimieren Sie eine JAVA-CSV-Datei und verwalten sie in einem Byte-Array
[Java] Holen Sie sich die Datei unabhängig von der Umgebung in das JAR
In der Abbildung verstandene Java-Klassen und -Instanzen
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
So konvertieren Sie eine Datei in ein Byte-Array in Java
[Android 9.0 Pie Java] Implementieren Sie setOnTouchListener am Rand von RecyclerView und schließen Sie die Softtastatur
[Java] Ganzzahlige Informationen von Zeichen in der Textdatei, die mit der Methode read () erfasst wurden
Speichern von Dateien mit der angegebenen Erweiterung unter dem in Java angegebenen Verzeichnis in der Liste
Beispielcode zum Zuweisen eines Werts in der Eigenschaftendatei zu einem Feld des erwarteten Typs
Erstellen Sie ein Java-Servlet und eine JSP-WAR-Datei für die Bereitstellung auf Apache Tomcat 9 mit Gradle
Generieren und Ausführen der Jar-Datei der zum Paket gehörenden Java-Datei
Eine kurze Erklärung der fünf Arten von Java Static
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
20190803_Java & k8s on Azure Die Geschichte vom Festivalbesuch
Befehl zum Überprüfen der Anzahl und des Status von Java-Threads
Aktivieren Sie die Zelle A1 jeder Excel-Datei mit Java
Erstellen Sie eine Methode, um den Steuersatz in Java zurückzugeben
So entwickeln und registrieren Sie eine Sota-App in Java
So leiten Sie den letzten Tag des Monats in Java ab
Ich habe einen RESAS-API-Client in Java erstellt
Die Geschichte, Java mithilfe der BitBucket-Pipeline nach Heroku zu bringen
Als ich zu IntelliJ wechselte, gab es einen großen Unterschied in der Codierung der Eigenschaftendatei.
[Java Edition] Geschichte der Serialisierung
Die Geschichte, wie ein Docker-Container mit GitHub-Aktionen in die GitHub-Paketregistrierung und den Docker-Hub verschoben wird
Ein Programm (Java), das die Summe von ungeraden und geraden Zahlen in einem Array ausgibt
In Anbetracht der Einführung der Java-Sprache in der Reiwa-Ära ~ Auswahl eines sicheren SDK
Entpacken Sie die Zip-Datei in Java
So schreiben Sie Kommentare in die Schemadefinitionsdatei in GraphQL Java und spiegeln sie in GraphiQL und GraphQL Playground wider
Protokollausgabe in Datei in Java
Ich möchte eine Liste des Inhalts einer Zip-Datei und ihrer unkomprimierten Größe erhalten
Die Geschichte des Erstellens einer Java-Version des Minecraft-Servers mit GCP (und dem Festlegen einer weißen Liste)
Eine Geschichte, die das Problem löste, dass die Java (jdk) -Version zu hoch war, um die H2O-Bibliothek in R und R Studio zu verwenden.
[Java] Verschiedene Zusammenfassungen an die Leiter von Klassen und Mitgliedern
Es reagiert nicht auf die Beschreibung in .js der Packs-Datei
[Java] Ordnen Sie die Daten des vergangenen Montags und Sonntags der Reihe nach an
Korrigieren Sie den Namen der Kriegsdatei auf den in Maven festgelegten
Eine Geschichte über das Erreichen der League Of Legends-API mit JAVA
Die in /lib/calendars.properties von Java jre festgelegte Millisekunde ist UTC
Verwandeln Sie ein Array von Strings in eine Liste von Ganzzahlen in Java
Lesen Sie die ersten 4 Bytes der Java-Klassendatei und geben Sie CAFEBABE aus
Fügen Sie dem JAR-Dateinamen in Gradle einen Zeitstempel hinzu
Vom jungen Java (3 Jahre) bis zu Node.js (4 Jahre). Und der Eindruck, nach Java zurückzukehren
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
[Java] Gibt eine japanische Namensdatei im Dateinamen im HTTP-Header zurück