Утечка дескриптора файла в программе Java: слишком много открытых файлов

У меня есть программа, которая страдает от увеличения файлового дескриптора. Я вижу, когда я выполняю команду ls -l /proc/5969/fd, где 5969 — это pid программы 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]

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


person zacky    schedule 24.10.2010    source источник


Ответы (2)


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

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

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

person riwalk    schedule 24.10.2010
comment
Он связывает не просто номера портов. В UNIX/Linux процессу разрешается открывать только определенное количество fd (файловых дескрипторов), будь то файл fd, fd сокета, fd канала или что-то еще. - person Stephen C; 25.10.2010
comment
Я не уверен, что использую сокет и что у меня заблокированы номера портов. - person zacky; 26.10.2010
comment
Вы знаете способ увидеть, какие открытые файлы остаются открытыми, чтобы увидеть, где я позволяю открывать вещи? - person zacky; 26.10.2010
comment
@zacky, тебе нужно прочитать мой пост. Нет открытых файлов. Независимо от того, используете ли вы стороннюю библиотеку или занимаетесь каким-либо сетевым программированием, факт остается фактом: судя по тому, что вы опубликовали, нет открытых файлов. - person riwalk; 26.10.2010
comment
хорошо, но если вы говорите мне, что открытые файлы являются сокетами, а не файлами, то как я могу увидеть, какой это URL-адрес сокета? Мне нужно понять, где моя программа протекает - person zacky; 29.10.2010
comment
@zacky, исследуй сокеты unix. Пожалуйста. Они работают с портами, а не с URL-адресами. У вас есть все необходимое, чтобы найти ответ. - person riwalk; 29.10.2010
comment
хорошо, так что поворотом было бы иметь команду закрыть все открытые открытые сокеты. есть ли команда в ubuntu для этого? - person zacky; 02.11.2010

Пытаться

# lsof -p <pid>

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

person krisso    schedule 18.12.2010