Le garbage collector Go 1.3 ne libère pas la mémoire du serveur vers le système
Un serveur développé pour examiner l'empreinte mémoire montre une mémoire RES fluctuante malgré la libération de mémoire attendue après un pic de connexions. Le problème survient en raison des limitations du garbage collector Go à libérer immédiatement la mémoire tas et de l'inaccessibilité de la mémoire de la pile goroutine au système d'exploitation. Un appel système disponible dans les systèmes de type Unix pour libérer les parties de tas inutilisées n'est pas disponible sous Windows, ce qui entraîne une consommation de mémoire virtuelle potentiellement plus importante.
Au départ, le serveur démarre avec une empreinte mémoire mineure. Au cours de l'impulsion initiale de 10 000 connexions, l'utilisation de la mémoire s'élève à environ 60 Mo (comme l'indique la taille RES en « haut »). Lorsque l'impulsion se termine, l'utilisation de la mémoire diminue. Cependant, la taille RES reste élevée à 56 Mo, tandis que la mémoire en cours d'utilisation ne descend jamais en dessous de 60 Mo.
Bien que le garbage collector Go libère de la mémoire tas, il ne la renvoie pas immédiatement au système. Ce processus peut prendre jusqu'à sept minutes après le balayage GC. De plus, la mémoire allouée aux piles goroutines n'est jamais libérée sur le système d'exploitation. Cela contribue à la consommation élevée et persistante de mémoire observée sur le serveur.
Malheureusement, il n'existe pas de solution claire à ce problème dans la version 1.3 de Go. Cependant, la situation devrait s'améliorer dans les versions ultérieures. Pour atténuer l'impact, envisagez les mesures suivantes :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!