Heim >Backend-Entwicklung >Golang >Wie gebe ich den Kartenspeicher in Golang frei?

Wie gebe ich den Kartenspeicher in Golang frei?

coldplay.xixi
coldplay.xixiOriginal
2020-07-18 15:03:0612135Durchsuche

Golangs Methode zum Freigeben des Kartenspeichers: Löschen Sie zuerst alle Schlüssel in der Karte, und der von der Karte belegte Speicher befindet sich noch im [verwendeten Zustand], dann wird die Karte auf Null gesetzt und der von der Karte belegte Speicher wird gelöscht Im [Leerlaufzustand] ist der Speicher schließlich im Leerlaufzustand und kann innerhalb einer bestimmten Zeitspanne in der nächsten Anwendung wiederverwendet werden, ohne dass er erneut auf das Betriebssystem angewendet werden muss.

Wie gebe ich den Kartenspeicher in Golang frei?

Golangs Methode zur Freigabe des Kartenspeichers:

Beispielcode:
Go-Version: 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)
}

Ausgabeergebnis:

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

Feldbeschreibung:

  • Alloc: Die vom Objekt belegte Speichergröße auf dem aktuellen Heap;

  • TotalAlloc: Die gesamte auf dem Heap zugewiesene Speichergröße.

  • Sys: Die vom Programm vom Betriebssystem angeforderte Gesamtspeichergröße ;

  • NumGC: Die Anzahl der Garbage Collection-Läufe.

Aus den laufenden Ergebnissen ist ersichtlich, dass der nach dem Löschen des Schlüssels in der Karte belegte Speicher nicht freigegeben wurde.

Fazit:
Golangs Karte gibt den Speicher nicht sofort nach dem Löschen des Schlüssels frei, sodass der von der Karte belegte Speicher beim Ausführen des Programms tatsächlich nur zunimmt . Darüber hinaus greift GC während der Markierungsphase auf jedes Element in der Karte zu, was bei sehr großen Karten einen sehr hohen Overhead für die Programmleistung mit sich bringt. Wenn jedoch nach Go-Version 1.5 der Schlüssel und der Wert der Karte keine Zeiger enthalten, ignoriert der GC die Karte.

Verwandte Lernempfehlungen: Go-Sprachtutorial

Das obige ist der detaillierte Inhalt vonWie gebe ich den Kartenspeicher in Golang frei?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn