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

AWT/Swing Java Discussion :

probleme liberation memoire avec JTextArea


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Par défaut probleme liberation memoire avec JTextArea
    Bonjour,
    J'utilise un JtextArea dans une fenetre independante pour afficher un texte d'environ 20000 lignes.Celui-ci est appelé grace à un bouton dans la fenetre principale de mon application.
    Je me sert de dispose() pour fermer la fenetre d'apercu.
    Lors du premier chargement du texte dans mon JtextArea, il n'y a pas de probleme. Ensuite je ferme l'apercu et je le relance et la erreur java heap space par manque de memoire...
    Comment faire pour liberer l'espace memoire (System.gc() ne marche pas)?

  2. #2
    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
    Lors de la fermeture de ta fenêtre essai de passer à null les objets qui consomment de la mémoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public void windowClosing(WindowEvent e){
       monTextArea.setText("");
       monTextArea=null;
       ...
       this.dispose();
    }
    Si cela ne marche pas, laisse tomber ,le System.gc() qui ne garanti pas à 100% que le garbage collector fasse son travail ( tu risques d'avoir ce soucis de manière aléatoire ).
    En dernier recours, il faut que tu augmentes la mémoire de la JVM en lui spécifiant par des arguments :
    java -Xms memoireDeDepart -Xmx memoireMaximum MonProgramme
    memoireDeDepart et memoireMaximum sont des valeurs numériques représentant des MegaOctets.

  3. #3
    Membre chevronné Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Par défaut
    Je ne suis que partiellement d'accord : le gc garantit que la mémoire est libérée, si elle conserve des objets devenus innaccessibles, et si c'est nécessaire.

    Donc, si ces deux conditions sont remplies, alors le gc libère la mémoire, même sans appel à System.gc(), qui est 99 fois sur 100 inutile.

    Donc cela signifie que tu n'as pas vraiment libéré la mémoire suite à ton JTextArea, c'est à dire que quelque chose de ton JTextArea reste accessible. Le dispose libère les ressources système pour afficher une fenêtre, mais si tu as chargé l'ensemble du fichier visualisé dans un tableau de caractères, ce tableau n'est absolument pas libéré par un dispose.

    Il faut que tu regardes si toutes les références à ton JTexteArea sont devenues invalides. Si tu n'y arrives pas, décrit nous un peu plus la situation de ton JTextArea pour voir.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Par défaut
    Mon JtextArea est contenu dans un JPanel, lui meme contenu dans un JTabbedPane, lui meme issu de la JFrame. Mon textArea est privé est aucune reference n'est transmise à une autre classe.

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Par défaut
    Un truc que je comprend pas c'est que lorsque j'execute une autre action (je click sur un autre bouton) dans ma fenetre principale et que je relance l'aperçu alors là ça marche...

  6. #6
    Membre chevronné Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Par défaut
    Il ne suffit pas qu'il soit privé, puisqu'il reste accessible depuis l'objet dont il est un attribut.

    Normalement, si c'est un attribut d'instance, il suffit de remplacer l'ancienne référence par la nouvelle. Cependant, fait gaffe à tout ce qui est listener et classe interne, qui peuvent conserver des références vers l'ancien discrètement.

  7. #7
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Citation Envoyé par spekal
    Je ne suis que partiellement d'accord : le gc garantit que la mémoire est libérée, si elle conserve des objets devenus innaccessibles, et si c'est nécessaire.

    Donc, si ces deux conditions sont remplies, alors le gc libère la mémoire, même sans appel à System.gc(), qui est 99 fois sur 100 inutile.

    Donc cela signifie que tu n'as pas vraiment libéré la mémoire suite à ton JTextArea, c'est à dire que quelque chose de ton JTextArea reste accessible. Le dispose libère les ressources système pour afficher une fenêtre, mais si tu as chargé l'ensemble du fichier visualisé dans un tableau de caractères, ce tableau n'est absolument pas libéré par un dispose.
    Tout ce qui dit iohack, c'est que l'appel à System.gc() est tout à fait inutile et peut même se révéler dangereuse. Il ne garantit en rien que le gc s'active pour venir faire un tour.

  8. #8
    Membre chevronné Avatar de spekal
    Inscrit en
    Mai 2005
    Messages
    502
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 502
    Par défaut
    Citation Envoyé par wichtounet
    Tout ce qui dit iohack, c'est que l'appel à System.gc() est tout à fait inutile et peut même se révéler dangereuse. Il ne garantit en rien que le gc s'active pour venir faire un tour.
    Oui, c'est vrai, je me suis sans doute mal exprimé, car c'est surtout sur la suite que je suis réservé (décidemment ) : il conseille d'augmenter la mémoire disponible, or il me semble que ici il vaudrait mieux vérifier que les références deviennent bien invalides. La mise à null comme il le conseille ne suffit pas (mais c'est déjà un début, je l'admets).

    Mais il faudrait que iutcien nous donne plus de détails. Attendons.

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Par défaut
    d'accord je vous met un peu de code:
    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
     
    //Visualiseur de texte.
    		JTextArea jtext=new JTextArea();
    //Declaration de l'objet permettant de lire un fichier.
    		FileReader reader=null;
    		try
    		{
    //Lecture du fichier.
    			reader=new FileReader(fichier);
    			jtext.read(reader, fichier);
     
     
    		} catch (Exception e)
    		{}
    		finally
    		{
    			if(reader!=null)
    				try
    				{
    //Fermeture de l'objet de lecture.
    				reader.close();
    				} catch (IOException e)
    				{}
    		}
     
     
    		JScrollPane pan=new JScrollPane(jtext);
    Voila là c le jpanel contenant le textArea. Je le rempli en me servant de read().


    Je l'ajoute à mes onglet par un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     tabs.addTab("Viking 1er sens", prepareApercu(fichiers.get(0)));
    pour l'utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //Filtre retournant la liste des fichiers à afficher. 
    Vector<String> fic=mdlTab.getFiltre();
    			if(fen!=null) 
    				{
    				fen.dispose();
    				fen=null;
    				}
    			fen=new FenetreApercu(fic);

Discussions similaires

  1. Probleme liberation memoire
    Par gpgp007 dans le forum C++
    Réponses: 5
    Dernier message: 02/05/2011, 12h11
  2. probleme gestion memoire avec oracle
    Par s_cherbani dans le forum Administration
    Réponses: 4
    Dernier message: 25/10/2010, 16h09
  3. Probleme Memoire avec Bytebuffer sosu eclipse
    Par jlassiramzy dans le forum Eclipse Java
    Réponses: 15
    Dernier message: 31/07/2006, 11h01
  4. Liberer de la memoire avec une image
    Par Battosaiii dans le forum Langage
    Réponses: 1
    Dernier message: 19/07/2006, 17h02
  5. Problemes de memoires avec les tableaux: outOfMemoryError
    Par Battosaiii dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2006, 16h50

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