C'est une question très gênante, et je pense que beaucoup de gens s'opposent à Java malgré l'utilité d'un langage.
Le fait que vous ne puissiez pas faire confiance à «System.gc» pour faire quoi que ce soit est incroyablement intimidant et peut facilement invoquer la sensation «Peur, incertitude, doute» du langage.
Dans de nombreux cas, il est agréable de traiter les pics de mémoire que vous causez exprès avant qu'un événement important ne se produise, ce qui inciterait les utilisateurs à penser que votre programme est mal conçu / ne répond pas.
Avoir la capacité de contrôler la collecte des ordures serait un très bon outil d'éducation, améliorant à son tour la compréhension du fonctionnement de la collecte des ordures et la façon dont les programmes exploitent son comportement par défaut ainsi que son comportement contrôlé.
Permettez-moi de passer en revue les arguments de ce fil.
- C'est inefficace:
Souvent, le programme ne fait rien et vous savez qu'il ne fait rien à cause de la façon dont il a été conçu. Par exemple, il peut faire une longue attente avec une grande boîte de message d'attente, et à la fin, il peut également ajouter un appel pour collecter les ordures, car le temps de l'exécuter prendra une très petite fraction du temps de la longue attente, mais cela évitera à gc d'agir au milieu d'une opération plus importante.
- C'est toujours une mauvaise pratique et indique un code cassé.
Je ne suis pas d'accord, peu importe ce que vous avez à ramasser. Son travail consiste à suivre les déchets et à les nettoyer.
En appelant le gc pendant les périodes où l'utilisation est moins critique, vous réduisez les chances qu'il s'exécute lorsque votre vie dépend du code spécifique en cours d'exécution mais qu'il décide plutôt de collecter les ordures.
Bien sûr, il ne se comportera peut-être pas comme vous le souhaitez ou attendez, mais lorsque vous voulez l'appeler, vous savez que rien ne se passe et l'utilisateur est prêt à tolérer la lenteur / les temps d'arrêt. Si le System.gc fonctionne, tant mieux! Si ce n'est pas le cas, au moins vous avez essayé. Il n'y a tout simplement pas d'inconvénient, sauf si le garbage collector a des effets secondaires inhérents qui font quelque chose d'horriblement inattendu à la façon dont un garbage collector est censé se comporter s'il est appelé manuellement, et cela en soi provoque de la méfiance.
- Ce n'est pas un cas d'utilisation courant:
Il s'agit d'un cas d'utilisation qui ne peut pas être atteint de manière fiable, mais pourrait l'être si le système était conçu de cette façon. C'est comme faire un feu de signalisation et faire en sorte que certains / tous les boutons des feux de signalisation ne fassent rien, cela vous fait vous demander pourquoi le bouton est là pour commencer, javascript n'a pas de fonction de collecte des ordures, donc nous ne pas le scruter autant pour elle.
- La spécification indique que System.gc () est un indice que GC devrait exécuter et que la machine virtuelle est libre de l'ignorer.
qu'est-ce qu'un "indice"? qu'est-ce que "ignorer"? un ordinateur ne peut pas simplement prendre des indices ou ignorer quelque chose, il existe des chemins de comportement stricts qui peuvent être dynamiques et qui sont guidés par l'intention du système. Une bonne réponse inclurait ce que le garbage collector fait réellement, au niveau de l'implémentation, qui l'empêche d'effectuer la collecte lorsque vous le demandez. La fonctionnalité est-elle simplement un nop? Y a-t-il une sorte de conditions que je dois remplir? Quelles sont ces conditions?
En l'état, le GC de Java ressemble souvent à un monstre auquel vous ne faites pas confiance. Vous ne savez pas quand ça va venir ou partir, vous ne savez pas ce que ça va faire, comment ça va le faire. Je peux imaginer que certains experts aient une meilleure idée du fonctionnement de leur ramasse-miettes par instruction, mais la grande majorité espère simplement que cela "fonctionne" et il est frustrant de faire confiance à un algorithme d'apparence opaque pour faire le travail à votre place.
Il y a un grand écart entre lire quelque chose ou apprendre quelque chose, et en fait voir l'implémentation de celui-ci, les différences entre les systèmes, et être capable de jouer avec sans avoir à regarder le code source. Cela crée de la confiance et un sentiment de maîtrise / compréhension / contrôle.
Pour résumer, il y a un problème inhérent avec les réponses "cette fonctionnalité pourrait ne rien faire, et je n'entrerai pas dans les détails comment dire quand elle fait quelque chose et quand elle ne le fait pas et pourquoi elle ne le fera pas ou le fera, impliquant souvent qu'il est tout simplement contraire à la philosophie d'essayer de le faire, même si l'intention derrière cela est raisonnable ".
Il peut être correct pour Java GC de se comporter comme il le fait, ou non, mais pour le comprendre, il est difficile de vraiment suivre dans quelle direction aller pour obtenir un aperçu complet de ce que vous pouvez faire confiance au GC et ne pas faire, il est donc trop facile de se méfier simplement de la langue, car le but d'une langue est d'avoir un comportement contrôlé jusqu'à une mesure philosophique (il est facile pour un programmeur, en particulier les novices, de tomber dans une crise existentielle de certains comportements système / langage) vous sont capables de tolérer (et si vous ne le pouvez pas, vous n'utiliserez pas la langue tant que vous ne le devrez pas), et plus de choses que vous ne pouvez pas contrôler sans raison connue pour laquelle vous ne pouvez pas les contrôler est intrinsèquement nuisible.