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 :

Espace mémoire insuffisant


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 59
    Points : 35
    Points
    35
    Par défaut Espace mémoire insuffisant
    Bonjour, je suis en train de développer une application qui se doit de scanner l'ensemble des pages d'un site afin de les analyser et d'en ressortir certaines informations (valide W3C, structure...). Donc pour obtenir les pages je créée l'arborescence du site et doit récupérer l'ensemble des liens.
    Le problème c'est que lorsque le site compte beaucoup de pages j'obtients :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    J'ai déjà pas mal optimiser mon code en mettant à null mes objets.

    Je sais qu'on peut augmenter la taille du tas sous eclipse mais est ce que cela sera également le cas lorsque je mettrais mon logiciel en prod avec son jar exécutable?? puis pas sur que cela soit très propres. surtout que pour le moment j'ai toujours pas fait l'interface graphique qui risque de me bouffer de la mémoire aussi.

    Sinon je me demandais si il était possible d'augmenter la taille du tas de manière dynamique.

    Si quelqu'un à une idée pour éviter la gestion de la mémoire.

    Merci d'avance.

  2. #2
    Membre habitué Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Points : 139
    Points
    139
    Par défaut
    Bonjour,

    L'augmentation de la taille mémoire allouée à un programme se gère directement à l'éxecution du programme en passant des attributs à la machine virtuelle, voir -Xms (mémoire min allouée) et -Xmx (mémoire max allouée)
    http://download-llnw.oracle.com/java...aris/java.html

    C'est ce que fait Eclipse au travers de son interface et c'est donc possible en prod en lancant votre programme de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java -Xms64m -Xmx128m monProg

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 59
    Points : 35
    Points
    35
    Par défaut
    OK et pour l'avoir à chaque lancement de l'application quelque soit l'os je dois faire comment?

  4. #4
    Membre habitué Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Points : 139
    Points
    139
    Par défaut
    L'exemple que je vous ai donné fonctionne sur tous les OS.

    Après, personnellement je fournirais avec mon programme un script par OS, startup.sh pour Linux et startup.bat pour Windows par exemple, mais les deux contiendront mon exemple tel quel.

  5. #5
    Membre actif Avatar de lastrecrue
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    360
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 360
    Points : 278
    Points
    278
    Par défaut
    La vrais question est ce que c'est possible de forcé le passage du grabage collector ???

  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,

    Citation Envoyé par lastrecrue Voir le message
    La vrais question est ce que c'est possible de forcé le passage du grabage collector ???
    Oui, mais il ne faut pas le faire !


    a++

  7. #7
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 977
    Points
    7 977
    Par défaut
    Citation Envoyé par lastrecrue Voir le message
    La vrais question est ce que c'est possible de forcé le passage du grabage collector ???
    Oui bien sure :

    Mais cela est fort déconseillé, et d'ailleurs cette commande, je pense, ne va pas forcement "faire effectuer un passage du GC".

    Si tu dois vouloire faire cela il doit y'avoir 2 causes :

    - Soit tu n'alloues pas assez de mémoires malgré que celle ci est eventuelement disponible.
    - Soit tu dois effectivement allouer de la mémoire en masse et y'en aura jamais assez et donc peut importe tu ne sauras rien y faire. (Genre charger un fichier texte de 6 giga totalement en mémoire pour une raison inconnue .
    - Soit tu as une erreur qlq part qui fait que des references sont gardées (dans une boucle ou un truc du genre) qu'il faudrait corriger afin d'eviter de vouloir appeler le gc.

    EDIT : ha ben voila jme suis fait avoir j'ai mis trop longtemps a répondre
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    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
    @wax78 : mis à part pour des tests de performance afin d'être sûr que le passage du GC ne faussent les données, je ne vois aucune raison valable de l'appeler explicitement !!!

    Par contre cela peut poser de gros problème de performance...

    a++

  9. #9
    Membre actif Avatar de lastrecrue
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    360
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 360
    Points : 278
    Points
    278
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    @wax78 : mis à part pour des tests de performance afin d'être sûr que le passage du GC ne faussent les données, je ne vois aucune raison valable de l'appeler explicitement !!!

    Par contre cela peut poser de gros problème de performance...

    a++
    je n'ai pas bien suivie ???

  10. #10
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 073
    Points : 7 977
    Points
    7 977
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    @wax78 : mis à part pour des tests de performance afin d'être sûr que le passage du GC ne faussent les données, je ne vois aucune raison valable de l'appeler explicitement !!!

    Par contre cela peut poser de gros problème de performance...

    a++
    Je n'ai fait que répondre correctement a la question de lastrecrue qui était "comment appeler le garbage collector" en nuançant ma réponse du "c'est mal".

    D'où mes autres phrases
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    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
    En quelques mots : il ne faut pas forcer le GC !

    a++

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    de toutes façons un GC profond est toujours effectué avant de déclencher un OutOfMemory, donc c'est irrelevant à la question de base.

    Pour la question de base: oui tu peux augmenter, oui tu peux distribuer avec plus de mémoire (suffit de fournir un script de démarrage). Maintenant savoir si c'est judicieux ou pas dépend de ton programme, de la taille des données qu'il manipule, t'es le seul à pouvoir faire l'estimation.

    @lastrecrue: le GC profond (le seul qu'on déclenche explicitement d'ailleurs) utilise du temps CPU. Plus tu l'appelle souvent quand ce n'est pas nécessaire, plus tu gaspille du temps CPU, c'est pour ça que ça détruit les performance. Pourquoi on l'appelle explicitement pour certains test de performance? Pour être certains justement qu'il ne se déclenchera pas pendant la mesure! Exemple: je veux tester 200 fois un code qui manipule 50M de données en mémoire pour une mesure. Je vais entre chaque fois appeler le GC pour pas qu'au milieu de la deuxième exécution il se mette à utiliser du CPU pour nettoyer les 50M du test précédent. Cest cas d'utilisation son rare. La règle simple a applique c'est, si tu crois avoir besoin d'appeler GC, alors t'a certainement pas besoin de l'appeler! (aussi appelée règle du "touche pas à ça p'tit c****)

  13. #13
    Membre actif Avatar de lastrecrue
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    360
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 360
    Points : 278
    Points
    278
    Par défaut
    @n1k00 : je comprend mieux ... merci ...

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

Discussions similaires

  1. Espace mémoire insuffisant
    Par miss_angel dans le forum Visual C++
    Réponses: 6
    Dernier message: 18/04/2013, 02h42
  2. Espace mémoire insuffisant
    Par adrien954 dans le forum C++Builder
    Réponses: 1
    Dernier message: 09/09/2008, 12h41
  3. Atteindre un espace mémoire avec perl
    Par scaleo dans le forum Langage
    Réponses: 3
    Dernier message: 31/03/2006, 18h53
  4. [C][obtenir l'espace mémoire libre]
    Par ronan99999 dans le forum Windows
    Réponses: 4
    Dernier message: 26/10/2004, 07h53
  5. Accéder à un espace mémoire sous XP
    Par keny dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 02/08/2002, 12h37

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