EXEMPLE : Nettoyage automatique de ressources Java avec Gc.exe

Cet article peut contenir des liens vers des informations en langue anglaise (pas encore traduites).

Résumé

Lorsque vous supprimez la dernière référence à un objet Java, celui-ci n'est pas libéré immédiatement. Les objets Java ne sont supprimés que lorsque le garbage collector Java fonctionne. Si votre classe Java contient des ressources limitées (comme des connexions de base de données, des canaux nommés, des sockets, etc.), vous pouvez vous trouver à court de ressources même si vous n'avez qu'une seule référence à une ressource limitée. Comparez ce comportement à celui de C++, où les objets sont libérés immédiatement lorsque vous les supprimez.

Le fichier Gc.exe contient un exemple qui montre comment nettoyer automatiquement des objets Java supprimés et les ressources qu'ils détiennent. Il effectue cette opération en exécutant le garbage collector dans le constructeur de classe lorsque le nombre d'objets alloué dépasse la limite spécifiée.

Plus d'informations

Vous pouvez télécharger le fichier suivant à partir du Centre de téléchargement Microsoft (en anglais) :
Pour plus d'informations sur le téléchargement des fichiers du Support technique Microsoft, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft.
119591 Comment obtenir des fichiers de support technique Microsoft auprès des services en ligne
Microsoft a analysé ce fichier en vue de détecter la présence de virus. Microsoft a utilisé les logiciels de détection de virus les plus récents disponibles à la date de publication de ce fichier. Le fichier est conservé sur des serveurs sécurisés, empêchant toute modification non autorisée du fichier.


Codebase.dat 38
Form1.java 3989
Gc.sln 501
Gc.suo 4608
Gc.vjp 4666
Nested.java 656
Waste.java 359

AVERTISSEMENT : exécuter le garbage collector Java revient très cher. Pour certaines applications, il peut être préférable de nettoyer les objets manuellement plutôt que d'utiliser le garbage collector en vue d'un nettoyage automatique. L'inconvénient du nettoyage manuel réside dans le fait qu'il rompt le paradigme de la programmation orientée objet. Par exemple, un autre programmeur qui ajoute de nouvelles ressources à votre classe peut les nettoyer dans la routine de finalisation, mais oublier de faire le nettoyage manuel. La méthode présentée dans cet exemple vous permet d'imiter au mieux le nettoyage C++.


L'exemple montre comment nettoyer le constructeur de l'objet. Vous gardez un membre statique que vous incrémentez dans votre constructeur et décrémentez dans votre méthode de finalisation. Dans votre constructeur, vous vérifiez si vous avez dépassé le nombre limite d'objets alloués. Si vous dépassez la limite, vous appelez le garbage collector à partir de votre constructeur. L'appel de doObjectCleanup() nettoie habituellement des objets orphelins avec la machine virtuelle Microsoft (Microsoft VM) actuelle.

REMARQUE : il n'existe aucune garantie que toutes les implémentations à venir de Microsoft VM se comporteront de la même façon ou que d'autres machines virtuelles nettoieront tous les objets orphelins.

Les deux classes Java complètes suivantes indiquent comment limiter le nombre des objets qui ne sont pas collectés par le garbage collector :

public class CgcCtor{
public static final int MaxCnt = 10;
public static long m_cnt = 0;

public CgcCtor(){
m_cnt++;
if (m_cnt > MaxCnt)
Kleen.doObjectCleanup();
}
public void finalize(){
m_cnt--;
}
}

class Kleen{
public static void doObjectCleanup(){
System.gc();
System.runFinalization();
System.gc();
}

}
Après avoir créé le projet GC, exécutez le programme et cliquez à plusieurs reprises sur le bouton Create. Le champ Objects indique le nombre d'objets en mémoire (pas dans le garbage collector), le champ Objects in array indique le nombre actuel d'objets qui n'ont pas été libérés (les objets pour lesquels il existe encore des références en mémoire). Si vous créez plusieurs objets, les champs Objects et Objects in array sont identiques. Cliquer sur le bouton Delete libère un objet, mais le système n'exécutera probablement pas le garbage collector, de sorte que le champ Objects ne sera pas décrémenté. (Si votre niveau de mémoire virtuelle est très bas, la machine virtuelle peut exécuter le garbage collector).

Cliquer sur le bouton GC appelle System.gc() une fois. Cliquer sur le bouton Finalize appelle System.runFinalization() une fois. Cliquer sur le bouton GC/Finalize/GC effectue les appels de la méthode doObjectCleanup() présentée plus haut dans cet article.


Si vous sélectionnez le bouton Create with GC, le constructeur de classe exécute le garbage collector si m_cnt est suffisamment élevé (supérieur à 10).


Notez qu'appeler System.gc() ne suffit pas toujours à nettoyer tous les objets en suspens. Après un appel System.gc() unique, certains objets peuvent simplement être marqués en vue de leur suppression lors de la prochaine exécution du garbage collector. La séquence suivante est plus appropriée :
System.gc();
System.runFinalization();
System.gc();

Références

Pour obtenir les articles les plus récents de la Base de connaissances Microsoft ainsi que des informations complémentaires du support technique relatives à Visual J++ et au Kit de développement (SDK) pour Java, reportez-vous au site Web de Microsoft aux adresses suivantes :
Propriétés

ID d'article : 231183 - Dernière mise à jour : 13 sept. 2005 - Révision : 1

Commentaires