L'histoire de l'oubli de fermer un fichier en Java et de l'échec

introduction

Je suis l'idiot qui fait Java depuis des années et qui a oublié de fermer et qui a causé une erreur.

Problèmes survenus

Lors de la réalisation de tests de charge continue sur un serveur en cours de développement, le comportement de l'application est devenu étrange avec le temps. Il n'y avait aucun problème avec le processeur ou l'utilisation de la mémoire, et la cause restait inconnue, mais si je la laissais pendant une semaine ou deux, l'application mourait avec une erreur du type "Impossible d'ouvrir le fichier plus" dans le journal. .. Après cela, lorsque l'application a vérifié le nombre de descripteurs de fichiers ouverts, il a été confirmé que le nombre maximum de descripteurs de fichiers pouvant être ouverts par processus était atteint.

Code en question

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

Le code en question est ci-dessus. Une méthode qui renvoie une liste de noms de fichiers dans un répertoire en utilisant l'API Stream, mais le répertoire ouvert par Files.list () n'est pas fermé. Même si j'oublie de fermer, je pense que la mémoire elle-même sera libérée par GC, mais les descripteurs de fichiers ne seront pas publiés, donc le nombre de descripteurs de fichiers continuera à augmenter à chaque exécution. Au fait, lorsque vous utilisez Eclipse pour l'environnement de développement (classe Scanner, etc.), si vous oubliez de fermer dans l'instance de la classe qui ouvre le fichier, cela vous avertira, mais (à partir d'Eclipse 4.7) le code ci-dessus ne vous avertira pas. Pourquoi……

Code modifié

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

J'ai essayé de le fermer correctement. L'augmentation des descripteurs de fichiers ne se produit plus et l'application fonctionne correctement.

en conclusion

Leçons ci-dessous

Recommended Posts

L'histoire de l'oubli de fermer un fichier en Java et de l'échec
L'histoire de l'écriture de Java dans Emacs
Obtenez l'URL publique du fichier privé de Flickr en Java
Comment obtenir la longueur d'un fichier audio avec Java
[Exemple d'amélioration de Java] Expérience d'apprentissage de Java en 2 mois et de changement de poste en programmeur
Je veux trouver la somme de contrôle MD5 d'un fichier en Java et obtenir le résultat sous forme de chaîne de caractères en notation hexadécimale.
L'histoire de la comparaison de chaînes de bas niveau en Java
L'histoire de la fabrication d'un Othello ordinaire à Java
Une histoire sur le JDK à l'ère de Java 11
L'histoire de l'apprentissage de Java dans la première programmation
Mesurer la taille d'un dossier avec Java
Histoire d'essayer de faire fonctionner le fichier JAVA
Comment savoir quelle version Java d'un fichier de classe a été compilée
Exemple de programme qui renvoie la valeur de hachage d'un fichier en Java
Comment obtenir le chemin absolu d'un répertoire s'exécutant en Java
Comment compresser un fichier JAVA CSV et le gérer dans un tableau d'octets
[Java] Récupère le fichier dans le fichier jar quel que soit l'environnement
Classes et instances Java comprises dans la figure
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Comment convertir un fichier en tableau d'octets en Java
[Android 9.0 Pie Java] Implémentez setOnTouchListener dans la marge de RecyclerView et fermez le clavier virtuel
[Java] Informations entières des caractères du fichier texte acquises par la méthode read ()
Comment enregistrer des fichiers avec l'extension spécifiée sous le répertoire spécifié en Java dans la liste
Exemple de code pour attribuer une valeur dans le fichier de propriétés à un champ du type attendu
Créer un servlet Java et un fichier WAR JSP à déployer sur Apache Tomcat 9 avec Gradle
Générer et exécuter le fichier Jar du fichier Java appartenant au package
Une explication rapide des cinq types de statique Java
J'ai essayé de résumer les bases de kotlin et java
20190803_Java & k8s sur Azure L'histoire d'aller au festival
Commande pour vérifier le nombre et l'état des threads Java
Activez la cellule A1 de chaque feuille de fichier Excel avec Java
Créer une méthode pour renvoyer le taux de taxe en Java
Comment développer et enregistrer une application Sota en Java
Comment dériver le dernier jour du mois en Java
J'ai créé un client RESAS-API en Java
L'histoire de la transmission de Java à Heroku à l'aide du pipeline BitBucket
Lorsque je suis passé à IntelliJ, il y avait une grande différence dans l'encodage du fichier de propriétés.
[Édition Java] Histoire de la sérialisation
L'histoire du transfert d'un conteneur Docker vers le registre de packages GitHub et Docker Hub avec des actions GitHub
Un programme (Java) qui génère la somme des nombres pairs et impairs dans un tableau
Considérer l'adoption du langage Java à l'ère Reiwa ~ Comment choisir un SDK sûr
Décompressez le fichier zip en Java
Comment écrire des commentaires dans le fichier de définition de schéma dans GraphQL Java et les refléter dans GraphiQL et GraphQL Playground
Enregistrer la sortie dans un fichier en Java
Je veux obtenir une liste du contenu d'un fichier zip et sa taille non compressée
L'histoire de la création d'une version Java du serveur Minecraft avec GCP (et également de la création d'une liste blanche)
Une histoire qui a résolu le problème que la version Java (jdk) était trop élevée pour utiliser la bibliothèque h2o dans R and R Studio.
[Java] Divers résumés joints aux chefs de classe et aux membres
Il ne répond pas à la description en .js du fichier packs
[Java] Obtenez les dates des derniers lundi et dimanche dans l'ordre
Fixez le nom du fichier de guerre à celui défini dans Maven
Une histoire sur l'utilisation de l'API League Of Legends avec JAVA
La milliseconde définie dans /lib/calendars.properties de Java jre est UTC
Convertir un tableau de chaînes en une liste d'entiers en Java
Lire les 4 premiers octets du fichier de classe Java et générer CAFEBABE
Ajouter un horodatage au nom de fichier JAR dans Gradle
De Java naissant (3 ans) à Node.js (4 ans). Et l'impression de retourner à Java
J'ai essayé de résumer les méthodes de Java String et StringBuilder
[Java] Renvoie un fichier de nom japonais dans le nom de fichier dans l'en-tête HTTP