OVH Cloud OVH Cloud

Supprimer une image en mémoire

17 réponses
Avatar
AureL
Bonjour,

J'ai créé un logiciel de traitement d'images.

Ce que je veux faire :
- ouvrir en mémoire une image (souvent de très grande taille)
- redimensionner cette image pour qu'elle utilise moins de mémoire
- afficher dans mon logiciel cette nouvelle image redimensionnée
- supprimer l'image de base qui prend énormément de mémoire

Mon problème :
J'arrive à faire tout cela sauf le dernier point, c'est à dire supprimer
l'image de la mémoire.

Voici mon code :

//** chargement image **
Image largeImage = new ImageIcon(absolutePath).getImage();
tracker = new MediaTracker(this);
tracker.addImage(realImage, 0);
try {
tracker.waitForID(0);
tracker.removeImage(realImage);
} catch (InterruptedException e) {
e.printStackTrace();
}

//** redimensionne image **
BufferedImage destImage = JImage.toBufferedImage(largeImage,
nouvellesDimensions);
Image imageFinale = getToolkit().createImage(destImage.getSource());
destImage = null;
largeImage = null;


Au final, mon image "destImage" correspond à celle de base mais
redimensionnée avec les dimensions "nouvellesDimensions".
Mais l'espace alloué pour "largeImage" n'a pas l'air d'avoir été supprimé.

Une aide ? une idée ? un commentaire ?

Merci d'avance en tout cas :)

AureL

10 réponses

1 2
Avatar
Symon
Your "largeImage" will be removed from memory when the garbage collector
will inspect it.

You can invoke the garbage collector manually using Runtime or System :

System.gc();
Runtime.getRuntime().gc();

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#gc()

Symon

AureL wrote:
Bonjour,

J'ai créé un logiciel de traitement d'images.

Ce que je veux faire :
- ouvrir en mémoire une image (souvent de très grande taille)
- redimensionner cette image pour qu'elle utilise moins de mémoire
- afficher dans mon logiciel cette nouvelle image redimensionnée
- supprimer l'image de base qui prend énormément de mémoire

Mon problème :
J'arrive à faire tout cela sauf le dernier point, c'est à dire supprimer
l'image de la mémoire.

Voici mon code :

//** chargement image **
Image largeImage = new ImageIcon(absolutePath).getImage();
tracker = new MediaTracker(this);
tracker.addImage(realImage, 0);
try {
tracker.waitForID(0);
tracker.removeImage(realImage);
} catch (InterruptedException e) {
e.printStackTrace();
}

//** redimensionne image **
BufferedImage destImage = JImage.toBufferedImage(largeImage,
nouvellesDimensions);
Image imageFinale = getToolkit().createImage(destImage.getSource());
destImage = null;
largeImage = null;


Au final, mon image "destImage" correspond à celle de base mais
redimensionnée avec les dimensions "nouvellesDimensions".
Mais l'espace alloué pour "largeImage" n'a pas l'air d'avoir été supprimé.

Une aide ? une idée ? un commentaire ?

Merci d'avance en tout cas :)

AureL





Avatar
Symon
Désolé pour la réponse en anglais ... Je me croyais sur c.l.j.programmer
! ;o)

Symon wrote:

Your "largeImage" will be removed from memory when the garbage collector
will inspect it.

You can invoke the garbage collector manually using Runtime or System :

System.gc();
Runtime.getRuntime().gc();

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#gc()

Symon

AureL wrote:

Bonjour,

J'ai créé un logiciel de traitement d'images.

Ce que je veux faire :
- ouvrir en mémoire une image (souvent de très grande taille)
- redimensionner cette image pour qu'elle utilise moins de mémoire
- afficher dans mon logiciel cette nouvelle image redimensionnée
- supprimer l'image de base qui prend énormément de mémoire

Mon problème :
J'arrive à faire tout cela sauf le dernier point, c'est à dire
supprimer l'image de la mémoire.

Voici mon code :

//** chargement image **
Image largeImage = new ImageIcon(absolutePath).getImage();
tracker = new MediaTracker(this);
tracker.addImage(realImage, 0);
try {
tracker.waitForID(0);
tracker.removeImage(realImage);
} catch (InterruptedException e) {
e.printStackTrace();
}

//** redimensionne image **
BufferedImage destImage = JImage.toBufferedImage(largeImage,
nouvellesDimensions);
Image imageFinale = getToolkit().createImage(destImage.getSource());
destImage = null;
largeImage = null;


Au final, mon image "destImage" correspond à celle de base mais
redimensionnée avec les dimensions "nouvellesDimensions".
Mais l'espace alloué pour "largeImage" n'a pas l'air d'avoir été
supprimé.

Une aide ? une idée ? un commentaire ?

