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

avec Java Discussion :

Créer une fuite mémoire (OutOfMemoryError: Java heap space)


Sujet :

avec Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur d'affaires
    Inscrit en
    Juillet 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'affaires
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Créer une fuite mémoire (OutOfMemoryError: Java heap space)
    Bonjour,

    débutant sous Java, on me demande de créer un programme provoquant volontairement une fuite mémoire sur un serveur de qualification.
    Ce programme permettra de valider le bon fonctionnement du Dump lorsque l'Out Of Memory apparaîtra.

    Je ne sais pas comment commencer ?
    Pouvez-vous me donner une piste ?

    Merci par avance.

    Spiffou92

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Une fuite mémoire est une grappe d'objet qui grossie. Sans qu'un élément ne soit nettoyable par le Garbage Collector. En gros, il faut que tu garde une référence de tout tes objets.

    Le plus simple pour crée une fuite mémoire, c'est la création d'élément ajouter à une liste dans une boucle while :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package org.k.developpez.forum;
     
    import java.util.ArrayList;
    import java.util.List;
     
    public class MemoryLeak {
    	public static void main(String[] args) {
    		List<Object> leakingList = new ArrayList<Object>();
    		while (true) {
    			leakingList.add(new Object());
    		}
    	}
    }
    Qui produit le résultat suivant :
    Citation Envoyé par Sortie d'erreur
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3210)
    at java.util.Arrays.copyOf(Arrays.java:3181)
    at java.util.ArrayList.grow(ArrayList.java:261)
    at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)
    at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)
    at java.util.ArrayList.add(ArrayList.java:458)
    at org.k.developpez.forum.MemoryLeak.main(MemoryLeak.java:10)
    Après, tu peux changer les paramètres de lancement de ton application pour limiter la taille de ton application :
    Two JVM options are often used to tune JVM heap size: -Xmx for maximum heap size, and -Xms for initial heap size.
    Cela te permettra d'avoir un heap size sans remplir 2Go de mémoire pour rien.

    Cordialement,
    Patrick kolodziejczyk.

    source :
    http://javahowto.blogspot.fr/2006/06...java-heap.html
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur d'affaires
    Inscrit en
    Juillet 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'affaires
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci beaucoup kolodz.
    J'essaie et ferai un retour.

    spiffou92

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Ingénieur d'affaires
    Inscrit en
    Juillet 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'affaires
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    j'ai un petit doute de débutant avant d’exécuter le programme.

    J'ai compilé sous unix le programme .java afin d'obtenir un fichier .class.
    Je pense lancer ce fichier .class avec la commande java laquelle permet les options sur la taille du tas (Xms et Xms).
    Ainsi le résultat obtenu sera l'OutOfMemory et la génération du Dump Heap.
    Est-ce bien cela ?

    Sur cette machine, il y a un site Web qui tourne et que je retrouve sous forme de processus par "ps -ef | grep java".
    Le OutOfMemory que je vais générer va-t-il impacter le site Web ?
    Sinon, l'essentiel est-il de disposer de la RAM adéquate ? 1Go pour le site Web et pour mon programme et 8Go de RAM au total sur le serveur.

    Si un dump se génère (avec les options de la commande java que j'ai lancé), puis-je alors conclure que la JVM du site Web qui tourne sur ce serveur aura le même comportement, c'est à dire la génération d'un dump, si j'utilise les mêmes options java ?

    Merci du retour, cela m'aidera avant de tout faire planter (même si je suis en environnement de qualification).

  5. #5
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Ainsi le résultat obtenu sera l'OutOfMemory et la génération du Dump Heap.
    Est-ce bien cela ?
    Oui.
    Sur cette machine, il y a un site Web qui tourne et que je retrouve sous forme de processus par "ps -ef | grep java".
    Le OutOfMemory que je vais générer va-t-il impacter le site Web ?
    Sinon, l'essentiel est-il de disposer de la RAM adéquate ? 1Go pour le site Web et pour mon programme et 8Go de RAM au total sur le serveur.
    Lorsque tu va lancer ton second programme tu va crée un nouveau processus Java avec sa mémoire à lui.
    Normalement, la JVM est a des paramètres de lancement par défaut tel qu'un Processus Java ne prend pas toutes la mémoire pour lui. (C'est la valeur par défaut de ton Xms)
    Même si ton programme de test prend toute la mémoire restante à son lancement, le "site web" serai impacté que si celui-ci à besoin de plus de mémoire, avant que ton test crash.(et donc libère la mémoire.)

    Si un dump se génère (avec les options de la commande java que j'ai lancé), puis-je alors conclure que la JVM du site Web qui tourne sur ce serveur aura le même comportement, c'est à dire la génération d'un dump, si j'utilise les mêmes options java ?
    Oui. Il est rare(Jamais vue) de voir une configuration de lancement modifier la gestion du Dump Heap.

    Si tu veux plus d'aide sur le Dump Heap, je laisserai une autre personne prendre le relai. J'évite d'avoir ce genre de truc à traiter !

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Ingénieur d'affaires
    Inscrit en
    Juillet 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'affaires
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bonjour kolodz,

    merci encore une fois pour ton retour qui me permet de mieux comprendre.
    Ok, on va en rester là pour le Dump Heap, mais juste une précision :
    la configuration de lancement via l'option HeapDumpOnOutOfMemoryError peut permettre de générer ou non le Dump Heap.

    A+
    spiffou92

  7. #7
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    C'est ce que dit la documentation non ?

    Citation Envoyé par Debugging Options
    -XX:-HeapDumpOnOutOfMemoryError
    Dump heap to file when java.lang.OutOfMemoryError is thrown. Manageable. (Introduced in 1.4.2 update 12, 5.0 update 7.)
    http://www.oracle.com/technetwork/ja...sp-140102.html

    Cordialement,
    Patrick Kolodziejczyk.

    Ps: Si tu as un problème de Memory Leak tu peux regarder ça avec Java VisualVM (Outil fournit avec le SDK)
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Ingénieur d'affaires
    Inscrit en
    Juillet 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'affaires
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Bonjour kolodz,

    En exécutant "MemoryLeak.class", voici l'erreur que j'obtiens :
    "
    Exception in thread "main" java.lang.NoClassDefFoundError: MemoryLeak/class
    Caused by: java.lang.ClassNotFoundException: MemoryLeak.class
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    Could not find the main class: MemoryLeak.class. Program will exit.
    "

    Je ne comprends cette erreur simple, d'autant plus que le code fonctionnait chez toi.
    Si tu peux m'aider ?

    Merci par avance.

    spiffou92

  9. #9
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    L'erreur t'indique qu'il ne trouve pas la classe compilé "MemoryLeak". Cela est peut-être dû au package org.k.developpez.forum.
    Comment lance-tu le programme ?
    Ou ce trouve le fichier MemoryLeak.class au moment du lancement ?

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  10. #10
    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
    Citation Envoyé par spiffou92 Voir le message
    Bonjour kolodz,

    En exécutant "MemoryLeak.class", voici l'erreur que j'obtiens :
    "
    Exception in thread "main" java.lang.NoClassDefFoundError: MemoryLeak/class
    Caused by: java.lang.ClassNotFoundException: MemoryLeak.class
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    Could not find the main class: MemoryLeak.class. Program will exit.
    "

    Je ne comprends cette erreur simple, d'autant plus que le code fonctionnait chez toi.
    Si tu peux m'aider ?

    Merci par avance.

    spiffou92
    Parce que tu lui demande de chager la classe "class" située dans le package "MemoryLeak". La ligne de commande java ne prend pas d'extensions. C'est


    et pas


  11. #11
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Merci tchize_ !

    Complément :
    Sachant que la classe que j'ai fourni à un package org.k.developpez.forum.

    Tu dois avoir dans le dossier /org/k/developpez.forum ton fichier .class
    Et lancer la commande depuis / :
    C:\workspace\Developpez\src>java org.k.developpez.forum.MemoryLeak
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Unknown Source)
    at java.util.Arrays.copyOf(Unknown Source)
    at java.util.ArrayList.grow(Unknown Source)
    at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
    at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
    at java.util.ArrayList.add(Unknown Source)
    at org.k.developpez.forum.MemoryLeak.main(MemoryLeak.java:10)
    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Ingénieur d'affaires
    Inscrit en
    Juillet 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'affaires
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci de vos retours kolodz et tchize_

    Je confirme que je peux désormais lancer "MemoryLeak" (sans .class) avec la commande java.
    J'ai aussi mis en commentaire "package org.k.developpez.forum".
    J'obtiens bien sur le serveur un java.lang.OutOfMemoryError de type heap.
    Il ne me reste plus qu'à jouer avec les options de la commande java pour générer un dump.

    spiffou92

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Ingénieur d'affaires
    Inscrit en
    Juillet 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'affaires
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    J'ai réussi à générer le dump. Je vais désormais apprendre pour réaliser une analyse de dump.
    Je clos donc la discussion.
    Merci encore de votre aide.

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

Discussions similaires

  1. java.lang.OutOfMemoryError: Java heap space
    Par othmanbenhalima dans le forum Général Java
    Réponses: 12
    Dernier message: 08/01/2008, 17h46
  2. java.lang.OutOfMemoryError: Java heap space
    Par EvilAngel dans le forum Langage
    Réponses: 3
    Dernier message: 26/04/2007, 10h17
  3. [Findbugs] [Maven] java.lang.OutOfMemoryError: Java heap space
    Par albaille dans le forum Qualimétrie
    Réponses: 1
    Dernier message: 10/04/2007, 15h17
  4. Réponses: 4
    Dernier message: 18/09/2006, 10h02
  5. Eclipse erreur : java.lang.OutOfMemoryError: Java heap space
    Par sderecourt dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 14/04/2006, 11h28

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