github.com/llvm-mirror/llgo@v0.0.0-20190322182713-bf6f0a60fce1/third_party/gofrontend/libgo/go/runtime/debug/garbage.go (about) 1 // Copyright 2013 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package debug 6 7 import ( 8 "runtime" 9 "sort" 10 "time" 11 ) 12 13 // GCStats collect information about recent garbage collections. 14 type GCStats struct { 15 LastGC time.Time // time of last collection 16 NumGC int64 // number of garbage collections 17 PauseTotal time.Duration // total pause for all collections 18 Pause []time.Duration // pause history, most recent first 19 PauseQuantiles []time.Duration 20 } 21 22 // Implemented in package runtime. 23 func readGCStats(*[]time.Duration) 24 func enableGC(bool) bool 25 func setGCPercent(int) int 26 func freeOSMemory() 27 func setMaxStack(int) int 28 func setMaxThreads(int) int 29 30 // ReadGCStats reads statistics about garbage collection into stats. 31 // The number of entries in the pause history is system-dependent; 32 // stats.Pause slice will be reused if large enough, reallocated otherwise. 33 // ReadGCStats may use the full capacity of the stats.Pause slice. 34 // If stats.PauseQuantiles is non-empty, ReadGCStats fills it with quantiles 35 // summarizing the distribution of pause time. For example, if 36 // len(stats.PauseQuantiles) is 5, it will be filled with the minimum, 37 // 25%, 50%, 75%, and maximum pause times. 38 func ReadGCStats(stats *GCStats) { 39 // Create a buffer with space for at least two copies of the 40 // pause history tracked by the runtime. One will be returned 41 // to the caller and the other will be used as a temporary buffer 42 // for computing quantiles. 43 const maxPause = len(((*runtime.MemStats)(nil)).PauseNs) 44 if cap(stats.Pause) < 2*maxPause { 45 stats.Pause = make([]time.Duration, 2*maxPause) 46 } 47 48 // readGCStats fills in the pause history (up to maxPause entries) 49 // and then three more: Unix ns time of last GC, number of GC, 50 // and total pause time in nanoseconds. Here we depend on the 51 // fact that time.Duration's native unit is nanoseconds, so the 52 // pauses and the total pause time do not need any conversion. 53 readGCStats(&stats.Pause) 54 n := len(stats.Pause) - 3 55 stats.LastGC = time.Unix(0, int64(stats.Pause[n])) 56 stats.NumGC = int64(stats.Pause[n+1]) 57 stats.PauseTotal = stats.Pause[n+2] 58 stats.Pause = stats.Pause[:n] 59 60 if len(stats.PauseQuantiles) > 0 { 61 if n == 0 { 62 for i := range stats.PauseQuantiles { 63 stats.PauseQuantiles[i] = 0 64 } 65 } else { 66 // There's room for a second copy of the data in stats.Pause. 67 // See the allocation at the top of the function. 68 sorted := stats.Pause[n : n+n] 69 copy(sorted, stats.Pause) 70 sort.Sort(byDuration(sorted)) 71 nq := len(stats.PauseQuantiles) - 1 72 for i := 0; i < nq; i++ { 73 stats.PauseQuantiles[i] = sorted[len(sorted)*i/nq] 74 } 75 stats.PauseQuantiles[nq] = sorted[len(sorted)-1] 76 } 77 } 78 } 79 80 type byDuration []time.Duration 81 82 func (x byDuration) Len() int { return len(x) } 83 func (x byDuration) Swap(i, j int) { x[i], x[j] = x[j], x[i] } 84 func (x byDuration) Less(i, j int) bool { return x[i] < x[j] } 85 86 // SetGCPercent sets the garbage collection target percentage: 87 // a collection is triggered when the ratio of freshly allocated data 88 // to live data remaining after the previous collection reaches this percentage. 89 // SetGCPercent returns the previous setting. 90 // The initial setting is the value of the GOGC environment variable 91 // at startup, or 100 if the variable is not set. 92 // A negative percentage disables garbage collection. 93 func SetGCPercent(percent int) int { 94 old := setGCPercent(percent) 95 runtime.GC() 96 return old 97 } 98 99 // FreeOSMemory forces a garbage collection followed by an 100 // attempt to return as much memory to the operating system 101 // as possible. (Even if this is not called, the runtime gradually 102 // returns memory to the operating system in a background task.) 103 func FreeOSMemory() { 104 freeOSMemory() 105 } 106 107 // SetMaxStack sets the maximum amount of memory that 108 // can be used by a single goroutine stack. 109 // If any goroutine exceeds this limit while growing its stack, 110 // the program crashes. 111 // SetMaxStack returns the previous setting. 112 // The initial setting is 1 GB on 64-bit systems, 250 MB on 32-bit systems. 113 // 114 // SetMaxStack is useful mainly for limiting the damage done by 115 // goroutines that enter an infinite recursion. It only limits future 116 // stack growth. 117 func SetMaxStack(bytes int) int { 118 return setMaxStack(bytes) 119 } 120 121 // SetMaxThreads sets the maximum number of operating system 122 // threads that the Go program can use. If it attempts to use more than 123 // this many, the program crashes. 124 // SetMaxThreads returns the previous setting. 125 // The initial setting is 10,000 threads. 126 // 127 // The limit controls the number of operating system threads, not the number 128 // of goroutines. A Go program creates a new thread only when a goroutine 129 // is ready to run but all the existing threads are blocked in system calls, cgo calls, 130 // or are locked to other goroutines due to use of runtime.LockOSThread. 131 // 132 // SetMaxThreads is useful mainly for limiting the damage done by 133 // programs that create an unbounded number of threads. The idea is 134 // to take down the program before it takes down the operating system. 135 func SetMaxThreads(threads int) int { 136 return setMaxThreads(threads) 137 } 138 139 // SetPanicOnFault controls the runtime's behavior when a program faults 140 // at an unexpected (non-nil) address. Such faults are typically caused by 141 // bugs such as runtime memory corruption, so the default response is to crash 142 // the program. Programs working with memory-mapped files or unsafe 143 // manipulation of memory may cause faults at non-nil addresses in less 144 // dramatic situations; SetPanicOnFault allows such programs to request 145 // that the runtime trigger only a panic, not a crash. 146 // SetPanicOnFault applies only to the current goroutine. 147 // It returns the previous setting. 148 func SetPanicOnFault(enabled bool) bool 149 150 // WriteHeapDump writes a description of the heap and the objects in 151 // it to the given file descriptor. 152 // The heap dump format is defined at https://golang.org/s/go13heapdump. 153 func WriteHeapDump(fd uintptr)