Merci d'avance en tout cas :)

AureL







Avatar
Justinver
Bonjour,

Vous avez essayé la méthode flush ? mais il me semble qu'elle libère la
mémoire que si l'image a été créée à partir d'un ImageProducer.


Bonjour,

J'ai créé un logiciel de traitement d'images.

Ce que je veux faire :
- ouvrir en mémoire une image (souvent de très grande taille)
- redimensionner cette image pour qu'elle utilise moins de mémoire
- afficher dans mon logiciel cette nouvelle image redimensionnée
- supprimer l'image de base qui prend énormément de mémoire

Mon problème :
J'arrive à faire tout cela sauf le dernier point, c'est à dire supprimer
l'image de la mémoire.

Voici mon code :

//** chargement image **
Image largeImage = new ImageIcon(absolutePath).getImage();
tracker = new MediaTracker(this);
tracker.addImage(realImage, 0);
try {
tracker.waitForID(0);
tracker.removeImage(realImage);
} catch (InterruptedException e) {
e.printStackTrace();
}

//** redimensionne image **
BufferedImage destImage = JImage.toBufferedImage(largeImage,
nouvellesDimensions);
Image imageFinale = getToolkit().createImage(destImage.getSource());
destImage = null;
largeImage = null;


Au final, mon image "destImage" correspond à celle de base mais
redimensionnée avec les dimensions "nouvellesDimensions".
Mais l'espace alloué pour "largeImage" n'a pas l'air d'avoir été supprimé.

Une aide ? une idée ? un commentaire ?

Merci d'avance en tout cas :)

AureL





Avatar
AureL
Merci mais j'ai essayé cette méthode, sans résultat...

Au passage, est ce que vous connaîtriez un soft pour tracer la mémoire de la
JVM...
Parce que pour l'instant, j'utilise le gestionnaire de tâches de Windows, et
ce n'est peut être pas l'idéal...

De plus, je me pose une question :
je me suis rendu compte que ma mémoire monte à un certain niveau quand je
charge une grosse image et après si je ferme cette image puis j'en charge
une autre, la mémoire reste au même niveau tout le temps... serait-ce une
histoire de mémoire fragmentée ?

Merci :)


"Symon" a écrit dans le message de news:
ctoico$hs5$

Your "largeImage" will be removed from memory when the garbage collector
will inspect it.

You can invoke the garbage collector manually using Runtime or System :

System.gc();
Runtime.getRuntime().gc();

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#gc()

Symon

AureL wrote:
Bonjour,

J'ai créé un logiciel de traitement d'images.

Ce que je veux faire :
- ouvrir en mémoire une image (souvent de très grande taille)
- redimensionner cette image pour qu'elle utilise moins de mémoire
- afficher dans mon logiciel cette nouvelle image redimensionnée
- supprimer l'image de base qui prend énormément de mémoire

Mon problème :
J'arrive à faire tout cela sauf le dernier point, c'est à dire supprimer
l'image de la mémoire.

Voici mon code :

//** chargement image **
Image largeImage = new ImageIcon(absolutePath).getImage();
tracker = new MediaTracker(this);
tracker.addImage(realImage, 0);
try {
tracker.waitForID(0);
tracker.removeImage(realImage);
} catch (InterruptedException e) {
e.printStackTrace();
}

//** redimensionne image **
BufferedImage destImage = JImage.toBufferedImage(largeImage,
nouvellesDimensions);
Image imageFinale = getToolkit().createImage(destImage.getSource());
destImage = null;
largeImage = null;


Au final, mon image "destImage" correspond à celle de base mais
redimensionnée avec les dimensions "nouvellesDimensions".
Mais l'espace alloué pour "largeImage" n'a pas l'air d'avoir été
supprimé.

Une aide ? une idée ? un commentaire ?

Merci d'avance en tout cas :)

AureL






Avatar
AureL
Bonjour,

Merci pour cette info mais j'ai testé et sans résultat...
Par contre, je vais peut être regardé comment charger mon image avec un
ImageProducer... ça pourrait être une solution non ?

Sinon, j'ai d'autres infos que j'ai mis dans ma réponse plus haut...

Merci encore !


"Justinver" a écrit dans le message de news:
41ffd6d4$0$19424$
Bonjour,

Vous avez essayé la méthode flush ? mais il me semble qu'elle libère la
mémoire que si l'image a été créée à partir d'un ImageProducer.


Bonjour,

J'ai créé un logiciel de traitement d'images.

Ce que je veux faire :
- ouvrir en mémoire une image (souvent de très grande taille)
- redimensionner cette image pour qu'elle utilise moins de mémoire
- afficher dans mon logiciel cette nouvelle image redimensionnée
- supprimer l'image de base qui prend énormément de mémoire

