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

Java Discussion :

Problème mémoire pour commande externe


Sujet :

Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Problème mémoire pour commande externe
    Bonjour,
    J'utilise java sun 7 sous ubuntu 12.04

    J'ai créer grâce à java une pettite interface graphique pour que des utilisateurs entrent des paramètres. Mon programme récupère ces paramètres et execute ensuite une commande externe via runtime.exec.
    Ma commande externe est le lancement d'un script shell déroulant plusieurs vérification et lancant surtout un programme gourmand en ressource.
    Celui-ci tourne parfaitement quand je le lance en ligne de commande dans un terminal.
    Mais quand il est lancé via mon programme java il plante à cause d'une insuffisance de mémoire à allouer.

    Comment faire pour attribuer plus de mémoire pour cette commande externe.
    Sachant que je lance deja mon jar avec l'option -Xmx10g !

    Merci.
    Julie

  2. #2
    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,


    Quel est l'erreur exacte ?
    Que contient ce script shell ?
    Comment l'exécutes-tu depuis Java ? Fais voir ton code !


    a++

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Voici mon code java (la partie qui lance mon script) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    String[] cmd={"/bin/sh","/opt/rseg/Launcher/ScriptRseg.sh",filename.getText(),(String)genome.getSelectedItem(),readLength.getText(),nbIteration.getText(),flagDead,binS,postC,cdfC};
     
    try{
     
    				Runtime r=Runtime.getRuntime();
    				final Process p=r.exec(cmd);
     
    				// Consommation de la sortie standard de l'application externe dans un Thread separe
    				new Thread() {
    					public void run() {
    						try {consommation sortie standard... puis autre thread pour consommation sortie erreur....
    Le script shell contient entre autre des vérifications des paramètres donnés en entrée, une attribution de fichiers correspondant à des variables pour lancer la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /opt/rseg/bin/rseg ${command}
    où $command correspond à toutes les options à donner à rseg.

    Et c'est Rseg qui est gourmand.
    Ce programme commence à se dérouler puis m'affiche l'erreur suivante :

    Error:could not allocate memory (c'est une erreur rseg)


    La nouveauté par rapport à tout à l'heure c'est que je l'ai testé sur une autre machine et que sur cette autre machine ca fonctionne sans problème alors que la mémoire ram est la meme.

  4. #4
    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
    A quoi ressemble la commande ? Il faut faire attention au fait que exec() ne traite pas les caractères spéciaux comme le shell..


    Sinon il faut se reporter à la documentation du programme rseg. Je doute que cela viennent de Java mais plutôt de l'environnement ou autre...


    a++

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    la commande ne comporte aucun caractère spécial, tout ce qu'il y a de plus classique.

    Ce qui me parait curieux c'est que ca fonctionne sur une machine et pas sur une autre toutes deux en ubuntu 12.04, meme config, meme java sun 1.7, meme RAM à16G. Meme nombre de processeurs...

  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
    Le problème ne vient pas de java, mais de ce "rseg".

    Quel est ce programme ?


    a++

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Je ne sais pas si c'est lié, mais je rappelle qu'en Java sous Unix, malheureusement, les commandes externes sont lancées à l'aide d'un appel fork() parfaitement classique.
    Or, la première chose que fait un appel fork(), c'est copier le processus en cours... Avec toute sa mémoire.

    Donc un programme Java sous Unix qui appelle une commande externe, commence par réserver autant de mémoire qu'il en occupe déjà. Assez souvent, la commande externe n'a besoin que de quelques mégas alors que le programme utilise plusieurs giga, soit presque toute la mémoire. Et donc, ça ne passe pas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    C'est effectivement un problème avec RSEG!

    Désolée d'avoir posté mais comme ça tournait sur ma machine de dev je ne pensais pas que ca pouvait planter sur ma machine de prod qui a la meme config que la première!
    Ayant eu un créneau sur la machine de prod sans aucun autre job,j'ai pu effectivement testé que ce n'était ni un problème java, ni un problème de surcharge mémoire en concurence avec d'autres jobs.

    Encore désolée.
    merci pour votre aide.

    P.S : RSEG est un programme en C++ qui fait de la bioinformatique.

  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
    Citation Envoyé par thelvin Voir le message
    Je ne sais pas si c'est lié, mais je rappelle qu'en Java sous Unix, malheureusement, les commandes externes sont lancées à l'aide d'un appel fork() parfaitement classique.
    Or, la première chose que fait un appel fork(), c'est copier le processus en cours... Avec toute sa mémoire.
    Ce n'est pas spécifique à Java, mais aux systèmes Unix en général.
    Pour lancer un autre programme il faut faire un fork() + exec**()...

    Toutefois, sous Linux (et certainement aussi sous certains Unix), le processus n'est pas réellement dupliqué tout de suite. Il y a une notion de "copie à l'écriture", qui n'effectue la copie du processus que si le nouveau process modifie sa mémoire.

    Cela permet justement d'éviter une copie inutile lorsqu'on fait un fork()+exec()...



    a++

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/08/2009, 01h57
  2. Problème mémoire d'execution d'une appli java en commande shell
    Par Djinner² dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 22/07/2008, 17h34
  3. Réponses: 4
    Dernier message: 14/02/2008, 22h11
  4. problème de mémoire pour le processus w3wp.exe
    Par nasser.h dans le forum IIS
    Réponses: 4
    Dernier message: 07/02/2007, 14h51
  5. Réponses: 5
    Dernier message: 19/04/2005, 08h50

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