126 votes

Quand System.gc() fait-il quelque chose ?

Je sais que le ramassage des ordures est automatisé en Java. Mais j'ai compris que si vous écrivez System.gc() dans votre code, la VM Java peut décider ou non, au moment de l'exécution, d'effectuer un ramassage des déchets à ce moment-là. Comment cela fonctionne-t-il précisément ? Sur quelle base/avec quels paramètres exactement la VM décide-t-elle de faire (ou de ne pas faire) une GC lorsqu'elle voit un objet de type System.gc() ? Existe-t-il des exemples dans lesquels il est une bonne idée de mettre cela dans votre code ?

12voto

Patrick Points 20392

System.gc() est implémenté par la VM, et ce qu'il fait est spécifique à l'implémentation. L'implémenteur pourrait simplement retourner et ne rien faire, par exemple.

Quant à savoir quand lancer un collect manuel, la seule fois où vous pouvez vouloir le faire est lorsque vous abandonnez une grande collection contenant des tas de collections plus petites - une Map<String, LinkedList<...>> par exemple - et que vous voulez essayer de prendre le coup de perfusion à ce moment-là, mais pour la plupart, vous ne devriez pas vous en inquiéter. Le GC sait mieux que vous - malheureusement - la plupart du temps.

8voto

Peter Lawrey Points 229686

Si vous utilisez des tampons en mémoire directe, la JVM n'exécute pas la GC pour vous, même si vous êtes à court de mémoire directe.

Si vous appelez ByteBuffer.allocateDirect() et que vous obtenez un OutOfMemoryError, vous pouvez constater que cet appel est correct après avoir déclenché un GC manuellement.

5voto

eckes Points 1191

La plupart des JVM déclencheront une GC (en fonction des commutateurs -XX:DiableExpliciteGC et -XX:+ExplicitGCInvokesConcurrent). Mais la spécification est simplement moins bien définie afin de permettre de meilleures implémentations par la suite.

La spécification doit être clarifiée : Bogue n° 6668279 : (spec) System.gc() devrait indiquer que nous ne recommandons pas son utilisation et ne garantissons pas son comportement.

En interne, la méthode gc est utilisée par RMI et NIO, et ils exigent une exécution synchrone, ce qui : est actuellement en discussion :

Bogue n° 5025281 : Permettre à System.gc() de déclencher des collections complètes simultanées (pas d'arrêt du monde)

4voto

Naveen Points 18

La collecte d'ordures est une bonne chose en Java, si nous exécutons un logiciel codé en Java sur un ordinateur de bureau/portable parce qu'il aura une mémoire vive très performante. Vous pouvez donc appeler System.GC() ou Runtime.c() en Java.

Mais n'utilisez pas explicitement la collecte d'ordures dans Android car cela ralentit votre activité. En fait, de contexte à contexte, Android appelle implicitement System.gc()

2voto

Normalement, la VM effectue automatiquement un garbage collection avant de lever une exception OutOfMemoryException. L'ajout d'un appel explicite ne devrait donc pas être utile, si ce n'est qu'il déplace peut-être le problème de performance à un moment antérieur.

Cependant, je pense avoir rencontré un cas où cela pourrait être pertinent. Je n'en suis pas sûr, car je dois encore tester si cela a un effet quelconque :

Lorsque vous mappez un fichier en mémoire, je crois que l'appel map() lève une IOException lorsqu'un bloc de mémoire suffisamment grand n'est pas disponible. Un garbage collection juste avant le fichier map() pourrait aider à éviter cela, je pense. Qu'en pensez-vous ?

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