La traccia non mostra un tempo assoluto ma uno relativo all'uscita. Quando si verifica la linea, il GC è successo 0 + 1 + 0
ms.
Vedere the corresponding output line nel codice di riferimento.
Se si esegue il prefisso di ogni riga su stdout con un timestamp, si ottiene il tempo di esecuzione del GC (data/ora - in millisecondi = tempo di esecuzione del GC).
Esempio:
GOGCTRACE=1 ./myprog 2>&1 | while read line; do echo $(date +%s) $line; done
Se si desidera semplicemente avere una sensazione quando una corsa GC è accaduto con precisione di secondi allora questo è del tutto sufficiente. Molto probabilmente l'output non resterà indietro di molto e anche se lo fosse, avresti ancora i timestamp per ottenere l'ora corretta.
Un'altra soluzione sarebbe quella di utilizzare ReadGCStats
da runtime/debug
cui si dà la GCStats
struct, che a sua volta ha un campo LastGC
di tipo time.Time
, tenendo il tempo assoluto dell'ultima esecuzione GC. In alternativa puoi usare runtime.ReadMemStats
, che ti dà ancora più informazioni.
Naturalmente avresti ancora bisogno di sapere quando è avvenuta una raccolta dei rifiuti. Per questo è possibile utilizzare un finalizzatore su un oggetto che si crea esclusivamente allo scopo di essere spazzatura raccolti e applicare runtime.SetFinalizer
su di esso. Nel finalizzatore si leggerà quindi l'ora LastGC
e stampata.
Esempio (su play):
type Garbage struct{ a int }
func notify(f *Garbage) {
stats := &runtime.MemStats{}
runtime.ReadMemStats(stats)
fmt.Println("Last GC was:", stats.LastGC)
go ProduceFinalizedGarbage()
}
func ProduceFinalizedGarbage() {
x := &Garbage{}
runtime.SetFinalizer(x, notify)
}
func main() {
go ProduceFinalizedGarbage()
for {
runtime.GC()
time.Sleep(30 * time.Second) // Give GC time to run
}
}
Sembra GOGCTRACE non più è supportato: http://grokbase.com/t/gg/golang-dev/137p2tm5f1/has-gogctrace-been-removed- o-rinominato –