Méthode de Golang pour libérer la mémoire de la carte : supprimez d'abord toutes les clés de la carte, et la mémoire occupée par la carte est toujours dans [état utilisé], puis la carte est définie sur zéro et la mémoire occupée par la carte est ; dans [état inactif] ; enfin, la mémoire d'état est inactive et peut être réutilisée dans la prochaine application dans un certain laps de temps sans avoir à s'appliquer à nouveau au système d'exploitation.
Méthode de Golang pour libérer la mémoire de la carte :
Exemple de code :
version go : 1.12.9
package main import ( "log" "runtime" ) var intMap map[int]int var cnt = 8192 func main() { printMemStats() initMap() runtime.GC() printMemStats() log.Println(len(intMap)) for i := 0; i < cnt; i++ { delete(intMap, i) } log.Println(len(intMap)) runtime.GC() printMemStats() intMap = nil runtime.GC() printMemStats() } func initMap() { intMap = make(map[int]int, cnt) for i := 0; i < cnt; i++ { intMap[i] = i } } func printMemStats() { var m runtime.MemStats runtime.ReadMemStats(&m) log.Printf("Alloc = %v TotalAlloc = %v Sys = %v NumGC = %v\n", m.Alloc/1024, m.TotalAlloc/1024, m.Sys/1024, m.NumGC) }
Résultat de sortie :
2019/11/22 15:42:33 Alloc = 138 TotalAlloc = 138 Sys = 68290 NumGC = 0 2019/11/22 15:42:33 Alloc = 456 TotalAlloc = 460 Sys = 68610 NumGC = 1 2019/11/22 15:42:33 8192 2019/11/22 15:42:33 0 2019/11/22 15:42:33 Alloc = 458 TotalAlloc = 464 Sys = 68674 NumGC = 2 2019/11/22 15:42:33 Alloc = 146 TotalAlloc = 466 Sys = 68674 NumGC = 3
Description du champ :
Alloc
: La taille de la mémoire occupée par l'objet sur le tas actuel ;
TotalAlloc
: La taille totale de la mémoire allouée sur le tas
Sys
: La taille totale de la mémoire demandée par le programme au système d'exploitation ; ;
NumGC
: Le nombre de cycles de collecte des déchets.
Il ressort des résultats d'exécution que la mémoire occupée après la suppression de la clé dans la carte n'a pas été libérée.
Conclusion :
La carte de Golang ne libérera pas la mémoire immédiatement après la suppression de la clé, donc à mesure que le programme s'exécute, la mémoire occupée par la carte ne fera en fait qu'augmenter. . De plus, GC accédera à chaque élément de la carte pendant la phase de marquage, ce qui entraînera une surcharge très importante sur les performances du programme lorsque la carte est très grande. Cependant, après la version 1.5, si la clé et la valeur de la carte ne contiennent pas de pointeurs, le GC ignorera la carte.
Recommandations d'apprentissage associées : Tutoriel de langue Go
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!