Speicherlecks in Go Slice verstehen
Bei der Arbeit mit Slices in Go ist es wichtig, das Potenzial für Speicherlecks zu verstehen, insbesondere bei Zeigern sind beteiligt.
Speicherlecks mit Zeiger
Betrachten Sie ein Segment von Zeigern auf ganze Zahlen ([]*int):
s := []*int{new(int), new(int)}
Dieses Segment hat ein Hintergrundarray mit einer Länge von 2 und enthält 2 ungleich Null Zeiger, die auf zugewiesene Ganzzahlen außerhalb des Arrays zeigen.
Nun, wenn wir neu aufteilen it:
s = s[:1]
Die Länge wird 1, aber das Hintergrundarray bleibt unberührt. Der nicht verwendete Zeiger im zweiten Element befindet sich weiterhin als Teil des Arrays im Speicher. Da von keinem Slice darauf verwiesen wird, ist es nicht mehr zugänglich und kann vom Garbage Collector nicht freigegeben werden, was zu einem Speicherverlust führt.
Warum nicht Non-Pointers?
Mit einem Slice von Nicht-Zeigern ([]int):
t := []int{1, 2}
Durch das Slicing werden die Elemente einfach aus dem neuen Slice ausgeblendet, aber Sie bleiben im Hintergrundarray. Im Gegensatz zu Zeigern sind diese Elemente Teil des Arrays selbst und verweisen nicht auf externen Speicher.
Zeiger und Strukturen
Wenn ein Slice Strukturen enthält, die Zeiger enthalten, kommt es zu Speicherverlusten kann auftreten:
type Books struct { title string author string } ... var bkSlice = []Books{Book1, Book2} bkSlice = bkSlice[:1]
Auch wenn das Slice nur Buch1 behält, sind die Autor- und Titelzeichenfolgen von Buch2 immer noch als Teil im Speicher des Arrays. Um dies zu verhindern, weisen Sie Book2 vor dem Slicing den Nullwert zu:
bkSlice[1] = Book{} bkSlice = bkSlice[:1]
Dadurch wird der Verweis auf die Zeichenfolgen in Book2 entfernt, sodass diese in den Müll gesammelt werden können.
Allgemeine Regel
Um Speicherlecks zu vermeiden, versuchen Sie, Elemente auf Null zu setzen, die auf Speicher außerhalb des Backing-Arrays des Slice verweisen. Beispielsweise sollten Strukturen mit Feldern, die Zeiger, Slices oder andere komplexe Datenstrukturen sind, vor dem erneuten Slicen auf Null gesetzt werden, um externe Referenzen abzuschneiden.
Das obige ist der detaillierte Inhalt vonWie kann ich Speicherverluste beim Reslicing von Go-Slices mit Zeigern vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!