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?Sous la documentation de OutOfMemoryError elle déclare qu'elle ne sera pas lancée, sauf si la VM n'a pas réussi à récupérer la mémoire à la suite d'un garbage collection complet. Ainsi, si vous continuez à allouer de la mémoire jusqu'à ce que vous obteniez l'erreur, vous aurez déjà forcé un ramassage complet de la mémoire.
On peut supposer que la question que vous vouliez vraiment poser était "comment puis-je récupérer la mémoire que je pense devoir récupérer par la collecte des déchets ?".
Comment forcer la GC de Java
Ok, voici quelques façons différentes de force Java GC.
- Cliquez sur l'icône de JConsole
Perform GC
bouton - Utilisez la fonction
jmap -histo:live 7544
commande où 7544 est le pid - Appelez la console de diagnostic Java
jcmd 7544 GC.run
commande - Appelez
System.gc();
dans votre code - Appelez
Runtime.getRuntime().gc()
; dans votre code
Aucun d'entre eux ne fonctionne
Voici le sale petit secret. Aucune de ces méthodes n'est garantie de fonctionner. Vous ne pouvez vraiment pas forcer Java GC .
Les algorithmes de collecte des déchets de Java sont non déterministes et, bien que toutes ces méthodes puissent inciter la JVM à effectuer la GC, vous ne pouvez pas la forcer. Si la JVM a trop de choses à faire et qu'une opération d'arrêt du monde n'est pas possible, ces commandes vont soit échouer, soit s'exécuter mais la GC n'aura pas lieu.
if (input.equalsIgnoreCase("gc")) {
System.gc();
result = "Just some GC.";
}
if (input.equalsIgnoreCase("runtime")) {
Runtime.getRuntime().gc();
result = "Just some more GC.";
}
Réglez ce foutu problème
Si vous avez une fuite de mémoire ou un problème d'allocation d'objet, alors réparez-le. Rester assis avec votre doigt sur le bouton de Java Mission Control Force Java GC
le bouton ne fait qu'enfoncer le clou. Établissez le profil de votre application avec Enregistreur de vol Java visualisez les résultats dans VisualVM ou JMC, et corrigez le problème. Essayer de forcer Java GC est un jeu de dupes.
.gc est un candidat à l'élimination dans les prochaines versions - un ingénieur de Sun a dit un jour que moins de vingt personnes dans le monde savaient utiliser .gc() - J'ai travaillé la nuit dernière pendant quelques heures sur une structure de données centrale / critique en utilisant des données générées par SecureRandom, à un peu plus de 40 000 objets, la machine virtuelle ralentissait comme si elle était à court de pointeurs. Il est clair qu'elle s'étouffait dans les tables de pointeurs 16 bits et présentait un comportement classique de "machinerie défaillante".
J'ai essayé -Xms et ainsi de suite, j'ai continué à tourner jusqu'à ce qu'il atteigne environ 57,xxx quelque chose. Puis il s'exécutait gc en passant de disons 57 127 à 57 128 après un gc() - à peu près au rythme du code-bloat du camp Easy Money.
Votre conception doit être fondamentalement retravaillée, probablement par une approche de fenêtre coulissante.