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

Graphisme Java Discussion :

Récupération de mémoire


Sujet :

Graphisme Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Récupération de mémoire
    Bonsoir à toutes et à tous,

    Dans une application que je crée, je peux ouvrir plusieurs fenêtres dans lesquelles je charge des images (30 Mo chacune pour de grandes images). Lorsque je ferme ces fenêtres, je ne récupère pas la mémoire occupée.

    J'ai essayé avec des "finalize", des "removeAll", de charger une image de dimensions nulles dans l'image dont je veux récupérer la mémoire : rien n'y fait.

    Pour un logiciel de dessin, c'est complètement rédhibitoire.

    Avez-vous des solutions ?

    Merci de votre aide.

    Pierre

  2. #2
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    Ca pourra sûrement t'intéresser :
    Forcer le passage du garbage collector

  3. #3
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Merci pour cette proposition ; j'avais fait son équivalent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Runtime r = Runtime.getRuntime();
    Apparemment, ça ne fait rien de plus. D'ailleurs, dans la doc il est dit que le passage de GC ne garantit pas le nettoyage de la mémoire dans l'immédiateté.

    Je me suis amusé à afficher la mémoire disponible avec "freeMemory();". J'ai obtenu des résultats pour le moins farfelus du genre :

    1. j'ouvre l'application - fm = 2, ... Mo, (le max alloué étant 64Mo),
    2. j'en conclus que ce n'est pas la peine de charger une image de 26 Mo. Je le fais quand même : ça passe sans problème,
    3. je supprime cette image , un coup fm est de l'ordre de qq Mo, un coup fm est de l'ordre de qq dizaines de Mo ???

    J'ai l'impression que Java fait son ménage réel lorsqu'on lui demande vraiment de la mémoire ; c'est à dire au moment où il doit exécuter une instruction demandant de la mémoire.

    Je vais continuer à chercher ... Si vous avez des idées.

    Cordialement.

    Pierre.

  4. #4
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Si tu veux vraiment voir ce que ta JVM a en mémoire, tu peux utiliser des "profilers": ce sont des outils très pratiques qui dissèquent en temps réel la mémoire pour indiquer quels objets utilisent combien de mémoire.

    - plugin TPTP pour Eclipse (grauit)
    - Jprobe, plus efficace... et énormément plus cher

    Là où JProbe est très efficace, c'est qu'il peut dire pour chaque objet, quel autre objet à une référence sur celui-ci.

    Or celà est directement lié à la récupération de mémoire par le ramasse-miettes. En effet, celui-ci ne libère la mémoire d'un objet que si celui-ci n'est plus utilisé (donc, si cet objet n'est plus référencé par d'autres)

    Donc, tu peux perdre de la mémoire si un objet devenu inutile est toujours référencé quelque par dans l'application: sa mémoire ne sera alors pas libérée. Ce genre d'erreur de programmation est la première source des "fuites de mémoire", en java.
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Pour les objets qui utilisent des ressources critiques, comme les descripteurs de fichiers, ou la mémoire, il existe presque toujours une méthode qui permet de liberer la ressource avant le passage du GC.

    Pour les images, c'est java.awt.Image.flush().

  6. #6
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par Sanguko
    ... Pour les images, c'est java.awt.Image.flush().
    Je l'ai appliqué à la fermeture de la fenêtre, mais cela n'a pas changé grand chose.
    Ouh la, la que c'est dur.

    Cordialement.

    Pierre

  7. #7
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par CyberChouan
    ... Donc, tu peux perdre de la mémoire si un objet devenu inutile est toujours référencé quelque par dans l'application: sa mémoire ne sera alors pas libérée. Ce genre d'erreur de programmation est la première source des "fuites de mémoire", en java.
    J'ai pris en compte cette notion, mais étant débutant, je ne l'ai peut-être pas bien appliquée. A mon avis, je n'ai plus de référencement, mais je vais essayer de mieux analyser. Par exemple, à la création de ma nouvelle fenêtre, j'en garde un pointeur par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try {
        fenetreImg.setSelected(true);
    } catch (Exception e){};
    fenetreActive = (FenetreImg)bureau.getSelectedFrame(); // Récupération de la fenêtre active
    Je suppose que c'est cela un référencement. A la fermeture de cette fenêtre, je fais donc :
    Je suppose que cela annule le référencement ?

    Cordialement.

    Pierre

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

    Citation Envoyé par ChPr
    Je me suis amusé à afficher la mémoire disponible avec "freeMemory();". J'ai obtenu des résultats pour le moins farfelus du genre
    C'est normal : freeMemory() indique la mémoire directement disponible sans réallocation système. En effet la JVM alloue la mémoire par bloc.

    Si tu utilises Java 5.0 le mieux est d'utiliser les MXBean...

    Plus d'info : Comment connaitre la mémoire utilisée par notre application pendant son exécution ?

    a++

  9. #9
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Super,

    c'est exactement ce que je cherchais : potentiellement dispo = max-(total-free)

    Merci beaucoup.

    Pierre

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

Discussions similaires

  1. [AC-2003] Récupération de formulaire "Mémoire insuffisante"
    Par ronibalbo dans le forum IHM
    Réponses: 4
    Dernier message: 05/05/2010, 15h27
  2. Récupération informations mémoire Oracle 9i
    Par nicotine78 dans le forum Oracle
    Réponses: 5
    Dernier message: 19/09/2007, 10h05
  3. [DOM] récupération de mémoire
    Par hamma2 dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 18/06/2006, 18h12
  4. [System] Récupération de la taille mémoire de son programme
    Par splend_f dans le forum Général Java
    Réponses: 13
    Dernier message: 02/04/2006, 03h24
  5. Réponses: 5
    Dernier message: 12/12/2005, 14h39

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