2010-04-22 4 views
1

J'ai un code multithread qui doit générer un ensemble d'objets et les écrire dans un fichier. Quand je l'exécute, je reçois parfois le message "Trop de fichiers ouverts" dans Exception. J'ai vérifié le code pour m'assurer que tous les flux de fichiers sont fermés correctement. Voici la trace de la pile. Lorsque je fais ulimit -a, les fichiers ouverts autorisés sont définis sur 1024. Nous pensons que l'augmentation de ce nombre n'est pas une option/solution viable.Trop de fichiers ouverts dans une routine java

[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) 

Maintenant que nous avons identifié jusqu'à présent en regardant attentivement la liste des fichiers ouverts est que la machine virtuelle ouvre même fichier de classe plusieurs fois.

/export/BaseEvent.class 236

60 /export/EventType1BaseEvent.class /export/EventType2BaseEvent.class 48

30 /export/EventType2.class /export/EventType1.class 14

Lorsque BaseEvent fait partie de toutes les classes et que EventType1 et EventType2 héritent respectivement de EventType1BaseEvent et EventType2BaseEvent. Pourquoi un chargeur de classe chargerait-il le même fichier de classe plus de 200 fois? Il semble qu'il ouvre la classe de base autant de fois qu'il crée une instance enfant.

Est-ce normal? Peut-il être géré autrement que par l'augmentation du nombre de fichiers ouverts?

Répondre

1

Faites-vous quelque chose de spécial avec les chargeurs de classe? Si vous faisiez quelque chose d'intéressant comme avoir un chargeur de classe par thread, vous pourriez avoir chaque chargeur qui lit le fichier de classe.

+0

Nous utilisons la bave, je dois regarder comment ClassLoader est utilisé dans les baves. –

+0

Oui, nous avons regardé à travers le profileur et il semble que DROOLS utilise tous les nouveaux chargeurs de classe pour une même raison. Donc je suppose que nous allons maintenant plonger dans la façon dont nous devrions changer la façon dont nous utilisons les drools afin qu'il ne lance pas tant de chargeurs de classe. –

0

La seule façon de savoir où cela se produirait serait de créer une nouvelle instance de chargeur de classes pour chaque instance de votre classe. Etes-vous sûr de ne pas faire autre chose d'étrange?

Questions connexes