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

2D Java Discussion :

gestion mémoire et BufferedImage


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 395
    Billets dans le blog
    1
    Par défaut gestion mémoire et BufferedImage
    Salut,

    je crée des BufferedImage en utilisant la fonction createCompatibleImage de GraphicsConfiguration, mais le flush() de BufferedImage ne libère pas la mémoire utilisée ?

    Comment ça se fait ?
    Que dois-je faire pour y remédier ?

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Le flush n'agit pas sur les pixels contenus dans le BufferedImage.
    Pour libérer la mémoire, il faut affecter null à l'instance.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre expérimenté
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 395
    Billets dans le blog
    1
    Par défaut
    C'est étrange, j'ai essayé null et flush, ça ne libère pas la mémoire.

    Par contre les BufferedImage crées par le chargement par les méthodes ImageIO.read de javax.imageio libèrent bien leur mémoire avec un flush sans besoin d'annuler le pointeur.

    Je suppose que la méthode pour libérer la mémoire d'une BufferedImage existe mais je n'arrive pas à la trouver. J'ai fouillé dans la classe Raster sans meilleur résultat.

    Je fais un jeu vidéo qui demande une bonne gestion mémoire pour bien fonctionner et le fait de ne pas pouvoir libérer la mémoire de ces types d'images est un sérieux handicap.

    Pour l'instant l'optimisation que j'ai fait consiste à en créer le moins possible et à les réutiliser. Mais ça fait au minimum un buffer par taille d'image de travail et la mémoire se remplit petit à petit sans moyen de la vider.

    Là j'ai vraiment besoin de libérer cette mémoire et je ne peux pas croire que les gars de Sun n'aient jamais été confrontés au problème.

    Vivement une solution.

  4. #4
    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
    Il n'y a pas de méthodes explicites puisqu'a priori, la libération est automatique.

    J'ai essayé, et a priori je n'ai pas de problèmes de libération. Je suis en java 6.

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Tant que la JVM n'a pas besoin de plus de mémoire, il n'y a que très peu de chance pour que le garbage collector soit lancé. Contente-toi de supprimer les instances des BufferedImage que tu n'utilises plus, et la JVM fera le reste.
    Au besoin, fait quelques tests avec un System.gc() pour voir si ça change quelque chose.
    Pense aussi à libérer du temps pour ta JVM. Je pense par exemple à un thread sans pause très consommateur (CPU, accès disque) : la JVM mettra un peu plus de temps à se décider à libérer la mémoire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Membre expérimenté
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 395
    Billets dans le blog
    1
    Par défaut pas mieux pour le moment
    Merci pour vos conseils mais ca ne me fonctionne toujours pas.

    J'utilise System.runFinalization et System.gc pour obliger le Garbage Collector à fonctionner, et j'ai intégré le processus dans une boucle qui permet de savoir si l'action du Garbage Collector est terminée ou non.

    Je travaille en monotache. C'est un jeu vidéo que je fais, je dois contrôler parfaitement les ressources et en particulier la mémoire. Pour ce qui est du processeur, je me débrouille très bien.

    Je suis moi aussi en java 1.6 et la libération de mémoire ne se fait pas dans le cas suivant :

    - Création de l'image par GraphicsConfiguration.createCompatibleImage()
    - Libération suposée par flush() et annulation du pointeur

    Au secours ! J'ai besoin de cette libération de mémoire, de mon côté je vous tiens au courant si j'ai du nouveau et je continue à fouiller.

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

Discussions similaires

  1. Thread POSIX et gestion mémoire
    Par pier* dans le forum POSIX
    Réponses: 1
    Dernier message: 07/07/2006, 21h36
  2. TAO, Value types et gestion mémoire
    Par TiChabin972 dans le forum CORBA
    Réponses: 1
    Dernier message: 25/04/2006, 20h55
  3. [D7] Tableau dynamique et Gestion mémoire
    Par Cl@udius dans le forum Langage
    Réponses: 7
    Dernier message: 13/03/2006, 15h16
  4. [Gestion mémoire] SetLength sur TDoubleDynArray
    Par MD Software dans le forum Langage
    Réponses: 14
    Dernier message: 24/04/2005, 21h11
  5. Gestion mémoire des Meshes (LPD3DXMESH)
    Par [Hideki] dans le forum DirectX
    Réponses: 1
    Dernier message: 08/07/2003, 20h34

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