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 :

Java Heap Space : bien gérer l'exception


Sujet :

avec Java

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    le point n'est pas la, le GC explicite est inutile puisque la jvm lors de la tentative d'allocation va tout faire pour trouver la mémoire dont tu as besoin.

    De toutes facons, tu ignore ou a eu lieu le Out of memory, ca peut etre dans l'allocation d'un buffer pour une socket par exemple, auquel cas tu as peut etre perdu des données dans le meilleurs des cas ou tu a rendu ta socket inutilisable dans le pire des cas. Vouloir retomber sur ses patte est stupide dans 99.9% des cas.

    Quand à la spec, ouvre la, elle fait des tonnes de pages, cherche la partie sur allocation de mémoire et tu verra qu'elle fait tout pour trouver ta mémoire et qu'elle lance elle meme le gc, donc un gc explicite est inutile. System.gc() n'est pas une commande magique qui va tout faire fonctionner. On l'utilise très rarement et uniquement quand nécessaire pour des raison de performances. Exemple fictif: tu sais que tu va avoir besoin de faire 10 allocations en file et que t'asbesoin d'etre trèsréactif pendant ces 10 allocations. Dans ce cas tu lance le gc avant pour "limiter" les risque qu'il tourne pendant!

  2. #22
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 628
    Points : 15 789
    Points
    15 789
    Par défaut
    Vouloir retomber sur ses patte est stupide dans 99.9% des cas.
    Je ne suis pas tout a fait d'accord.

    On peut anticiper un problème de mémoire quand on fait de grosses allocations. Par exemple, l'allocation d'un gros buffer pour faire un traitement sur une image.
    Si on catch les OutOfMemoryException précisément sur l'allocation de ce buffer, on doit pouvoir afficher un message, d'erreur disant que l'opération nécessite plus de mémoire et continuer.

  3. #23
    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 hibour Voir le message
    Dans le cas d'une application il ya des objets (références) qui ne sont plus atteignable et que le gc peut récupérer. Si à un instant T on veut allouer une quantité de mémoire raisonnable (pas comme dans ton code) alors peut être le fait d'attendre un peu le GC ça peut aider à récupérer un peu de mémoire et du coup ça peut fonctionner..
    Non le GC va tout faire pour libérer la mémoire avant de générer l'OutOfMemoryError... donc l'appel à System.gc() est inutile.

    Quel que soit la quantité de mémoire que tu alloues (raisonnable ou pas), si une OutOfMemoryError se produit tu ne pourrais pas l'empêcher avec un appel explicite à System.gc()...


    Par contre System.gc() risque de provoquer un FullGC très couteux en temps et inutile (car rien ne te permet de savoir si c'est nécessaire ou pas).


    Sur le forum je n'ai jamais vu d'exemple où System.gc() était utile. Au contraire bien souvent cela se révèle catastrophique en terme de performance


    Citation Envoyé par Uther Voir le message
    Si on catch les OutOfMemoryException précisément sur l'allocation de ce buffer, on doit pouvoir afficher un message, d'erreur disant que l'opération nécessite plus de mémoire et continuer.
    En mono-thread c'est tout à fait possible... mais en multi-thread ce n'est pas forcément évident car l'erreur ne va pas survenir forcément dans la méthode consommatrice de mémoire.

    Donc ce n'est pas si évident que cela à traiter...


    a++

  4. #24
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 656
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 656
    Points : 11 153
    Points
    11 153
    Par défaut
    J'aurai peut-être dû le dire dès le début
    L'erreur "java.lang.OutOfMemoryError: Java heap space" se produit lorsque je remplis un JTextPane. Il arrive un moment où je ne peux plus écrire dans le composant car l'application ne dispose pas de mémoire suffisante.



    Citation Envoyé par adiGuba Voir le message
    Si tu es en Java 5.0 il est préférables d'utiliser les UncaughtExceptionHandler, qui te permettent de traiter les exceptions qui ne sont pas traitées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    		@Override
    		public void uncaughtException(Thread t, Throwable ex) {
    			try {
    				JOptionPane.showMessageDialog(this, ex.getMessage(), "Critical Error.", JOptionPane.ERROR_MESSAGE);
    				Logger.getLogger(MonProjet.class.getName()).log(Level.SEVERE, null, ex);
    			} finally {
    				System.exit(1);
    			}
    		}
    	});
    Ce bout de code m'intéresse bien Mais est-t-il possible de filtrer les exceptions qui seront gérées par ce thread ?
    En effet, la boite dialogue s'affiche et le programme quitte à la moindre exception levée ou non gérée (c'est le but me direz vous). Mais est-il possible de ne traiter que l'erreur Java Heap Space ?

  5. #25
    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
    Il doit être énorme ton JTextPane





    Ce bout de code m'intéresse bien Mais est-t-il possible de filtrer les exceptions qui seront gérées par ce thread ?
    Tu peux "thrower" l'exception pour la recatcher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
    		@Override
    		public void uncaughtException(Thread t, Throwable ex) {
    			try {
    				throw ex;
    			} catch(OutOfMemoryError e) {
    				// traitement OutOfMemoryError
    			} catch (Throwable t) {
    				// Autre traitement
    			}
    		}
    	});
    Par contre les autres exceptions qui arrive ici sont des erreurs inattendus, donc il n'y a pas vraiment de raison que tu les ignores. Cela pourrait même être "dangereux" en générant de plus en plus d'erreurs incompréhensible...


    a++

  6. #26
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 656
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 656
    Points : 11 153
    Points
    11 153
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Il doit être énorme ton JTextPane
    euh..... oui et non
    Je l'utilise pour loguer des événements, et là je teste sa capacité maximale (test de performance on va dire). Même si cela a peu de chance de se produire, je préfère prévenir



    Citation Envoyé par adiGuba Voir le message
    Par contre les autres exceptions qui arrive ici sont des erreurs inattendus, donc il n'y a pas vraiment de raison que tu les ignores. Cela pourrait même être "dangereux" en générant de plus en plus d'erreurs incompréhensible...
    Le cas se produit par exemple si je charge un fichier qui n'existe pas. Pourtant il me semble bien gérer l'exception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        public void openFile(File fileName) throws FileNotFoundException
        {
            try
            {           
                this.monFichier = new DataInputStream(new FileInputStream(fileName));
            }
            catch (IOException ex)
            {
                Logger.getLogger(ClasseFichiers.class.getName()).log(Level.SEVERE, null, ex);
            }
     
        }
    puis dans la classe principale :
    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
     
            if (fc.showOpenDialog(this)==JFileChooser.APPROVE_OPTION)
            {
                file = fc.getSelectedFile();
                try
                {
                    // lecture du fichier....
                    fichier.openFile(file);
                }
                catch (FileNotFoundException ex)
                {
                    Logger.getLogger(MonProjet.class.getName()).log(Level.SEVERE, null, ex);
                    Err = true;
                }
                if (Err)
                    return;
     
    			//... suite du code....
            }
    Si le fichier passé en paramètre de openFile() n'existe pas j'ai un FileNotFoundException qui est déclenché. Pourtant, il me semble bien la gérer.
    Je m'y prends mal ?

    [edit]

    Bon j'ai résolu le problème évoqué ci-dessus (les exceptions levées avec ma fonction openFile()).
    Déjà IOException passe avant FileNotFoundException, du coup FileNotFoundException ne sert plus à grand chose
    Ensuite il y a ma variable fileName, il faut que je teste si fileName.exists() est vrai avant le new FileInputStream(fileName)).
    Enfin, le Logger qui lui affichait dans la console l'exception retournée.

    [/edit]

  7. #27
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Envoyé par adiGuba
    Non le GC va tout faire pour libérer la mémoire avant de générer l'OutOfMemoryError... donc l'appel à System.gc() est inutile.
    Ok dans ce cas j'avoue que je suis bien d'accord que c'est inutile le System.gc(). Pourquoi ne pas rendre cette méthode deprecated tout simplement ou mieux mettre une implémentation vide puisque la JVM est si parfaite

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    en fait, rien n'empeche la jvm de fournir une implémentation vide de System.gc()

    A la question du pourquoi c'est pas fait, c'est pas à nous de répondre mais à sun

  9. #29
    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 tchize_ Voir le message
    en fait, rien n'empeche la jvm de fournir une implémentation vide de System.gc()
    +1 c'est au libre choix de la JVM de de son implémentation !

    Raison de plus de s'en méfier : lorsqu'ils sont ignorés on ne se rend pas forcément compte des problèmes de performance que cela peut engendrer, et le changement de JVM peut s'avérer catastrophique s'ils se retrouvent pris en comtpe...

    Quelques exemples de problèmes liés à des appels explicites à System.gc() :


    A noter que la plupart des JVM permettent de désactiver ces appels explicites via des options de la ligne de commande (-XX:+DisableExplicitGC pour la JVM de Sun).



    Citation Envoyé par hibour Voir le message
    Pourquoi ne pas rendre cette méthode deprecated tout simplement ou mieux mettre une implémentation vide puisque la JVM est si parfaite
    Je n'ai pas dit que la JVM était parfaite

    Maintenant ce n'est pas parce que la méthode n'est pas deprecated qu'il faut obligatoirement l'utiliser...

    a++

  10. #30
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 656
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 656
    Points : 11 153
    Points
    11 153
    Par défaut
    je constate que je vais devoir gérer le problème de manière plus subtile :
    en effet quand l'exception se produit, la jvm tarde à reprendre la main, mon interface devient noire (le programme ne répond plus) et la boite de dialogue affichant l'erreur de s'affiche pas.


    Mon erreur se déclenche dans une boucle. Donc je me dis que je devrais vérifier à chaque itération la mémoire utilisée par l'application et déclencher manuellement l'exception avant d'atteindre la saturation. Je pense que de cette manière :
    1- mon application ne sera pas bloquée
    2- ma boite de dialogue pourra s'afficher
    3- mon application pourra se fermer plus rapidement

    Mais, la question que je me pose est à partir de quelle limite je peux considérer que je n'ai plus assez de mémoire pour que l'application puisse fonctionner normalement ??

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    la question que tu dois surtout te poser: peux-t-on savoir combien de mémoire il reste de libre réellement pour la jvm (c'est à dire mémoire vive + ce qui est garbage collectable)?

    (indice: la réponse est non)

  12. #32
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 656
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 656
    Points : 11 153
    Points
    11 153
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    la question que tu dois surtout te poser: peux-t-on savoir combien de mémoire il reste de libre réellement pour la jvm (c'est à dire mémoire vive + ce qui est garbage collectable)?

    (indice: la réponse est non)
    euh là je ne comprends plus
    D'après la FAQ :
    Ensuite, il suffit d'utiliser la méthode getHeapMemoryUsage() qui retournera un objet MemoryUsage contenant le détail de la mémoire utilisé par votre application. Il contient ainsi les informations suivantes :
    * init : La taille initiale de la mémoire utilisé par l'application (généralement 0, sauf si l'on a utilisé l'option -Xms de la JVM).
    * used : La quantité de mémoire qui est réellement utilisée par votre application.
    * committed : La quantité de mémoire qui a été réservée auprès du système d'exploitation.
    * max : La quantité maximale que la JVM est authorisée à réserver auprès du système d'exploitation (modifiable avec l'option -Xmx de la JVM). Si l'application utilise plus de mémoire cela générera une OutOfMemoryError.
    Si je fais (max-used) j'ai bien la quantité de mémoire qui me reste non ?

    Pour mon application, je n'utilise ni l'option -Xmx ni l'option -Xms.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    non, si tu alloue un objet de 50M, disons, et que tu supprime toutes ses référence. Le GC n'est pas encore passé dessus, mais il compte dans le used, car jusqu'à p^reuve du contraire, il est utilisé. Mais, il est libérable, juste pas encore libéré. Comme il est libérable, il doit etre compté comme du "free", mais il est toujours dans le used, paradoxal mais bon. Bref, le seul moyen de connaitre la mémoire dispos, ce serai "max - used + récupérable par GC", et le dernier terme n'est pas mesurable ....

  14. #34
    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
    Quel est la quantité de mémoire utilisée ? Que fait ta boucle ?
    Quel est la portée des objets consommateurs de mémoire ?
    Est-ce normal pour ton application d'utiliser "autant" de mémoire ?

    a++

  15. #35
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 656
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 656
    Points : 11 153
    Points
    11 153
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    non, si tu alloue un objet de 50M, disons, et que tu supprime toutes ses référence. Le GC n'est pas encore passé dessus, mais il compte dans le used, car jusqu'à p^reuve du contraire, il est utilisé. Mais, il est libérable, juste pas encore libéré. Comme il est libérable, il doit etre compté comme du "free", mais il est toujours dans le used, paradoxal mais bon. Bref, le seul moyen de connaitre la mémoire dispos, ce serai "max - used + récupérable par GC", et le dernier terme n'est pas mesurable ....
    Si j'ai bien compris si je fais un (max - used) je surévalue la quantité de mémoire restante ? A la limite, je dirais que ça ne me gène pas trop : je préfère ça qu'un plantage pur et simple


    Citation Envoyé par adiGuba Voir le message
    Quel est la quantité de mémoire utilisée ? Que fait ta boucle ?
    Quel est la portée des objets consommateurs de mémoire ?
    Est-ce normal pour ton application d'utiliser "autant" de mémoire ?

    a++
    Je cherche simplement les limites d'utilisation du programme. Donc je cherche tous les éléments qui sont susceptibles de provoquer des erreurs, des plantages etc.

    Cette boucle remplit un StringBuffer, puis j'écris le contenu de ce buffer dans un JTextPane.

    L'application va loguer dans ce JTextPane toute une série d'événements et de données. A priori, je ne connais pas la quantité d'informations que contiendra le fichier RTF qui sera généré à partir de ce JTextPane.

    L'outil profiler de Netbeans montre bien que pendant cette phase, la mémoire consommée monte en flèche Il suffit que je vide le JTextPane pour que la mémoire consommée retombe à un niveau normal.


    D'après mes premiers tests, l'exception Java Heap Space a peu de chance de se produire, mais je préfère la gérer plutôt que d'avoir une application qui plante sans prévenir

  16. #36
    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 Auteur Voir le message
    Si j'ai bien compris si je fais un (max - used) je surévalue la quantité de mémoire restante ? A la limite, je dirais que ça ne me gène pas trop : je préfère ça qu'un plantage pur et simple
    Non tu la sous-évalues...

    Le "used" peut contenir des objets libérables.




    Citation Envoyé par Auteur Voir le message
    Je cherche simplement les limites d'utilisation du programme. Donc je cherche tous les éléments qui sont susceptibles de provoquer des erreurs, des plantages etc.
    Le problème c'est qu'on ne connait rien de ton programme ni de ses objectifs, donc difficile de t'aider concrètement.

    Sans info sur ton programme, on ne pourra te donner que quelques vagues pistes ou quelques précisions. Rien de plus...


    a++

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    tu peux travailler autrement. Si tu a un algo X consommateur de mémoire et que tu peux +- évaluer la mémoire dont il aura besoin. Tu peux faire ceci

    if ( (max - <ce que consomme en général mon prog sans l'algo>) < ce que risque de consommer l'algo)
    alors: warning 'etes vous sur?'

  18. #38
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 656
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 656
    Points : 11 153
    Points
    11 153
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Le problème c'est qu'on ne connait rien de ton programme ni de ses objectifs, donc difficile de t'aider concrètement.
    Ce programme transmet par TCP/IP des paquets de données à un PC client et pour garder une trace sur les informations envoyées, elles sont écrites dans ce JTextPane avant d'être enregistrées dans un fichier. C'est l'utilisateur qui provoque l'envoi des données en cliquant sur un bouton "Submit".

    A l'origine je m'intéressais à la quantité d'informations que peut contenir le JTextPane. Donc pour le test, je réalise une boucle qui simule un nombre important de clics sur le bouton "Submit". Et à chaque clic simulé, je remplis le JTextPane... jusqu'à atteindre la limite et provoquer cette exception.

    D'après les résultats, je peux placer 1 million de caractères ce qui revient à réaliser plus de 1000 envois.

    Dans la réalité, il est très peu probable que cette limite soit atteinte.




    Citation Envoyé par tchize_ Voir le message
    non, si tu alloue un objet de 50M, disons, et que tu supprime toutes ses référence. Le GC n'est pas encore passé dessus, mais il compte dans le used, car jusqu'à p^reuve du contraire, il est utilisé. Mais, il est libérable, juste pas encore libéré. Comme il est libérable, il doit etre compté comme du "free", mais il est toujours dans le used, paradoxal mais bon. Bref, le seul moyen de connaitre la mémoire dispos, ce serai "max - used + récupérable par GC", et le dernier terme n'est pas mesurable ....
    Citation Envoyé par adiGuba Voir le message
    Non tu la sous-évalues...

    Le "used" peut contenir des objets libérables.
    En effet, je sous-évalue la quantité de mémoire restante. Ensuite je ne vois pas trop comment je peux calculer la mémoire consommée.


    Est-ce que cette méthode qui consiste à vérifier à chaque itération la quantité de mémoire utilisée (même si celle-ci contient des objets libérables) par rapport à une limite que j'aurai fixée vous semble correcte ?
    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
    28
    29
    30
    31
    32
    33
     
    MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
    int i, max;
    long quantiteMemoireMax;
     
     
    // instructions
     
    try
    {
    	for (i=0; i<max; i++)
    	{
    		// instructions
    		// écriture dans le  JTextPane
     
    		if (memoryBean.getHeapMemoryUsage().getUsed() > quantiteMemoireMax)
    			throw new OutOfMemoryError(); 
     
    	}
    }
    catch (OutOfMemoryError ex)
    {
    	try
    	{
    		JOptionPane.showMessageDialog(this, ex.getMessage(), "Erreur...", JOptionPane.ERROR_MESSAGE);
    		Logger.getLogger(monProjet.class.getName()).log(Level.SEVERE, null, ex);
    	}
    	finally
    	{
    		//this.dispose();
    		System.exit(2);
    	}
    }

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    pour ton cas précis (jTextPane), ce qui devrait être fait

    1) probablement ta propre implémentation de Document qui supporte mieux les ajouts que celle par défaut (qui va faire copie / ajout / remplacement, donc double consommation de mémoire, si je me souviens bien)

    2) Limiter volontairement (par une config de ton programme) la quantité de mémoire utilisée par ton textpane. Exemple: limiter à 50M le textpane, ce qui reviens à dire +-, le limiter à un Document sans mise en forme de 50 millions de caractères


    Le point 2, c'est ce que font des logiciels comme eclipse pour gérer la console.

  20. #40
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 656
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 656
    Points : 11 153
    Points
    11 153
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    pour ton cas précis (jTextPane), ce qui devrait être fait

    1) probablement ta propre implémentation de Document qui supporte mieux les ajouts que celle par défaut (qui va faire copie / ajout / remplacement, donc double consommation de mémoire, si je me souviens bien)
    Les premiers temps j'appelais insertString dans la boucle, et je me suis aperçu que cela prenait trop de temps.

    Du coup dans ma boucle, je remplis un StringBuffer et à la sortie j'écris le contenu dans le JTextPane.

    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
    28
    29
     
    StringBuffer buf = new StringBuffer();
    String str = new String();
     
    //....
     
    try
    {
    	buf.setLength(0);
     
    	while(i<nLignes)
    	{
    		for (j=0; j<nColonnes; j++)
    		{
    			str = (String)this.table.getModel().getValueAt(i, j);
    			buf.append(str);
    			buf.append("\t");
    		}
    		buf.append("\n");
    	}
     
    	monTextPane.getDocument().insertString(rtfStyledDoc.getLength(), buf.substring(0), attrs);
    	buf.setLength(0);
    	buf = null;
    }
    catch (OutOfMemoryError ex)
    {
     
    }

    Citation Envoyé par tchize_ Voir le message
    2) Limiter volontairement (par une config de ton programme) la quantité de mémoire utilisée par ton textpane. Exemple: limiter à 50M le textpane, ce qui reviens à dire +-, le limiter à un Document sans mise en forme de 50 millions de caractères


    Le point 2, c'est ce que font des logiciels comme eclipse pour gérer la console.
    Je peux limiter la mémoire pour 1 composant en particulier ?
    Comment faire ?
    Dans mon cas le document a une mise en forme (couleur, taille des caractères, police utilisée), j'utilise le RTFEditorKit.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Réponses: 10
    Dernier message: 25/08/2010, 22h07
  2. Réponses: 3
    Dernier message: 12/02/2010, 19h20
  3. Réponses: 8
    Dernier message: 12/02/2010, 13h51
  4. Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    Par Edna24 dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 03/06/2009, 12h19
  5. Exception JAVA HEAP SPACE
    Par JauB dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 06/08/2007, 11h51

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