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

Langage Java Discussion :

Taille de JVM


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 10
    Par défaut Taille de JVM
    Bonjour,

    En fait dans mon code java j'appelle un script avec Rutime.exec("commande")
    J'ai l'exception suivante :

    java.io.IOException: Not enough space
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:52)
    at java.lang.Runtime.execInternal(Native Method)
    at java.lang.Runtime.exec(Runtime.java:566)

    J'ai pu corriger ça en augmentant la taille de mon espace swap car en effet le runtime.exec fork le process et la nouvelle jvm a la même taille que la jvm mère.
    Le problème c'est que la taille de ma jvm est de 2G et je trouve que c'est vraiment con de perdre 2G de mémoire pour executer le petit script.

    Auriez vous une idée pour contourner ce problème ?

    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 10
    Par défaut
    personne n'a une idée??

  3. #3
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 766
    Par défaut
    Je pense que c'est plus ton programme qu'il faut revoir que le système sur lequel il tourne.
    Ca parait plus logique en tout cas.

  4. #4
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par nicorama Voir le message
    Je pense que c'est plus ton programme qu'il faut revoir que le système sur lequel il tourne.
    Ca parait plus logique en tout cas.
    Au contraire je pense que le problème vient du système...

    Généralement sous les systèmes Unix on utilise fork() puis exec() pour lancer un nouveau processus :
    • fork() duplique le processus courant afin de créer un nouveau processus.
    • exec() remplace le processus courant par un autre programme.


    Le problème vient du fait que le fork() copie l'intégralité du processus courant, et comme dans son cas l'application occupe 2Go le nouveau processus en occupera aussi 2Go, mais seulement entre le fork() et le exec()... ce qui provoque le "Not enough space"



    Normalement sous Linux ce problème ne devrait pas avoir lieu, puisque fork() ne fonctionne pas exactement de la même manière (il crée un nouveau process mais ne duplique pas la mémoire de suite, mais seulement lors de la première écriture dans la mémoire), ce qui permet de faire un fork()+exec() sans exploser la mémoire...


    Normalement il existe les appels systèmes vfork() et/ou posix_spawn() qui évite cette copie de mémoire...

    Plus d'info sur le sujet : http://developers.sun.com/solaris/ar...ubprocess.html

    Il faudrait savoir la version de ton OS et de ta JVM.

    Et comme solutions tu pourrais :
    • Vérifier s'il n'existe pas une JVM plus récente pour ton système qui corrigerait ce problème.
    • Utiliser JNI pour appeler une méthode native qui utiliserait vfork() ou posix_spawn() pour lancer ta commande (attention car il faut quand même de bonne base de programmation système en C).
    • Te créer une application serveur minimum qui se chargera de lancer les processus (ex: tu recois la commande par socket et tu lances le programme).



    Bon courage...

    a++

  5. #5
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 766
    Par défaut
    Houla, ca me dépasse Bon courage, il semble y avoir une solution.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 10
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    Au contraire je pense que le problème vient du système...

    Généralement sous les systèmes Unix on utilise fork() puis exec() pour lancer un nouveau processus :
    • fork() duplique le processus courant afin de créer un nouveau processus.
    • exec() remplace le processus courant par un autre programme.


    Le problème vient du fait que le fork() copie l'intégralité du processus courant, et comme dans son cas l'application occupe 2Go le nouveau processus en occupera aussi 2Go, mais seulement entre le fork() et le exec()... ce qui provoque le "Not enough space"



    Normalement sous Linux ce problème ne devrait pas avoir lieu, puisque fork() ne fonctionne pas exactement de la même manière (il crée un nouveau process mais ne duplique pas la mémoire de suite, mais seulement lors de la première écriture dans la mémoire), ce qui permet de faire un fork()+exec() sans exploser la mémoire...


    Normalement il existe les appels systèmes vfork() et/ou posix_spawn() qui évite cette copie de mémoire...

    Plus d'info sur le sujet : http://developers.sun.com/solaris/ar...ubprocess.html

    Il faudrait savoir la version de ton OS et de ta JVM.

    Et comme solutions tu pourrais :
    • Vérifier s'il n'existe pas une JVM plus récente pour ton système qui corrigerait ce problème.
    • Utiliser JNI pour appeler une méthode native qui utiliserait vfork() ou posix_spawn() pour lancer ta commande (attention car il faut quand même de bonne base de programmation système en C).
    • Te créer une application serveur minimum qui se chargera de lancer les processus (ex: tu recois la commande par socket et tu lances le programme).



    Bon courage...

    a++

    Merci beaucoup pour ton aide,
    J'utilise Java 1.4 sur solaris 9
    tes explications m'ont été d'une grande aide. Pour l'instant je vais garder quand même mon code en augmentant la taillle de ma mémoire swap.

    thx

Discussions similaires

  1. Augmenter la taille de JVM dans le fichier catalina.bat de Tomcat
    Par masterboy01 dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 08/11/2010, 12h02
  2. applet et taille de JVM
    Par biozaxx dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 18/01/2008, 12h29
  3. Taille mémoire JVM
    Par javaDev dans le forum Général Java
    Réponses: 3
    Dernier message: 15/03/2006, 17h52
  4. [JVM]taille maximun memoire de la JVM
    Par madmens dans le forum Général Java
    Réponses: 8
    Dernier message: 30/11/2005, 06h46
  5. [JVM] Connaitre la taille mémoire utilisé par les dif classe
    Par sur_uix dans le forum Général Java
    Réponses: 4
    Dernier message: 18/09/2003, 09h17

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