Après répondant à une question sur la façon de objets sans force en Java (le gars effaçait un HashMap de 1,5GB) avec System.gc()
on m'a dit que c'était une mauvaise pratique d'appeler System.gc()
manuellement, mais les commentaires n'ont pas été entièrement convaincants. En outre, personne n'a semblé oser mettre une note supérieure ou inférieure à ma réponse.
On m'y a dit que c'était une mauvaise pratique, mais on m'a aussi dit que les exécutions du ramasseur d'ordures n'arrêtent plus systématiquement le monde, et qu'il pourrait aussi effectivement être utilisé par la JVM uniquement comme un indice, donc je suis un peu perdu.
Je comprends que la JVM sait généralement mieux que vous quand elle doit récupérer de la mémoire. Je comprends également que s'inquiéter de quelques kilo-octets de données est stupide. Je comprends aussi que même les mégaoctets de données ne sont plus ce qu'ils étaient il y a quelques années. Mais quand même, 1,5 gigaoctets ? Et vous connaître il y a environ 1,5 Go de données qui traînent en mémoire ; ce n'est pas comme si c'était un coup dans le vide. Est-ce que System.gc()
systématiquement mauvais, ou y a-t-il un point à partir duquel cela devient acceptable ?
Donc la question est en fait double :
- Pourquoi est-ce ou non une mauvaise pratique d'appeler
System.gc()
? S'agit-il vraiment d'un simple indice pour la JVM dans certaines implémentations, ou s'agit-il toujours d'un cycle de collecte complet ? Existe-t-il vraiment des implémentations de garbage collector qui peuvent faire leur travail sans arrêter le monde ? Merci de nous éclairer sur les diverses affirmations faites dans les commentaires de mon article. réponse . - Où est le seuil ? Est-ce que c'est jamais une bonne idée d'appeler
System.gc()
ou y a-t-il des moments où c'est acceptable ? Si oui, quels sont ces moments ?
4 votes
Je pense qu'un bon moment pour appeler System.gc() est lorsque vous faites quelque chose qui est déjà un long processus de chargement. Par exemple, je travaille sur un jeu et je prévois d'appeler System.gc() lorsque le jeu charge un nouveau niveau, à la fin du processus de chargement. L'utilisateur attend déjà un peu, et l'augmentation supplémentaire des performances peut en valoir la peine ; mais je vais également placer une option dans l'écran de configuration pour désactiver ce comportement.
1 votes
Un autre cas a été expliqué dans java-monitor.com/forum/showthread.php?t=188 Où il est expliqué que ce peut être une mauvaise pratique d'appeler la fonction System.gc()
0 votes
Juste mes deux centimes après avoir lu certaines des réponses (et il faut noter que je suis assez nouveau à Java, donc s'il vous plaît prenez mon opinion avec un grain de sel), mais... Je pense que la meilleure question pourrait être "pourquoi avez-vous un si grand HashMap en premier lieu ?"