JVM Je reçois cette exception en Java:Trop de fichiers ouverts: combien sont ouverts, ce qu'ils sont, et combien peuvent l'ouvrir
java.io.FileNotFoundException: (Too many open files)
Je cherche les moyens d'éliminer cette problème.
Cette erreur indique clairement que JVM a alloué trop de handles et que le système d'exploitation sous-jacent ne lui en laissera pas plus. Soit j'ai une fuite quelque part avec des connexions/flux mal fermés.
Ce processus s'exécute pendant des jours non-stop et lève finalement l'exception. Il arrive à plusieurs reprises après 12-14 jours de temps de fonctionnement.
Comment combattez-vous cela? Existe-t-il un moyen d'obtenir une liste des poignées allouées dans la JVM ou la piste quand elle atteint un certain montant? J'aimerais les faire imprimer et voir comment ça grandit et quand. Je ne peux pas utiliser un profileur parce que c'est un système de production et qu'il est difficile de le reproduire en développement. Toute suggestion? Je surveille la taille du tas libre et déclenche une "alarme" quand elle approche 1% du total spécifié en -Xmx. Je sais aussi que si le nombre de threads dépasse 500, alors quelque chose ne va plus. Maintenant, est-il un moyen de savoir que mon JVM alloue trop de poignées de OS et ne les rend pas, par exemple. des sockets, des fichiers ouverts, etc. Si j'avais su cela, je saurais où chercher et quand.
Pouvez-vous fournir plus des informations sur la JVM et l'OS? Aussi, je suggère que vous fassiez plus d'efforts pour reproduire ceci dans un environnement de développement. Cela peut être compliqué, mais lorsque vous rencontrez un tel problème, essayer d'observer et de signaler un système de production prend plus de temps. – Timothy
Cela arrive souvent sur des Linux qui sont virtualisés et nous n'avons pas vraiment l'option de reproduire ceci en exécutant 2 semaines de tests lourds. Je n'ai pas vu cela se produire sur les boîtes de fenêtres cependant. Vous avez raison, il est préférable de l'attraper en développement, mais je voudrais aussi avoir une certaine capacité intégrée dans le serveur lui-même pour l'auto-surveillance pour l'avenir. – Dima
RE votre modification. Je ne pense pas que la JVM puisse vous dire comment les fichiers ont été ouverts. Cela pourrait être une fonctionnalité intéressante pour Sun, mais d'ici là, vous devrez utiliser un processus externe pour vous le dire. Si vous en avez vraiment besoin dans la JVM, écrivez du code qui exécute lsof et renvoie le résultat. En outre, la limite des fichiers ouverts peut être modifiée. Par exemple, sous Linux, vous pouvez modifier le fichier /etc/security/limits.conf. – bramp