Heim >Backend-Entwicklung >Golang >Wie gebe ich den Kartenspeicher in Golang frei?
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.
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!