web-dev-qa-db-fra.com

Est-ce que Go est sujet aux mêmes fuites de mémoire subtiles que Java l'est?

Voici les faits:

  • la langue Go a un garbage collector.

  • Java a une collecte des ordures

  • beaucoup de programmes Java ont des fuites de mémoire (subtiles ou non)

Comme exemple d'un programme Java qui a des fuites de mémoire (pas pour les faibles de cœur, la question peut ébranler vos croyances), voyez ici un peu Java = programme appelé Tomcat qui a même un bouton "trouver des fuites": Existe-t-il un moyen d'éviter les fuites de mémoire de non-déploiement dans Tomcat?

Je me demande donc: les programmes écrits en Go présenteront-ils le même type de fuite de mémoire (subtile ou non) que certains programmes écrits en Java exhibe?

83
SyntaxT3rr0r

Vous confondez différents types de fuites de mémoire ici.

Les fuites odieuses de mémoire basées sur la gestion explicite de la mémoire ont disparu dans Java (ou tout autre langage basé sur GC). Ces fuites sont causées par la perte totale de l'accès aux morceaux de mémoire sans les marquer comme inutilisés .

Les "fuites de mémoire" sont toujours présentes dans Java et toutes les autres langues sur la face de la planète jusqu'à ce que l'ordinateur puisse lire nos esprits sont toujours avec nous, et le seront dans un avenir prévisible. Ces fuites sont dus au fait que le code/programmeur garde des références à des objets qui ne sont plus nécessaires techniquement. Ce sont fondamentalement des bogues logiques et ne peuvent être évités dans aucun langage utilisant les technologies actuelles.

41
james

Il est très possible que les programmes Go présentent des fuites de mémoire. L'implémentation actuelle de Go a un simple ramasse-miettes à balayage. Ceci est uniquement conçu comme une solution temporaire et n'est pas conçu comme le ramasse-miettes à long terme. Voir ceci page pour plus d'informations. Regardez sous l'en-tête Go Garbage Collector. Cette page a même un lien vers le code de la version actuelle si vous êtes si enclin.

19
Poindexter

Une "fuite de mémoire", c'est quand un morceau de mémoire que le programmeur pensait être libéré ne l'est pas. Cela peut se produire dans n'importe quelle langue, que les ordures soient collectées ou non. La cause habituelle dans les langages GC est de conserver une référence supplémentaire à la mémoire.

"Les langues ne provoquent pas de fuites de mémoire, les programmeurs provoquent des fuites de mémoire".

9
DJClayworth

Garbage collection ou non, vous pouvez écrire un programme qui a des fuites de mémoire en Java, Go ou tout autre langage pour la plupart.

Le garbage collection enlève une partie du fardeau au programmeur mais il n'empêche pas complètement les fuites.

8
jzd

Vous mélangez les niveaux d'abstraction ici: les fuites de mémoire sont dues à des bogues dans la bibliothèque (où les objets se référencent à travers des chaînes de 'a détient la référence à b' ainsi qu'un compromis dans l'implémentation du garbage collector entre efficacité et précision. Combien de temps souhaitez-vous consacrer à la recherche de telles boucles? Si vous dépensez deux fois plus, vous pourrez détecter les boucles deux fois plus longtemps.

Donc, le problème de fuite de mémoire n'est pas spécifique au langage de programmation, il n'y a aucune raison pour que GO soit meilleur ou pire que Java.

3
florin