274 votes

Comment forcer la collecte des déchets en Java ?

Est-il possible de forcer le garbage collection en Java, même si c'est délicat à faire ? Je connais System.gc(); y Runtime.gc(); mais ils suggèrent seulement de faire GC. Comment puis-je forcer le GC ?

201voto

Andrew Hare Points 159332

Votre meilleure option est d'appeler [System.gc()](http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#gc()) qui est simplement un indice pour le ramasseur d'ordures que vous voulez qu'il fasse une collecte. Il n'y a aucun moyen de force et la collecte immédiate, car le ramasseur de déchets est non déterministe.

65voto

shams Points 1986

El La bibliothèque jlibs dispose d'une bonne classe utilitaire pour la collecte des déchets. . Vous pouvez forcer la collecte des déchets en utilisant une petite astuce astucieuse avec Référence faible objets.

RuntimeUtil.gc() à partir des jlibs :

   /**
    * This method guarantees that garbage collection is
    * done unlike <code>{@link System#gc()}</code>
    */
   public static void gc() {
     Object obj = new Object();
     WeakReference ref = new WeakReference<Object>(obj);
     obj = null;
     while(ref.get() != null) {
       System.gc();
     }
   }

58voto

Mainguy Points 1021

La meilleure (sinon la seule) façon de forcer un GC serait d'écrire une JVM personnalisée. Je crois que les collecteurs d'ordures sont enfichables, donc vous pourriez probablement choisir une des implémentations disponibles et la modifier.

Note : Il ne s'agit PAS d'une réponse facile.

48voto

trashgod Points 136305

Utilisation de la Interface outil de la machine virtuelle Java™ (JVM TI) la fonction

jvmtiError ForceGarbageCollection(jvmtiEnv* env)

va "forcer la VM à effectuer une collecte de déchets". La JVM TI fait partie de la Architecture de débogage de la plate-forme JavaTM (JPDA) .

25voto

legramira Points 6

OUI il est presque possible de forcer vous devez appeler à des méthodes dans le même ordre et en même temps ceux-ci sont :

System.gc ();
System.runFinalization ();

même s'il n'y a qu'un seul objet à nettoyer, l'utilisation de ces deux méthodes en même temps force le ramasseur d'ordures à utiliser la méthode de nettoyage de l'objet. finalise() de l'objet inaccessible, ce qui libère la mémoire attribuée et fait ce que l'utilisateur doit faire. finalize() de la méthode.

CEPENDANT, c'est une pratique terrible d'utiliser le garbage collector parce que l'utilisation de celui-ci pourrait introduire une surcharge au logiciel qui pourrait être encore pire que sur la mémoire, le garbage collector a son propre thread qui n'est pas possible de contrôler plus dépendant de l'algorithme utilisé par le gc pourrait prendre plus de temps et est considéré comme très inefficace, vous devriez vérifier votre logiciel si il est pire avec l'aide du gc parce qu'il est certainement cassé, une bonne solution ne doit pas dépendre du gc.

NOTE : juste pour garder à l'esprit que cela ne fonctionne que si dans la méthode finalize il n'y a pas de réaffectation de l'objet, si cela se produit l'objet restera en vie et il aura une résurrection qui est techniquement possible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X