Voici les faits:
le langage Go a un garbage collector.
Java a un garbage collection
beaucoup de programmes Java ont des fuites de mémoire (subtiles ou non)
Comme exemple de programme Java qui a des fuites de mémoire (pas pour les âmes sensibles, la question peut ébranler vos croyances), voyez ici à propos d'un petit programme Java appelé Tomcat qui a même un bouton "rechercher des fuites": Y a - t-il un moyen pour éviter les fuites de mémoire d'annulation de déploiement dans Tomcat?
Je me demande donc: les programmes écrits en Go présenteront-ils le même type de fuites de mémoire (subtiles ou non) que certains programmes écrits en Java?
java
memory-leaks
go
SyntaxeT3rr0r
la source
la source
memory leak
est meilleure que la vôtre".Réponses:
Vous confondez différents types de fuites de mémoire ici.
Les fuites de mémoire odieuses basées sur la gestion explicite de la mémoire ont disparu en Java (ou dans tout autre langage basé sur GC). Ces fuites sont causées par la perte totale d'accès aux morceaux de mémoire sans les marquer comme inutilisés.
Les «fuites de mémoire» toujours présentes en Java et dans tous les autres langages à la surface de la planète jusqu'à ce que l'ordinateur puisse lire nos pensées sont toujours avec nous, et le seront dans un avenir prévisible. Ces fuites sont causées par le code / programmeur gardant des références à des objets 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.
la source
java.util.logging.Level
qui contient une statique privéeArrayList
dans laquelle tous ces objets construits sont placés sur la construction, et dont ils ne sont jamais supprimés), ce qui rend plus difficile de les éviter lors de la programmation Java que dans un autre langage qui ne contient pas de telles faillesIl 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 avec marquage et balayage. Ceci est uniquement conçu comme une solution temporaire et n'est pas destiné à être le ramasse-miettes à long terme. Consultez 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 de la version actuelle si vous le souhaitez.la source
Une «fuite de mémoire» se produit lorsqu'un morceau de mémoire dont le programmeur pensait qu'il serait libéré n'est pas libéré. Cela peut se produire dans n'importe quelle langue, garbage collection 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 fuites de mémoire, les programmeurs provoquent des fuites de mémoire".
la source
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 nettoyage de la mémoire soulage une partie du fardeau du programmeur, mais il n'empêche pas entièrement les fuites.
la source
Vous mélangez ici les niveaux d'abstraction: les fuites de mémoire sont dues à des bogues dans la bibliothèque (où les objets se référencent entre eux via des chaînes de 'a tient référence à b' ainsi qu'à un compromis dans l'implémentation du ramasse-miettes entre l'efficacité et Combien de temps voulez-vous consacrer à la recherche de telles boucles? Si vous dépensez deux fois plus, vous serez en mesure de détecter les boucles deux fois plus longtemps.
Ainsi, le problème de la fuite de mémoire n'est pas spécifique au langage de programmation, il n'y a aucune raison que GO en soi soit meilleur ou pire que Java.
la source