Golang : How to get garbage collection data?
Problem :
You have read the previous tutorial on recovering memory and you want to trigger garbage collection manually with runtime/debug.FreeOSMemory()
or calculate the percentage to use with runtime/debug.SetGCPercent()
function, but you need to figure out what are the parameters to take into account and other information such as the last garbage collection time, available heap size, the number of garbage collection and etc.
Solution :
Use runtime.ReadMemStats()
and runtime/debug.ReadGCStats()
functions to gather the garbage collection data.
package main
import (
"fmt"
"runtime"
"runtime/debug"
)
func main() {
s := new(runtime.MemStats)
runtime.ReadMemStats(s)
fmt.Println("Alloc : ", s.Alloc)
fmt.Println("Total Alloc : ", s.TotalAlloc)
fmt.Println("Sys : ", s.Sys)
fmt.Println("Lookups : ", s.Lookups)
// Garbage Collection data
fmt.Println("HeapAlloc : ", s.HeapAlloc)
fmt.Println("Next Garbage Collection : ", s.NextGC)
fmt.Println("Auto garbage collection will happen when HeapAlloc >= NextGC")
fmt.Println("Last Garbage Collection : ", s.LastGC)
fmt.Println("Total number of GC pause : ", s.PauseTotalNs)
// [256]uint64 array
// we will take the first element for this example...you might want to loop the array
fmt.Println("Most recent pause : ", s.PauseNs[0])
fmt.Println("Recent pause end times : ", s.PauseEnd[0])
fmt.Println("Number of Garbage Collections : ", s.NumGC)
fmt.Println("Is Garbage Collection enabled? : ", s.EnableGC)
fmt.Println("Is Garbage Collection debug enabled? : ", s.DebugGC)
// ---------------------------
gcs := new(debug.GCStats)
debug.ReadGCStats(gcs)
fmt.Println("Last Garbage Collection : ", gcs.LastGC)
fmt.Println("Number of Garbage Collection : ", gcs.NumGC)
fmt.Println("Total pause for all collections : ", gcs.PauseTotal)
// []time.Duration array
fmt.Println("Most recent pause history : ", gcs.Pause)
// []time.Time array
fmt.Println("Most recent pause end times history : ", gcs.PauseEnd)
// []time.Duration array
// Pause Quantiles == values taken at regular interval
fmt.Println("Most recent pause quantiles history : ", gcs.PauseQuantiles)
}
References :
http://golang.org/pkg/runtime/debug/#FreeOSMemory
http://golang.org/pkg/runtime/debug/#ReadGCStats
See also : Golang : Ways to recover memory during run time.
By Adam Ng
IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.
Advertisement
Tutorials
+18.8k Golang : convert int to string
+27.6k Golang : Convert integer to binary, octal, hexadecimal and back to integer
+17.7k Convert JSON to CSV in Golang
+6.1k Golang : Convert Chinese UTF8 characters to Pin Yin
+19.2k Mac OSX : Homebrew and Golang
+6.8k Golang : Derive cryptographic key from passwords with Argon2
+12.8k Golang : zlib compress file example
+12.7k Golang : Drop cookie to visitor's browser and http.SetCookie() example
+15.3k JavaScript/JQuery : Detect or intercept enter key pressed example
+18.5k Golang : How to get hour, minute, second from time?
+8.3k Golang : Routes multiplexer routing example with regular expression control
+9.1k Golang : Go as a script or running go with shebang/hashbang style