mirror of
https://github.com/golang/go
synced 2024-11-23 19:00:04 -07:00
cmd/trace: force GC occassionally
to return memory to the OS after completing potentially large operations. Update #21870 Sys went down to 3.7G $ DEBUG_MEMORY_USAGE=1 go tool trace trace.out 2018/03/07 09:35:52 Parsing trace... after parsing trace Alloc: 3385754360 Bytes Sys: 3662047864 Bytes HeapReleased: 0 Bytes HeapSys: 3488907264 Bytes HeapInUse: 3426549760 Bytes HeapAlloc: 3385754360 Bytes Enter to continue... 2018/03/07 09:36:09 Splitting trace... after spliting trace Alloc: 3238309424 Bytes Sys: 3684410168 Bytes HeapReleased: 0 Bytes HeapSys: 3488874496 Bytes HeapInUse: 3266461696 Bytes HeapAlloc: 3238309424 Bytes Enter to continue... 2018/03/07 09:36:39 Opening browser. Trace viewer is listening on http://100.101.224.241:12345 after httpJsonTrace Alloc: 3000633872 Bytes Sys: 3693978424 Bytes HeapReleased: 0 Bytes HeapSys: 3488743424 Bytes HeapInUse: 3030966272 Bytes HeapAlloc: 3000633872 Bytes Enter to continue... Change-Id: I56f64cae66c809cbfbad03fba7bd0d35494c1d04 Reviewed-on: https://go-review.googlesource.com/92376 Reviewed-by: Peter Weinberger <pjw@google.com>
This commit is contained in:
parent
20b14b71df
commit
93b0261d0a
@ -17,6 +17,7 @@ import (
|
||||
"net/http"
|
||||
"os"
|
||||
"runtime"
|
||||
"runtime/debug"
|
||||
"sync"
|
||||
|
||||
_ "net/http/pprof" // Required to use pprof
|
||||
@ -119,10 +120,12 @@ func main() {
|
||||
os.Exit(0)
|
||||
}
|
||||
reportMemoryUsage("after parsing trace")
|
||||
debug.FreeOSMemory()
|
||||
|
||||
log.Print("Splitting trace...")
|
||||
ranges = splitTrace(res)
|
||||
reportMemoryUsage("after spliting trace")
|
||||
debug.FreeOSMemory()
|
||||
|
||||
addr := "http://" + ln.Addr().String()
|
||||
log.Printf("Opening browser. Trace viewer is listening on %s", addr)
|
||||
|
@ -14,6 +14,7 @@ import (
|
||||
"net/http"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"runtime/debug"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
@ -165,6 +166,7 @@ func httpTraceViewerHTML(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
// httpJsonTrace serves json trace, requested from within templTrace HTML.
|
||||
func httpJsonTrace(w http.ResponseWriter, r *http.Request) {
|
||||
defer debug.FreeOSMemory()
|
||||
defer reportMemoryUsage("after httpJsonTrace")
|
||||
// This is an AJAX handler, so instead of http.Error we use log.Printf to log errors.
|
||||
res, err := parseTrace()
|
||||
@ -293,6 +295,7 @@ func splittingTraceConsumer(max int) (*splitter, traceConsumer) {
|
||||
// so flush can include them in the required
|
||||
// part of the trace.
|
||||
data.Events = append(data.Events, v)
|
||||
return
|
||||
}
|
||||
enc := json.NewEncoder(&cw)
|
||||
enc.Encode(v)
|
||||
@ -1025,6 +1028,8 @@ func viewerDataTraceConsumer(w io.Writer, start, end int64) traceConsumer {
|
||||
io.WriteString(w, ",")
|
||||
}
|
||||
enc.Encode(v)
|
||||
// TODO: get rid of the extra \n inserted by enc.Encode.
|
||||
// Same should be applied to splittingTraceConsumer.
|
||||
written++
|
||||
},
|
||||
consumeViewerFrame: func(k string, v ViewerFrame) {
|
||||
|
Loading…
Reference in New Issue
Block a user