2010-10-24 16 views
2

J'ai un programme qui souffre de l'augmentation du descripteur de fichier. Je vois quand j'exécute la commande ls -l/proc/5969/fd où 5969 est le pid du programme java le nombre de descripteur de fichier augmentant continuellement. mais je suis incapable d'ouvrir un de ces fichiers decriptors pour voir ce fichier reste ouvert: ici est un exemple de l'annonce:fuite de descripteur de fichier dans le programme java: trop de fichiers ouverts

lrwx------ 1 root root 64 oct 24 16:08 52295 -> socket:[2577706264] 
lrwx------ 1 root root 64 oct 24 16:08 52296 -> socket:[2579543392] 
lrwx------ 1 root root 64 oct 24 16:08 52297 -> socket:[2578760962] 

S'il vous plaît me aider à trouver un moyen de résoudre cette fuite de descripteur de fichier à savoir ce que les fichiers restent ouverts et augmentent le numéro du descripteur de fichier.

Répondre

4

Eh bien, à partir d'une observation rapide, vous utilisez les descripteurs de fichiers sur les sockets, pas des fichiers

Dans UNIX, les fichiers et les sockets utiliser des descripteurs de fichiers, et si vous avez un problème où vous ne fermons pas les sockets que vous ouvrir. Par conséquent, vous ne laissez pas un fichier ouvert mais laissez en réalité les numéros de port bloqués par d'autres programmes.

+1

Ce ne sont pas * simplement * les numéros de port qu'il fixe. Sous UNIX/Linux, un processus n'est autorisé à avoir qu'un certain nombre de fd (descripteurs de fichiers) ouverts, qu'il s'agisse de fichiers fd, socket fd, pipe fd ou autre. –

+0

Je ne suis pas sûr que j'utilise socket et que j'ai les numéros de port verrouillés. – zacky

+0

savez-vous un moyen de voir quels sont les fichiers ouverts restant ouverts pour voir où je laisse les choses ouvertes? – zacky

3

Essayez

# lsof -p <pid> 

listera tous ouverts par id processus 'fichiers', peut vous montrer l'IP/port du socket a été attachée. Si votre programme est côté client, vous êtes probablement déconnecté par TCP RST et ne nettoyez pas correctement le descripteur de fichier.