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 :

out of memory!


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut out of memory!
    Bonjour,

    Je développe sous Java et j'ai un pb d'espace mémoire.

    J'utilise une liste chainée (LinkedList) mais elle doit contenir beaucoup trop de données car j'ai mon espace mémoire qui explose. 'Out of Memory'

    J'ai trouvé trois causes possible à cela:
    - soit c'est une limitation de java. Dans ce cas j'aimerai connaitre la taille maximale que java peut accepter pour une structure.
    - soit c'est une limitation au niveau de ma taille mémoire (qui est à 500Mo)
    - soit c'est une limitation de mon OS (je suis sous Windows)

    Merci de votre aide....

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 230
    Par défaut
    Bonjour,

    Y a-t-il possibilité de voir le code de l'alimentation de la liste ?

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


    Par défaut les applications Java n'utilisent pas plus de 64Mo...
    Pour augmenter cette valeur tu peux utiliser l'option -Xmx de Java, par exemple pour 500 Mo max :
    a++

  4. #4
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Problème de conception...
    Quelles sont les données que tu mets dans ta liste ? Ne peuvent-t-elles pas être chargées à la volée depuis une base ? Ou mieux en niveau performance : chargées à la volée depuis un fichier ? Ou mieux, avec un buffer dynamique ( je bosse la dessus en ce moment, ya du potentiel ).

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Merci de vos nombreuses réponses déjà,


    Bonjour,

    Y a-t-il possibilité de voir le code de l'alimentation de la liste ?


    Oui le voila, mais je ne fais que trier des données d'où l'utilisation d'une liste chaînée.

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public void trier(Integer apid,Calendar utc,Datadateinfo info){
     
     
    	int i=donneesTriees.get(apid).size()-1;
    	boolean test_insertion = true;
    	while( test_insertion && i != -1 ){
    		if(info.utc.compareTo(donneesTriees.get(apid).get(i).utc)<0){
    			i--;
    			}
    		else{
    			test_insertion = false;
    			}
    		}
    		if(i == -1){
    			donneesTriees.get(apid).add(0,info);
    			}
    		else{
    			if( i == donneesTriees.get(apid).size()-1){
    				donneesTriees.get(apid).addLast(info);
    			}else{
    				donneesTriees.get(apid).add(i+1,info);
    			}
    		}
    		if(donneesTriees.get(apid).size()>100000){
    			ecrireUnePartie(apid);
    		}
    }

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Citation Envoyé par adiGuba
    Salut,


    Par défaut les applications Java n'utilisent pas plus de 64Mo...
    Pour augmenter cette valeur tu peux utiliser l'option -Xmx de Java, par exemple pour 500 Mo max :
    a++
    Merci je vais tester cela.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Citation Envoyé par iohack
    Problème de conception...
    Quelles sont les données que tu mets dans ta liste ? Ne peuvent-t-elles pas être chargées à la volée depuis une base ? Ou mieux en niveau performance : chargées à la volée depuis un fichier ? Ou mieux, avec un buffer dynamique ( je bosse la dessus en ce moment, ya du potentiel ).
    Dans ma liste je met des données textuelles mais une donnée est assez conséquente.
    Elles sont chargées depuis un fichier mais je suis obligé de les garder en memoire car il faut que je les trie. Et dès que ma mémoire est saturée, je l'ai estimé à 15 000 données (dans le post au dessus elle est à 100 000 données mais c'est pour un test) , je suis obligé d'écrire au moins une données.
    Le soucis est que je fais un test au moment de l'ecriture dans le fichier de sortie pour n'ecrire dans ce fichier que des données plus ancienne. Si la donnée est plus récente je perds la données. (Et j'en perd bcp!!! ).

    Le buffer dynamique je ne connais pas. Si tu pense que ça m'est utile, alors je suis preneur.

    Merci d'avance

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Citation Envoyé par adiGuba
    Salut,


    Par défaut les applications Java n'utilisent pas plus de 64Mo...
    Pour augmenter cette valeur tu peux utiliser l'option -Xmx de Java, par exemple pour 500 Mo max :
    a++
    Dis moi je développe sous Eclipse et je n'arrive pas à trouver comment changer les options pour prendre en compte le -Xmx500m. Tu sais si cela est possible sous Eclipse et comment.

    Merci

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Bonjour,

    J'ai résolu le problème mais il me reste une question en suspend.

    Pour la résolution voilà.

    Mon problème de taille mémoire venait bien d'un limitation de java et donc la solution est bien d'utiliser l'option
    java -Xmx500m programme.jar

    Pour utiliser cette option sous eclipse il faut faire
    >Exécuter...
    >Onglet (x)=Arguments
    >et remplir le champ Arguments VM en mettant -Xmx500m



    Maintenant ma nouvelle question...

    J'ai donc utilisé cette option mais j'ai l'impression que mon programme tourne bcp, bcp, bcp plus longtemps (ceci est évidement pas dû au fait que maintenant je peux stocker bcp plus de donnée car pour m'assurer de ce constat j'ai testé le programme qui ne necessite pas l'extension de taille du processus avec l'option et sans l'option ou lancement). Le temps nécessaire est peut être doublé (sans l'option le programme tourne une journée, avec l'option le programme tourne 2 jours).

    Est ce que qun à des infos sur le fait que peut être l'option -Xmx500m peut augmenter le tps cpu???

    Merci

  10. #10
    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
    Citation Envoyé par xduris
    (sans l'option le programme tourne une journée, avec l'option le programme tourne 2 jours).
    Deux jours
    Il fait quoi ce programme exactement ?

    Citation Envoyé par xduris
    Est ce que qun à des infos sur le fait que peut être l'option -Xmx500m peut augmenter le tps cpu???
    Cela n'augmente pas le temps CPU mais seulement la mémoire utilisable ???

    Lorsque tu dis que ton programme se termine plus vite sans l'option -Xmx, est-ce qu'il se termine normalement ou est-ce qu'il plante ???

    a++

  11. #11
    Membre chevronné Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Par défaut
    Moi je trouve ça plutôt normal. Il y a plus de données que tu peux stocker. Comme avant tu avais un problème de mémoire, toutes les données n'étaient pas stockées. Maintenant qu'elles le sont, le temps de traitement est plus long puisqu'il y a plus de données.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Deux jours
    Il fait quoi ce programme exactement ?
    Ah oui c'est du bon gros programme.

    Lorsque tu dis que ton programme se termine plus vite sans l'option -Xmx, est-ce qu'il se termine normalement ou est-ce qu'il plante ???
    Il se termine normalement, j'ai les même résultats qu'avec l'option mais 1 jour plus tard.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Citation Envoyé par Rayndell
    Moi je trouve ça plutôt normal. Il y a plus de données que tu peux stocker. Comme avant tu avais un problème de mémoire, toutes les données n'étaient pas stockées. Maintenant qu'elles le sont, le temps de traitement est plus long puisqu'il y a plus de données.
    Oui ta réflexion est juste mais j'ai essayé de l'expliquer dans mon post précédent:

    ceci est évidement pas dû au fait que maintenant je peux stocker bcp plus de donnée car pour m'assurer de ce constat j'ai testé le programme qui ne necessite pas l'extension de taille du processus avec l'option et sans l'option ou lancement
    En gros je limite la taille des données que je dois traiter afin que le programme tourne sans l'option -Xmx500m. Et quand je compare le temps de calcul entre ce même programme avec et sans l'option de lancement -Xmx500m, alors je me rends compte que le temps de calcul est multiplié par 2.

  14. #14
    Membre chevronné Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Par défaut
    Je croyaiq que sans l'option tu avais du out of memory ?

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    En gros je dois trier des données. Pour cela à chaque fois que j'en ai une de plus je la trie. Mais j'arrive à un pb memoire à force. Donc je suis obligé de les écrire et donc je teste quand je les ecrits si la donnée que j'écrisest bien a la suite de celle déja ecrites.
    Si ce n'est pas le cas alors je suis obligé de virer la données (donnée perdue ).

    Donc j'ai fait tourné ce programme en limitant ma taille de données pour qu'il tourne sans l'option -Xmx500m.

    voilà

  16. #16
    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
    Citation Envoyé par xduris
    En gros je dois trier des données. Pour cela à chaque fois que j'en ai une de plus je la trie.
    Ce ne serait pas un peu trop lourd tout cela ? Ne vaudrait-il pas mieux les tirer un seule fois pour toutes ???

    Citation Envoyé par xduris
    Mais j'arrive à un pb memoire à force. Donc je suis obligé de les écrire et donc je teste quand je les ecrits si la donnée que j'écrisest bien a la suite de celle déja ecrites.
    Ce n'est pas très clair tout cela...

    Citation Envoyé par xduris
    Donc j'ai fait tourné ce programme en limitant ma taille de données pour qu'il tourne sans l'option -Xmx500m.
    La différence de perf doit surement venir de ton algorithme : comment tu gères la limitation de la taille des données ???

    a++

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Bonjour,

    Ca y est je suis sur la fin de mon projet et encore merci pour votre aide car grace à vous mon projet marche.

    J'ai juste une petite question.
    Je suis en train d'exporter mon projet sous eclipse. Pour excecuter mon projet correctement il faut le lancer avec l'option -Xmx500m.
    Donc mon projet marche très bien quand je le lance depuis un .bat avec
    java -jar -Xmx500m projet.jar
    ou quand je le lance depuis eclipse en remplissant la ligne Argument VM (au passage je me demande tjs ce que VM signifie).

    Mais si je l'exporte avec eclipse en gardant la ligne Argument VM remplie avec -Xmx500m et que je lance mon projet en double cliquant sur le projet.jar alors mon projet se lance sans l'option -Xmx500m.

    Est ce que je suis obligé de passer par le .bat?

    Merci encore pour tout.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    J'étais content de votre aide pour mon précédent problème, mais le je bataille sur celui là. Vraiment personne pour me filer un coup de main!

  19. #19
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Tu es obligé.
    VM signifie Virtual Machine

  20. #20
    Membre chevronné Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Par défaut
    La commande java lance la machine virtuelle, c'est à ce moment que tu précises les limites de mémoire que tu veux allouer. Tu ne peux donc pas placer cela dans ton jar, donc tu dois passer par un .bat.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XStream][String]out of memory
    Par Invité dans le forum Persistance des données
    Réponses: 8
    Dernier message: 10/01/2006, 14h52
  2. [C++] [gcc] out of memory
    Par fxp17 dans le forum GCC
    Réponses: 5
    Dernier message: 06/01/2006, 10h29
  3. [pb mémoire] out of memory d'eclipse
    Par Casp dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 12/05/2005, 16h39
  4. Out of memory
    Par shurato dans le forum ANT
    Réponses: 1
    Dernier message: 10/11/2004, 16h19
  5. [JBuilder 8] Out of memory problem ...
    Par keros dans le forum JBuilder
    Réponses: 2
    Dernier message: 08/09/2003, 19h03

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