2010-04-22 1 views
1

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

Когда я делаю 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) 

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

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

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

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

ответ

1

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

+0

Мы используем drool, я должен посмотреть, как ClassLoader используется в drools. –

+0

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

0

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

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

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

  • Нет связанных вопросов^_^