Maison  >  Article  >  développement back-end  >  Comment libérer la mémoire de la carte dans Golang ?

Comment libérer la mémoire de la carte dans Golang ?

coldplay.xixi
coldplay.xixioriginal
2020-07-18 15:03:0612085parcourir

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.

Comment libérer la mémoire de la carte dans Golang ?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn