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 ?
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 ?
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.
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.
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.
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.
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.
Partager