Mon problème :
J'arrive à faire tout cela sauf le dernier point, c'est à dire supprimer
l'image de la mémoire.

Voici mon code :

//** chargement image **
Image largeImage = new ImageIcon(absolutePath).getImage();
tracker = new MediaTracker(this);
tracker.addImage(realImage, 0);
try {
tracker.waitForID(0);
tracker.removeImage(realImage);
} catch (InterruptedException e) {
e.printStackTrace();
}

//** redimensionne image **
BufferedImage destImage = JImage.toBufferedImage(largeImage,
nouvellesDimensions);
Image imageFinale = getToolkit().createImage(destImage.getSource());
destImage = null;
largeImage = null;


Au final, mon image "destImage" correspond à celle de base mais
redimensionnée avec les dimensions "nouvellesDimensions".
Mais l'espace alloué pour "largeImage" n'a pas l'air d'avoir été
supprimé.

Une aide ? une idée ? un commentaire ?

Merci d'avance en tout cas :)

AureL






Avatar
noone
AureL wrote:
Bonjour,

J'ai créé un logiciel de traitement d'images.

Ce que je veux faire :
- ouvrir en mémoire une image (souvent de très grande taille)
- redimensionner cette image pour qu'elle utilise moins de mémoire
- afficher dans mon logiciel cette nouvelle image redimensionnée
- supprimer l'image de base qui prend énormément de mémoire


Bonjour

Pourquoi ne pas appeler un programme en C++ qui serait peut-être plus
rapide... ?

voir du côté de
ImageMagick
http://www.imagemagick.org/

et plus particulièrement mogrify

Faire une interface entre C++ et Java avec JNI (?)

Cordialement

PS : désolé si je raconte des bétises mais je ne suis pas spécialiste de
Java...
je me dis seulement que c'est dommage de réinventer la roue... (surtout
quand celle qu'on va faire risque d'être carrée ;-)

Avatar
ownowl
AureL wrote:
Merci mais j'ai essayé cette méthode, sans résultat...

Au passage, est ce que vous connaîtriez un soft pour tracer la mémoire de la
JVM...


optimizeit, jprobe, jprofiler, YourKit...

je connais surtout le premier, qui est trés efficace

Avatar
Hervé AGNOUX
AureL wrote:


Au passage, est ce que vous connaîtriez un soft pour tracer la mémoire de
la JVM...
Parce que pour l'instant, j'utilise le gestionnaire de tâches de Windows,
et ce n'est peut être pas l'idéal...



Dans la plupart des cas, pour ne pas dire dans tous les cas, la JVM ne
libère jamais la mémoire pour la rendre au système d'exploitation. Quand on
dit que le ramasse miettes libère de la mémoire, c'est simplement qu'il la
rend disponible pour de nouveaux objets java, mais absolument pas qu'il la
rend disponible pour d'autres applications.

Il y a des bruits qui courent selon quoi la situation serait plus souple
avec le jdk 5.0. A vérifier.

Il y a aussi des bruits qui courent comme quoi les deux options non
garanties suivantes pourraient améliorer les choses : -XX:MinHeapFreeRatio
et -XX:MaxHeapFreeRatio. A vérifier pareil.

Et il paraît qu'il y aurait des JVM qui ne serait pas comme ça, mais qui ne
serait pas de Sun. A chercher.


--
Hervé AGNOUX
http://www.diaam-informatique.com

Avatar
Justinver
Bonjour,

Java est portable, non payant et dispose de classes d'une très grande
richesse.



AureL wrote:

Bonjour,

J'ai créé un logiciel de traitement d'images.

Ce que je veux faire :
- ouvrir en mémoire une image (souvent de très grande taille)
- redimensionner cette image pour qu'elle utilise moins de mémoire
- afficher dans mon logiciel cette nouvelle image redimensionnée
- supprimer l'image de base qui prend énormément de mémoire



Bonjour

Pourquoi ne pas appeler un programme en C++ qui serait peut-être plus
rapide... ?

voir du côté de
ImageMagick
http://www.imagemagick.org/

et plus particulièrement mogrify

Faire une interface entre C++ et Java avec JNI (?)

Cordialement

PS : désolé si je raconte des bétises mais je ne suis pas spécialiste de
Java...
je me dis seulement que c'est dommage de réinventer la roue... (surtout
quand celle qu'on va faire risque d'être carrée ;-)



Avatar
no.bcausse.spam
AureL wrote:

Mon problème :
J'arrive à faire tout cela sauf le dernier point, c'est à dire supprimer
l'image de la mémoire.


tout depend qui doit la recuperer.

a) le systeme : pas de solution
b) la VM : ne pose pas de probleme


--
bruno Causse
http://perso.wanadoo.fr/othello

1 2