Libérer immédiatement un object avec le Garbage Collector

Le Garbage Collector, aussi appelé ramasse-miette, prend en charge les opérations d'allocation et de libération de mémoire. Ce mécanisme automatique apporte plusieurs avantages aux développeurs :
éviter les fuites mémoires et la gestion de la durée de vie d'un objet,
faciliter la création et le partage d'objet sans se soucier de sa libération,
optimiser l'utilisation des blocs mémoire.

A tort ou à raison, la plupart des langages ont adopté ce principe. En plus du rôle formateur d'une allocation  manuelle, un create - destroy permet d'avoir un contrôle absolu sur les objets de son application.
Voici un exemple ou le ramasse-miette est un obstacle.

Cas de figure
Prenons un JFrame sur lequel on ajoute un composant JPanel affichant une image
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
this.imagePanel = new JImagePanel("c:\\monimage.png");
this.imagePanel.setStretch(false);
this.imagePanel.setBounds(10, 10,200,200);
this.add(imagePanel);
this.imagePanel.repaint();
this.pack();
}

Comment supprimer imagePanel pour y créer un autre JPanel à la place ???
private void jButton2MouseClicked(java.awt.event.MouseEvent evt) {
this.imagePanel.free;
this.imagePanel.destroy;
}
Réponse: cannot find symbol method free() !!!


Appeler implicitement le Garbage Collector
Dans le finalize() de chaque class, toutes les variables qui ne sont plus utilisées sont automatiquement libérées avec l'instruction System.gc().
Pour supprimer un objet, nous allons utiliser le même principe:
retirer l'objet de son parent avec remove,
effacer le contenu de la variable,
lancer le Garbage Collector pour 'ramasser les miettes' qui ne sont plus utilisées en mémoire.

private void jButton2MouseClicked(java.awt.event.MouseEvent evt) {
this.remove(imagePanel);
this.imagePanel = null;
System.gc();
//control visuelle avec this.repaint();
// this.imagePanel est supprimé et peut à nouveau être utilisé
this.imagePanel = new JImagePanel("c:\\monimage.png");
...
}

Commentaire des internautes
avatar
l\'indik le 21/08/2012
Sauf que si l'objet n'est plus utilisé, quand tu fait ton new , la mémoire sera automatiquement libéré si cela est nécessaire. Donc l'utilisation de System.gc() n'est pas très utile ici... (et si ton but est d'explicitement enlever l'objet de la mémoire, System.gc() ou pas, dans tous les cas, tu ne sauras même pas quels objets sont retiré de la mémoire, vu qu'elle est vidé partiellement).
Ajouter un commentaire
Pseudo
Adresse email
Site internet (optionnel)
Votre commentaire
Fiche de l'article
Mise a jour21/07/2010
VisualisationVu 1424 fois
PublicInternaute
CategorieJAVA - Tutorial - Premiers Pas
Auteur de l'article
fobec fobec
connecté le 06/12/2012
37 ans - France Nord-Est
42 articles dans la section
Contacter l'auteur
Partager l'article