Est-ce que Go est sujet aux mêmes memory leaks subtiles que Java?

Voici les faits:

Comme exemple d’un programme Java qui a des memory leaks (pas pour les faibles de cœur, la question peut ébranler vos croyances), voyez ici un petit programme Java appelé Tomcat qui a même un bouton “find leaks”: éviter les memory leaks de déploiement dans Tomcat?

Je me demande donc: les programmes écrits en Go présentent-ils le même type de memory leaks (subtiles ou non) que certains programmes écrits en Java?

Vous confondez ici différents types de memory leaks.

Les memory leaks odieuses basées sur la gestion de mémoire explicite ont disparu en Java (ou dans tout autre langage basé sur GC). Ces fuites sont causées par la perte complète de l’access aux blocs de mémoire sans qu’ils soient marqués comme inutilisés.

Les “memory leaks” encore présentes en Java et dans tous les autres langages sur la planète, jusqu’à ce que l’ordinateur puisse lire dans nos pensées, sont toujours présentes et le seront dans un avenir prévisible. Ces fuites sont causées par le code / programmeur qui garde des références à des objects qui ne sont techniquement plus nécessaires. Ce sont des bogues fondamentalement logiques et ne peuvent être évités dans aucun langage utilisant les technologies actuelles.

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

Collecte des ordures ménagères ou non, vous pouvez écrire un programme comportant principalement des memory leaks dans Java, Go ou tout autre langage.

La collecte des ordures élimine une partie du fardeau du programmeur mais n’empêche pas complètement les fuites.

Une «fuite de mémoire» se produit lorsqu’un morceau de mémoire que le programmeur pensait être libéré n’est pas libéré. Cela peut se produire dans toutes les langues, les ordures collectées ou non. La cause habituelle dans les langages GC est de conserver une référence supplémentaire à la mémoire.

“Les langages ne provoquent pas de memory leaks, les programmeurs provoquent des memory leaks”.

Vous mélangez des niveaux d’abstraction ici: les memory leaks sont dues à des bogues dans la bibliothèque (où les objects se réfèrent bien que les chaînes de ‘a contiennent une référence à b’ ainsi qu’un compromis dans l’implémentation du garbage collector entre exactitude Combien de temps voulez-vous consacrer à la recherche de telles boucles? Si vous dépensez deux fois plus, vous pourrez détecter des boucles deux fois plus longtemps.

Le problème de fuite de mémoire n’est donc pas spécifique au langage de programmation, il n’ya aucune raison que GO soit lui-même meilleur ou pire que Java.