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 ?

24voto

guest Points 21

Vous pouvez déclencher un GC à partir de la ligne de commande. Ceci est utile pour les batch/crontab :

jdk1.7.0/bin/jcmd <pid> GC.run

Voir :

23voto

Pete Kirkham Points 32484

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 ?".

17voto

Pinkesh Sharma Points 451

Pour demander manuellement la GC (pas à partir de System.gc()) :

  1. Allez dans le dossier bin du JDK, par exemple. C:\Program Fichiers \Java\jdk1.6.0_31\bin
  2. Ouvrez jconsole.exe
  3. Connectez-vous au processus local souhaité.
  4. Allez à l'onglet mémoire et cliquez sur exécuter GC.

14voto

Cameron McKenzie Points 199

Comment forcer la GC de Java

Ok, voici quelques façons différentes de force Java GC.

  1. Cliquez sur l'icône de JConsole Perform GC bouton
  2. Utilisez la fonction jmap -histo:live 7544 commande où 7544 est le pid
  3. Appelez la console de diagnostic Java jcmd 7544 GC.run commande
  4. Appelez System.gc(); dans votre code
  5. Appelez Runtime.getRuntime().gc() ; dans votre code

enter image description here

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.

enter image description here

12voto

Nicholas Jordan Points 434

.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.

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