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 ?
Réponses
Trop de publicités?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.
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();
}
}
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) .
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.
- Réponses précédentes
- Plus de réponses