2010-10-24 2 views
2

У меня есть программа, которая страдает от увеличения дескриптора файла. Я вижу, когда я выполняю команду ls -l/proc/5969/fd, где 5969 является pid программы java, количество файловых дескрипторов непрерывно увеличивается. , но я не могу открыть один из этих файлов decriptors, чтобы увидеть, что файл остается открытым: вот пример листинга:утечка дескриптора файла в программе java: слишком много открытых файлов

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] 

Пожалуйста, помогите мне найти способ, чтобы решить этот файл утечки дескриптора, зная, что файлы остаются открытыми и увеличивают номер дескриптора файла.

ответ

4

Ну, от быстрого наблюдения, вы используете файловые дескрипторы на гнезда, а не файлы

В UNIX, как файлы и сокеты использовать дескрипторы файлов, и поэтому у вас есть проблема, когда вы не закрывая сокеты, которые вы открытый.

В результате вы не оставляете файл открытым, но фактически оставляете номера портов заблокированными от использования другими программами.

+1

Это не * просто * номера портов, которые он связывает. В UNIX/Linux процессу разрешено открывать только определенное количество файловых дескрипторов fd, будь то файлы fd, socket fd, pipe fd или что угодно. –

+0

Я не уверен, что использую сокет и что у меня заблокированы номера портов. – zacky

+0

Знаете ли вы, как открыть открытые файлы, чтобы открыть, где я открываю? – zacky

3

Попробуйте

# lsof -p <pid> 

перечислит все файлы «» открыт идентификатор процесса, может показать вам IP/порт, разъем был привязан. Если ваша программа является клиентской, вы, вероятно, отключите TCP RST и не очистите дескриптор файла.

Смежные вопросы