Gehe Speicherverbrauchsverwaltung
Bin ich neu zu Gehen und zu versuchen herauszufinden, wie es verwaltet Speicher Verbrauch.
Ich habe Probleme mit Speicher in einer meiner test-Projekte. Ich verstehe nicht, warum das Gehen wird mehr und mehr Speicher (keine Freigabe), wenn mein Programm läuft für eine lange Zeit.
Ich bin mit den test-Fall unten. Nachdem die erste Zuordnung, das Programm nutzt fast 350 MB Speicher (laut International Business Machines). Dann versuche ich Sie zu befreien und ActivityMonitor zeigt, dass der Speicherverbrauch verdoppelt. Warum?
Mir läuft dieser code unter OS X mit Go-1.0.3.
Was ist falsch an diesem code? Und was ist der richtige Weg, zu verwalten große Variablen in Go-Programmen?
Hatte ich einen anderen Speicher-management-problem, wenn die Implementierung eines Algorithmus, der verwendet viel Zeit und Speicher; nach läuft es seit einiger Zeit wirft er eine "out of memory" exception.
package main
import ("fmt"
"time"
)
func main() {
fmt.Println("getting memory")
tmp := make([]uint32, 100000000)
for kk, _ := range tmp {
tmp[kk] = 0
}
time.Sleep(5 * time.Second)
fmt.Println("returning memory")
tmp = make([]uint32, 1)
tmp = nil
time.Sleep(5 * time.Second)
fmt.Println("getting memory")
tmp = make([]uint32, 100000000)
for kk, _ := range tmp {
tmp[kk] = 0
}
time.Sleep(5 * time.Second)
fmt.Println("returning memory")
tmp = make([]uint32, 1)
tmp = nil
time.Sleep(5 * time.Second)
return
}
InformationsquelleAutor der Frage duganets | 2013-01-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Derzeit gehen verwendet eine mark-and-sweep-garbage-collectordie im Allgemeinen nicht definiert, wenn das Objekt weggeworfen.
Jedoch, wenn Sie genau hinsehen, es gibt eine go-routine aufgerufen
sysmon
läuft im wesentlichen so lange, wie Ihr Programm funktioniert und ruft die GC periodisch:forcegcperiod
bestimmt den Zeitraum, nach dem die GC ist als Kraft.scavengelimit
bestimmt, Wann Spannweiten sind an das Betriebssystem zurückgegeben. Umfasst sind eine Reihe von Speicher-Seiten , in denen mehrere Objekte. Sie sind gehalten, fürscavengelimit
Zeit und werden freigegeben, wenn kein Objekt ist, undscavengelimit
überschritten wird.Weiter unten im code kann man sehen, dass es eine trace-option. Sie können diese verwenden, um zu sehen, wenn die
scavenger meint er braucht, um aufzuräumen:
Wie Sie sehen können, keine gc berufen ist, die zwischen dem abrufen und zurückgeben. Wenn Sie jedoch ändern
die Verzögerung von 5 Sekunden bis 3 Minuten (mehr als 2 Minuten von
forcegcperiod
),die Objekte entfernt von der gc:
Der Speicher ist noch nicht freigegeben, aber der GC markiert den Speicherbereich als unbenutzt. Die Befreiung wird beginnen, wenn
die verwendete Spanne ist unbenutzt und älter als
limit
. Von scavenger-code:Dieses Verhalten kann natürlich im Laufe der Zeit ändern, aber ich hoffe, dass Sie jetzt ein bisschen ein Gefühl, wenn Objekte
weggeworfen werden durch Kraft-und Wann nicht.
Wie bereits von zupa, freigeben von Objekten kann nicht wieder die Speicher für das Betriebssystem, also auf
bestimmte Systeme können Sie nicht sehen, eine änderung in der Speichernutzung. Dies scheint der Fall zu sein für Plan 9
und Windows nach diesen thread golang-nuts.
InformationsquelleAutor der Antwort nemo
Schließlich (Kraft) sammeln ungenutzten Speicher, den Sie aufrufen müssen,
Laufzeit.GC()
.variable = nil
machen vielleicht Dinge, die nicht erreichbar und somit berechtigt, für die Sammlung, aber es per se nicht frei nichts.InformationsquelleAutor der Antwort zzzz