Слишком много открытых файлов в одной из моих программ Java - PullRequest
1 голос
/ 23 апреля 2010

У меня есть многопоточный код, который должен генерировать набор объектов и записывать их в файл. Когда я запускаю его, я иногда получаю сообщение «Слишком много открытых файлов» в «Исключении». Я проверил код, чтобы убедиться, что все файловые потоки закрыты должным образом. Вот трассировка стека.

Когда я выполняю ulimit -a, разрешено открывать файлы, равное 1024. Мы думаем, что увеличение этого числа не является приемлемым вариантом / решением.

 [java] java.io.FileNotFoundException: /export/event_1_0.dtd (Too many open files)
 [java]     at java.io.FileInputStream.open(Native Method)
 [java]     at java.io.FileInputStream.<init>(FileInputStream.java:106)
 [java]     at java.io.FileInputStream.<init>(FileInputStream.java:66)
 [java]     at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:70)
 [java]     at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:161)
 [java]     at java.net.URL.openStream(URL.java:1010)

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

/ export / BaseEvent.class 236
/export/EventType1BaseEvent.class 60
/export/EventType2BaseEvent.class 48
/export/EventType2.class 30
/export/EventType1.class 14

Где BaseEvent является составной частью всех классов, а EventType1 и EventType2 наследуют EventType1BaseEvent и EventType2BaseEvent соответственно. Почему загрузчик классов должен загружать один и тот же файл класса более 200 раз. Кажется, он открывает базовый класс столько раз, сколько он создает дочерний экземпляр.

Это нормально? Может ли это быть обработчик любым другим способом, кроме увеличения количества открытых файлов?

Ответы [ 2 ]

1 голос
/ 23 апреля 2010

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

0 голосов
/ 23 апреля 2010

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

Вы уверены, что не делаете что-то еще странное?

...