67 votes

Trop de fichiers ouverts: combien sont ouverts, ce qu'ils sont, et combien peut ouvrir la JVM

Je suis confronté à l'exception java.io.FileNotFoundException: (Too many open files) et de chercher les moyens de le résoudre. Cette erreur indique évidemment que la JVM a alloué trop de poignées et de l'OS sous-jacent ne le laissera pas en avoir plus. Soit j'ai une fuite quelque part avec mal fermé connexions/flux ou autres joyeusetés.., ou la JVM est stressée - nous parlons d'un processus serveur qui s'exécute pour les jours non-stop et finalement se dessèche. Il se produit à plusieurs reprises après 12 à 14 jours de temps de fonctionnement.

J'ai triple vérifié le code et n'a trouvé aucune fuites apparentes. Il y a cependant des bibliothèques tierces qui sont largement utilisés tels que l'e-mail, le quartz, les planificateurs, hibernate et quelques autres.

Maintenant.. Comment voulez-vous lutter contre cela? Est-il possible d'obtenir une liste de descripteurs dans la JVM ou de la piste lorsqu'il atteint un certain montant? Je serais ravi de les imprimer et de voir comment il se développe, et quand. Je ne peux pas utiliser un profiler parce que c'est un système de production et ont de la difficulté à le reproduire en développement. Toute suggestion?

MODIFIER

OK, j'ai reçu quelques très utiles, merci les gars! Mais encore.. Ce que je suis en train d'essayer de comprendre est de savoir si c'est possible pour la JVM de savoir combien de poignées, il peut ouvrir, combien d'entre eux sont déjà ouverts, et, éventuellement, quels sont-ils. Par exemple, je suis de surveillance gratuit de la taille du segment et en déclenchant une "alarme" quand il approche de 1% du total spécifié-Xmx. Je sais aussi que si mon thread nombre de coups au-dessus de 500, alors quelque chose va certainement sortir de la main. Maintenant, est-il un moyen de savoir que mon JVM alloue trop de poignées à partir de l'OS et ne leur donne pas de retour, par exemple, les sockets, les fichiers ouverts, etc. Si j'avais su cela, je voudrais savoir où chercher et quand.

EDIT-2 J'ai réussi à trouver quelque chose de suspect, peut-être cela pourrait être une raison pour que les ressources des fuites. C'est à propos de log4j Récepteurs de colis. Son support récepteur a une très poilue bug dans la gestion de la accepté de sockets. Il conserve tous accepté de sockets dans un vecteur en lançant un thread séparé pour communiquer vers le point de fin. Lorsqu'un client met fin à la connexion, le thread meurt, mais la prise de l'instance reste dans le récepteur vecteur pour toujours. Que, bien sûr, s'accumulent dans le temps. Mais je ne suis toujours pas sûr si socket fermée encore alloue de l'OS de la poignée...

33voto

bramp Points 3769

Vous n'avez pas dit quel système d'exploitation vous êtes en cours d'exécution sur, mais si vous utilisez Linux, vous pouvez utiliser la commande lsof

lsof -p <pid of jvm>

Qui liste tous les fichiers ouverts par la JVM. Ou si vous utilisez Windows, vous pouvez Process Explorer qui affiche tous les fichiers ouverts pour tous les processus.

En faisant cela, vous nous l'espérons vous permettent d'affiner ce qui bits du code est de garder les fichiers ouverts.

24voto

phisch Points 1557

Puisque vous êtes sur Linux, je suggère que vous vérifiez le fichier /proc système de fichiers. À l'intérieur de proc, vous trouverez un dossier avec le PID de votre processus contenant un dossier calld 'fd'. Si votre id de processus est 1234, le chemin est d'être

/proc/1234/fd

À l'intérieur de ce dossier, vous trouverez des liens vers tous les fichiers ouverts (faire un "ls -l"). Habituellement, vous pouvez dire par le nom de fichier de la bibliothèque / code peut ouvrir et ne pas fermer le fichier.

10voto

gaboroncancio Points 67

Vous pouvez modifier la limite de fichiers ouverts par adjonction d' /etc/security/limits.conf:

* soft nofile 2048 # Set the limit according to your needs
* hard nofile 2048

Ensuite, vous pouvez recharger la configuration à l'aide d' sysctl -p sur la coque. Vérifiez cet article.

Juste pour être complet, vous pouvez vérifier quelle est la limite actuelle pour les fichiers ouverts à l'aide de: ulimit -n

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X