IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Lecture de properties - Too many open files


Sujet :

Collection et Stream Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Points : 19
    Points
    19
    Par défaut Lecture de properties - Too many open files
    Bonjour,

    j'aurais besoin d'aide pour résoudre un problème au chargement des properties d'une appli J2EE. J'ai une classe Configurateur qui étend Properties et qui charge les fichiers de properties à partir de leur url avec cette instruction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.load(url.openStream());
    La modification des properties est prise à chaud donc je scrute périodiquement les fichiers de config, et au bout d'un moment j'obtiens cette erreur:

    java.io.FileNotFoundException: "Nom du fichier" (Too many open files)

    Visiblement il y a saturation du descripteur de fichier. Est-il nécessaire de faire quelque chose de particulier pour refermer correctement les fichiers après leur lecture?

    Merci d'avance si vous pouvez m'aider.

  2. #2
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    Bonjour.

    Oui !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    InputStream in = null;
    try {
       in = url.openStream();
       this.load(in);
    } finally {
       if (in != null) {
         in.close();
       }
    }
    (Sans oublier la gestion des IOException, ce qui dépend de la signature de la méthode).

    Yann

  3. #3
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2006
    Messages : 503
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour,

    Il y a très longtemps, vraiment très longtemps, avant que le C++ existe, je me souviens d'avoir dû recompiler le Kernel Linux pour augmenter le nombre de file descriptor. C'est soit un problème d'OS ou de ton application (serveur j'imagine, qui a trop de fichiers ou de sockets ouverts, ou tu as laissé des streams non fermés dans des objets qui sont encore en utilisation).

    Tu as sans doute plusieurs centaines de file descriptor.
    Il faudrait essayer d'obtenir combien sont alloués.

    Il faudrait avoir plus de détails: application, OS, EJB, ...

  4. #4
    Membre éclairé Avatar de rberthou
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 612
    Points : 690
    Points
    690
    Par défaut
    salut,

    Si tu es sous Linux regarde la commande "ulimit -a" cela te donne pas mal d'informations sur ta configuration .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $ ulimit -a
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) unlimited
    scheduling priority             (-e) 0
    file size               (blocks, -f) unlimited
    pending signals                 (-i) 49152
    max locked memory       (kbytes, -l) 32
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 1024
    pipe size            (512 bytes, -p) 8
    POSIX message queues     (bytes, -q) 819200
    real-time priority              (-r) 0
    stack size              (kbytes, -s) 10240
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 49152
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited
    Cette commande te permet également de modifier ces données
    - Informaticien passionné
    - ( java, c++, cobol, php, asp, ... )
    - http://www.berthou.com/fr/

  5. #5
    Membre habitué Avatar de sewatech
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Points : 166
    Points
    166
    Par défaut
    Il me semble aussi que la variable d'environnement $MAX_FD peut être utile.

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,



    A moins que tu n'ai de très gros besoin qui t'oblige à ouvrir en simultanée un très grand nombre de fichier, tu ne devrais pas à modifier la limite système.

    Comme l'indique yann2, ton problème vient du fait que tu ne fermes pas tes flux, et donc tu augmentes petit à petit le nombre de fichier/ressources ouvertes...

    En les fermant proprement le problème disparaitra

    Citation Envoyé par yann2 Voir le message
    (Sans oublier la gestion des IOException, ce qui dépend de la signature de la méthode).
    Tu n'as pas besoin de gérer les null, et tu peux utiliser la syntaxe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    InputStream in = url.openStream(); // Si IOException rien n'est exécuté
    try {
       this.load(in);
    } finally {
       in.close();
    }
    Plus d'info dans la FAQ : Comment libérer proprement les ressources (ou comment utiliser proprement les bloc try/finally) ?


    a++

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Points : 19
    Points
    19
    Par défaut
    Effectivement, le problème est résolu avec la clause finally qui ferme le flux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    finally {
       in.close();
    }
    Merci à tous

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Je veux pas faire mon chieur mais juste pour eviter que une autre exception tu devrais plutot écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    finally {
       if(in != null){
          in.close();
       }
    }

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Non... Dans le code tel que je l'ai donné la variable in ne peut jamais être null dans le finally.

    A la rigueur si tu veux t'en assurer, le plus simple et lisible serait de déclarer la variable final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    final InputStream in = url.openStream(); // Si IOException rien n'est exécuté
    try {
       this.load(in);
    } finally {
       in.close();
    }

    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. IOError: [Errno 24] Too many open files -> Comment debugger ?
    Par Mistervanhalen dans le forum Général Python
    Réponses: 8
    Dernier message: 26/02/2009, 17h25
  2. [Tomcat 5.0.28] ZipException: Too many open files
    Par maloups dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 14/11/2008, 16h47
  3. Too many open files
    Par ppmaster dans le forum Weblogic
    Réponses: 1
    Dernier message: 11/09/2007, 14h17
  4. [Système] failed to open stream: Too many open files
    Par shamanlinks dans le forum Langage
    Réponses: 7
    Dernier message: 23/05/2006, 11h59
  5. Pb avec socket - too many open files
    Par be_tnt dans le forum Réseau
    Réponses: 16
    Dernier message: 17/05/2006, 10h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo