runtime
runtime包提供和go運行時環(huán)境的互操作蘸劈,如控制go程的函數(shù)绑嘹。它也包括用于reflect包的低層次類型信息;參見》reflect報的文檔獲取運行時類型系統(tǒng)的可編程接口。
Environment Variables
下面的環(huán)境變量($name或%name%驾讲,這依賴于主機的操作系統(tǒng))控制go程序的運行時行為可婶。它們的含義和用法可能在各發(fā)行版之間改變沿癞。
環(huán)境變量GOGC設(shè)置最初的垃圾收集目標百分比。當新申請的數(shù)據(jù)和前次垃圾收集剩下的存活數(shù)據(jù)的比率達到該百分比時矛渴,就會觸發(fā)垃圾收集抛寝。默認GOGC=100。設(shè)置GOGC=off 會完全關(guān)閉垃圾收集曙旭。runtime/debug包的SetGCPercent函數(shù)允許在運行時修改該百分比盗舰。參見http://golang.org/pkg/runtime/debug/#SetGCPercent
環(huán)境變量GODEBUG控制運行時的debug輸出。GODEBUG的值是逗號分隔的name=val對桂躏。支持的name如下:
allocfreetrace: 設(shè)置其為1钻趋,會導(dǎo)致每次分配都會被記錄剖面,會記錄每一個對象的分配剂习、釋放
及其堆棧蹤跡蛮位。
efence: 設(shè)置其為1,會導(dǎo)致分配器運行模式為:每個對象申請在獨立的頁和地址鳞绕,且永不循環(huán)利用失仁。
gctrace: 設(shè)置其為1,會導(dǎo)致垃圾收集器每次收集都向標準錯誤輸出寫入單行的數(shù)據(jù)们何,概述收集的總
內(nèi)存的大小和暫停的總時間長度萄焦。設(shè)置其為2,會寫入同樣的概述冤竹,但也會寫入每次收集的兩個數(shù)據(jù)拂封。
gcdead: 設(shè)置其為1,會導(dǎo)致垃圾收集器摧毀任何它認為已經(jīng)死掉的執(zhí)行堆棧鹦蠕。
schedtrace: 設(shè)置其為X冒签,會導(dǎo)致調(diào)度程序每隔X毫秒輸出單行信息到標準錯誤輸出,概述調(diào)度狀態(tài)钟病。
scheddetail: 設(shè)置schedtrace為X并設(shè)置其為1萧恕,會導(dǎo)致調(diào)度程序每隔X毫秒輸出詳細的多行信息,
描述調(diào)度肠阱、進程票唆、線程和go程的狀態(tài)。
環(huán)境變量GOMAXPROCS限制可以同時運行用戶層次的go代碼的操作系統(tǒng)進程數(shù)辖所。沒有對代表go代碼的惰说、可以在系統(tǒng)調(diào)用中阻塞的go程數(shù)的限制;那些阻塞的go程不與GOMAXPROCS限制沖突缘回。本包的GOMAXPROCS函數(shù)可以查詢和修改該限制吆视。
環(huán)境變量GOTRACEBACK控制當go程序因為不能恢復(fù)的panic或不期望的運行時情況失敗時的輸出典挑。失敗的程序默認會打印所有現(xiàn)存go程的堆棧蹤跡(省略運行時系統(tǒng)中的函數(shù)),然后以狀態(tài)碼2退出啦吧。如果GOTRACEBACK為0您觉,會完全忽略所有g(shù)o程的堆棧蹤跡。如果GOTRACEBACK為1授滓,會采用默認行為琳水。如果GOTRACEBACK為2,會打印所有現(xiàn)存go程包括運行時函數(shù)的堆棧蹤跡般堆。如果GOTRACEBACK為crash在孝,會打印所有現(xiàn)存go程包括運行時函數(shù)的堆棧蹤跡,并且如果可能會采用操作系統(tǒng)特定的方式崩潰淮摔,而不是退出私沮。例如,在Unix系統(tǒng)里和橙,程序會釋放SIGABRT信號以觸發(fā)核心信息轉(zhuǎn)儲仔燕。
環(huán)境變量GOARCH、GOOS魔招、GOPATH和GOROOT構(gòu)成完整的go環(huán)境變量集合晰搀。它們影響go程序的構(gòu)建(參見http://golang.org/cmd/go andhttp://golang.org/pkg/go/build)。
GOARCH办斑、GOOS和GOROOT在編譯時被記錄并可用本包的常量和函數(shù)獲取外恕,但它們不會影響運行時環(huán)境。
Constants
const Compiler = "gc"
Compiler是編譯工具鏈的名字俄周,工具鏈會構(gòu)建可執(zhí)行的二進制文件吁讨。已知的工具鏈是:
gc The 5g/6g/8g compiler suite at code.google.com/p/go.
gccgo The gccgo front end, part of the GCC compiler suite.
const GOARCH string = theGoarch
GOARCH是可執(zhí)行程序的目標處理器架構(gòu)(將要在該架構(gòu)的機器上執(zhí)行):386、amd64或arm峦朗。
const GOOS string = theGoos
GOOS是可執(zhí)行程序的目標操作系統(tǒng)(將要在該操作系統(tǒng)的機器上執(zhí)行):darwin、freebsd排龄、linux等波势。
Variables
var MemProfileRate int = 512 * 1024
MemProfileRate控制會在內(nèi)存profile里記錄和報告的內(nèi)存分配采樣頻率。內(nèi)存profile記錄器平均每分配MemProfileRate字節(jié)進行一次分配采樣橄维。
要在profile里包含每一個申請的塊尺铣,可以將MemProfileRate設(shè)為1。要完全關(guān)閉profile的記錄争舞,設(shè)置本變量為0凛忿。
處理內(nèi)存profile的工具假設(shè)profile記錄速度在整個程序的生命期是固定的,并等于當前值竞川。修改內(nèi)存profile的程序應(yīng)該只進行一次店溢,且盡可能早的修改(例如叁熔,在main函數(shù)的開始處)。
type Error
type Error interface {
error
// RuntimeError是一個無操作的函數(shù)床牧,僅用于區(qū)別運行時錯誤和普通錯誤荣回。
// 具有RuntimeError方法的錯誤類型就是運行時錯誤類型。
RuntimeError()
}
Error接口用來識別運行時錯誤戈咳。
type TypeAssertionError
type TypeAssertionError struct {
_interface *_type
concrete *_type
asserted *_type
missingMethod string // one method needed by Interface, missing from Concrete
}
TypeAssertionError表示一次失敗的類型斷言心软。
func (*TypeAssertionError) Error
func (e *TypeAssertionError) Error() string
func (*TypeAssertionError) RuntimeError
func (*TypeAssertionError) RuntimeError()
func GOROOT
func GOROOT() string
GOROOT返回Go的根目錄。如果存在GOROOT環(huán)境變量著蛙,返回該變量的值删铃;否則,返回創(chuàng)建Go時的根目錄踏堡。
func Version
func Version() string
返回Go的版本字符串泳姐。它要么是遞交的hash和創(chuàng)建時的日期;要么是發(fā)行標簽如"go1.3"暂吉。
func NumCPU
func NumCPU() int
NumCPU返回本地機器的邏輯CPU個數(shù)胖秒。
func GOMAXPROCS
func GOMAXPROCS(n int) int
GOMAXPROCS設(shè)置可同時執(zhí)行的最大CPU數(shù),并返回先前的設(shè)置慕的。 若 n < 1阎肝,它就不會更改當前設(shè)置。本地機器的邏輯CPU數(shù)可通過 NumCPU 查詢肮街。本函數(shù)在調(diào)度程序優(yōu)化后會去掉风题。
func SetCPUProfileRate
func SetCPUProfileRate(hz int)
SetCPUProfileRate設(shè)置CPU profile記錄的速率為平均每秒hz次。如果hz<=0嫉父,SetCPUProfileRate會關(guān)閉profile的記錄沛硅。如果記錄器在執(zhí)行,該速率必須在關(guān)閉之后才能修改绕辖。
絕大多數(shù)使用者應(yīng)使用runtime/pprof包或testing包的-test.cpuprofile選項而非直接使用SetCPUProfileRate摇肌。
func CPUProfile
func CPUProfile() []byte
CPUProfile返回二進制CPU profile堆棧跟蹤數(shù)據(jù)的下一個chunk,函數(shù)會阻塞直到該數(shù)據(jù)可用仪际。 如果profile的記錄被關(guān)閉围小,且在記錄器開著的時候積累的profile數(shù)據(jù)都被返回了,CPUProfile會返回nil树碱。調(diào)用者在再次調(diào)用本函數(shù)之前應(yīng)先保存返回的數(shù)據(jù)肯适。
絕大多數(shù)使用者應(yīng)使用 runtime/pprof包或testing包的-test.cpuprofile選項而非直接使用 CPUProfile。
func GC
func GC()
GC執(zhí)行一次垃圾回收成榜。
func SetFinalizer
func SetFinalizer(x, f interface{})
SetFinalizer將x的終止器設(shè)置為f框舔。當垃圾收集器發(fā)現(xiàn)一個不能接觸的(即引用計數(shù)為零,程序中不能再直接或間接訪問該對象)具有終止器的塊時,它會清理該關(guān)聯(lián)(對象到終止器)并在獨立go程調(diào)用f(x)刘绣。這使x再次可以接觸樱溉,但沒有了綁定的終止器。如果SetFinalizer沒有被再次調(diào)用额港,下一次垃圾收集器將視x為不可接觸的饺窿,并釋放x。
SetFinalizer(x, nil)會清理任何綁定到x的終止器移斩。
參數(shù)x必須是一個指向通過new申請的對象的指針肚医,或者通過對復(fù)合字面值取址得到的指針。參數(shù)f必須是一個函數(shù)向瓷,它接受單個可以直接用x類型值賦值的參數(shù)肠套,也可以有任意個被忽略的返回值。如果這兩條任一條不被滿足猖任,本函數(shù)就會中斷程序你稚。
終止器會按依賴順序執(zhí)行:如果A指向B,兩者都有終止器朱躺,且它們無法從其它方面接觸刁赖,只有A的終止器執(zhí)行;A被釋放后长搀,B的終止器就可以執(zhí)行宇弛。如果一個循環(huán)結(jié)構(gòu)包含一個具有終止器的塊,該循環(huán)不能保證會被當垃圾收集源请,終止器也不能保證會執(zhí)行枪芒;因為沒有尊重依賴關(guān)系的順序。
x的終止器會在x變?yōu)椴豢山佑|之后的任意時間被調(diào)度執(zhí)行谁尸。不保證終止器會在程序退出前執(zhí)行舅踪,因此一般終止器只用于在長期運行的程序中釋放關(guān)聯(lián)到某對象的非內(nèi)存資源。例如良蛮,當一個程序丟棄一個os.File對象時沒有調(diào)用其Close方法抽碌,該os.File對象可以使用終止器去關(guān)閉對應(yīng)的操作系統(tǒng)文件描述符。但依靠終止器去刷新內(nèi)存中的I/O緩沖如bufio.Writer是錯誤的背镇,因為緩沖不會在程序退出時被刷新咬展。
如果*x的大小為0字節(jié),不保證終止器會執(zhí)行瞒斩。
一個程序會有單獨一個go程順序執(zhí)行所有的終止器。如果一個終止器必須運行較長時間涮总,它應(yīng)該在內(nèi)部另開go程執(zhí)行該任務(wù)胸囱。
type MemStats
type MemStats struct {
// 一般統(tǒng)計
Alloc uint64 // 已申請且仍在使用的字節(jié)數(shù)
TotalAlloc uint64 // 已申請的總字節(jié)數(shù)(已釋放的部分也算在內(nèi))
Sys uint64 // 從系統(tǒng)中獲取的字節(jié)數(shù)(下面XxxSys之和)
Lookups uint64 // 指針查找的次數(shù)
Mallocs uint64 // 申請內(nèi)存的次數(shù)
Frees uint64 // 釋放內(nèi)存的次數(shù)
// 主分配堆統(tǒng)計
HeapAlloc uint64 // 已申請且仍在使用的字節(jié)數(shù)
HeapSys uint64 // 從系統(tǒng)中獲取的字節(jié)數(shù)
HeapIdle uint64 // 閑置span中的字節(jié)數(shù)
HeapInuse uint64 // 非閑置span中的字節(jié)數(shù)
HeapReleased uint64 // 釋放到系統(tǒng)的字節(jié)數(shù)
HeapObjects uint64 // 已分配對象的總個數(shù)
// L低層次、大小固定的結(jié)構(gòu)體分配器統(tǒng)計瀑梗,Inuse為正在使用的字節(jié)數(shù)烹笔,Sys為從系統(tǒng)獲取的字節(jié)數(shù)
StackInuse uint64 // 引導(dǎo)程序的堆棧
StackSys uint64
MSpanInuse uint64 // mspan結(jié)構(gòu)體
MSpanSys uint64
MCacheInuse uint64 // mcache結(jié)構(gòu)體
MCacheSys uint64
BuckHashSys uint64 // profile桶散列表
GCSys uint64 // GC元數(shù)據(jù)
OtherSys uint64 // 其他系統(tǒng)申請
// 垃圾收集器統(tǒng)計
NextGC uint64 // 會在HeapAlloc字段到達該值(字節(jié)數(shù))時運行下次GC
LastGC uint64 // 上次運行的絕對時間(納秒)
PauseTotalNs uint64
PauseNs [256]uint64 // 近期GC暫停時間的循環(huán)緩沖裳扯,最近一次在[(NumGC+255)%256]
NumGC uint32
EnableGC bool
DebugGC bool
// 每次申請的字節(jié)數(shù)的統(tǒng)計,61是C代碼中的尺寸分級數(shù)
BySize [61]struct {
Size uint32
Mallocs uint64
Frees uint64
}
}
MemStats記錄內(nèi)存申請和分配的統(tǒng)計信息谤职。
func ReadMemStats
func ReadMemStats(m *MemStats)
ReadMemStats將內(nèi)存申請和分配的統(tǒng)計信息填寫進m饰豺。
type MemProfileRecord
type MemProfileRecord struct {
AllocBytes, FreeBytes int64 // 申請和釋放的字節(jié)數(shù)
AllocObjects, FreeObjects int64 // 申請和釋放的對象數(shù)
Stack0 [32]uintptr // 該記錄的調(diào)用棧蹤跡,以第一個零值成員截止
}
MemProfileRecord用于描述某個調(diào)用棧序列申請和釋放的活動對象等信息允蜈。
func (*MemProfileRecord) InUseBytes
func (r *MemProfileRecord) InUseBytes() int64
InUseBytes返回正在使用的字節(jié)數(shù)(AllocBytes – FreeBytes)
func (*MemProfileRecord) InUseObjects
func (r *MemProfileRecord) InUseObjects() int64
InUseObjects返回正在使用的對象數(shù)(AllocObjects - FreeObjects)
func (*MemProfileRecord) Stack
func (r *MemProfileRecord) Stack() []uintptr
Stack返回關(guān)聯(lián)至此記錄的調(diào)用棧蹤跡冤吨,即r.Stack0的前綴。
func MemProfile
func MemProfile(p []MemProfileRecord, inuseZero bool) (n int, ok bool)
MemProfile返回當前內(nèi)存profile中的記錄數(shù)n饶套。若len(p)>=n漩蟆,MemProfile會將此分析報告復(fù)制到p中并返回(n, true);如果len(p)<n妓蛮,MemProfile則不會更改p怠李,而只返回(n, false)。
如果inuseZero為真蛤克,該profile就會包含無效分配記錄(其中r.AllocBytes>0捺癞,而r.AllocBytes==r.FreeBytes。這些內(nèi)存都是被申請后又釋放回運行時環(huán)境的)构挤。
大多數(shù)調(diào)用者應(yīng)當使用runtime/pprof包或testing包的-test.memprofile標記髓介,而非直接調(diào)用MemProfile。
func Breakpoint
func Breakpoint()
Breakpoint執(zhí)行一個斷點陷阱儿倒。
func Stack
func Stack(buf []byte, all bool) int
Stack將調(diào)用其的go程的調(diào)用棧蹤跡格式化后寫入到buf中并返回寫入的字節(jié)數(shù)版保。若all為true,函數(shù)會在寫入當前go程的蹤跡信息后夫否,將其它所有g(shù)o程的調(diào)用棧蹤跡都格式化寫入到buf中彻犁。
func Caller
func Caller(skip int) (pc uintptr, file string, line int, ok bool)
Caller報告當前go程調(diào)用棧所執(zhí)行的函數(shù)的文件和行號信息。實參skip為上溯的棧幀數(shù)凰慈,0表示Caller的調(diào)用者(Caller所在的調(diào)用棧)汞幢。(由于歷史原因,skip的意思在Caller和Callers中并不相同微谓。)函數(shù)的返回值為調(diào)用棧標識符森篷、文件名、該調(diào)用在文件中的行號豺型。如果無法獲得信息仲智,ok會被設(shè)為false。
func Callers
func Callers(skip int, pc []uintptr) int
函數(shù)把當前go程調(diào)用棧上的調(diào)用棧標識符填入切片pc中姻氨,返回寫入到pc中的項數(shù)钓辆。實參skip為開始在pc中記錄之前所要跳過的棧幀數(shù),0表示Callers自身的調(diào)用棧,1表示Callers所在的調(diào)用棧前联。返回寫入p的項數(shù)功戚。
type StackRecord
type StackRecord struct {
Stack0 [32]uintptr // 該記錄的調(diào)用棧蹤跡,以第一個零值成員截止
}
StackRecord描述單條調(diào)用棧似嗤。
func (*StackRecord) Stack
func (r *StackRecord) Stack() []uintptr
Stack返回與記錄相關(guān)聯(lián)的調(diào)用棧蹤跡啸臀,即r.Stack0的前綴。
type Func
type Func struct {
// 內(nèi)含隱藏或非導(dǎo)出字段
}
func FuncForPC
func FuncForPC(pc uintptr) *Func
FuncForPC返回一個表示調(diào)用棧標識符pc對應(yīng)的調(diào)用棧的*Func烁落;如果該調(diào)用棧標識符沒有對應(yīng)的調(diào)用棧乘粒,函數(shù)會返回nil。每一個調(diào)用棧必然是對某個函數(shù)的調(diào)用顽馋。
func (*Func) Name
func (f *Func) Name() string
Name返回該調(diào)用棧所調(diào)用的函數(shù)的名字谓厘。
func (*Func) FileLine
func (f *Func) FileLine(pc uintptr) (file string, line int)
FileLine返回該調(diào)用棧所調(diào)用的函數(shù)的源代碼文件名和行號。如果pc不是f內(nèi)的調(diào)用棧標識符寸谜,結(jié)果是不精確的竟稳。
func (*Func) Entry
func (f *Func) Entry() uintptr
Entry返回該調(diào)用棧的調(diào)用棧標識符。
func NumCgoCall
func NumCgoCall() int64
NumCgoCall返回當前進程執(zhí)行的cgo調(diào)用次數(shù)熊痴。
func NumGoroutine
func NumGoroutine() int
NumGoroutine返回當前存在的Go程數(shù)他爸。
func Goexit
func Goexit()
Goexit終止調(diào)用它的go程。其它go程不會受影響果善。Goexit會在終止該go程前執(zhí)行所有defer的函數(shù)诊笤。
在程序的main go程調(diào)用本函數(shù),會終結(jié)該go程巾陕,而不會讓main返回讨跟。因為main函數(shù)沒有返回,程序會繼續(xù)執(zhí)行其它的go程鄙煤。如果所有其它go程都退出了晾匠,程序就會崩潰。
func Gosched
func Gosched()
Gosched使當前go程放棄處理器梯刚,以讓其它go程運行凉馆。它不會掛起當前go程,因此當前go程未來會恢復(fù)執(zhí)行亡资。
func GoroutineProfile
func GoroutineProfile(p []StackRecord) (n int, ok bool)
GoroutineProfile返回活躍go程的堆棧profile中的記錄個數(shù)澜共。若len(p) >= n,函數(shù)就會將profile中的記錄復(fù)制到p中并返回(n, true)锥腻。若len(p) < n嗦董,則不會修改p,而只返回(n, false)瘦黑。
絕大多數(shù)調(diào)用者應(yīng)當使用runtime/pprof包展懈,而非直接調(diào)用GoroutineProfile销睁。
func LockOSThread
func LockOSThread()
將調(diào)用的go程綁定到它當前所在的操作系統(tǒng)線程供璧。除非調(diào)用的go程退出或調(diào)用UnlockOSThread存崖,否則它將總是在該線程中執(zhí)行,而其它go程則不能進入該線程睡毒。
func UnlockOSThread
func UnlockOSThread()
將調(diào)用的go程解除和它綁定的操作系統(tǒng)線程来惧。若調(diào)用的go程未調(diào)用LockOSThread,UnlockOSThread不做操作演顾。
func ThreadCreateProfile
func ThreadCreateProfile(p []StackRecord) (n int, ok bool)
返回線程創(chuàng)建profile中的記錄個數(shù)供搀。如果len(p)>=n,本函數(shù)就會將profile中的記錄復(fù)制到p中并返回(n, true)钠至。若len(p)<n葛虐,則不會更改p,而只返回(n, false)棉钧。
絕大多數(shù)使用者應(yīng)當使用runtime/pprof包屿脐,而非直接調(diào)用ThreadCreateProfile。
type BlockProfileRecord
type BlockProfileRecord struct {
Count int64
Cycles int64
StackRecord
}
BlockProfileRecord用于描述某個調(diào)用棧序列發(fā)生的阻塞事件的信息宪卿。
func SetBlockProfileRate
func SetBlockProfileRate(rate int)
SetBlockProfileRate控制阻塞profile記錄go程阻塞事件的采樣頻率的诵。對于一個阻塞事件,平均每阻塞rate納秒佑钾,阻塞profile記錄器就采集一份樣本西疤。
要在profile中包
括每一個阻塞事件,需傳入rate=1休溶;要完全關(guān)閉阻塞profile的記錄代赁,需傳入rate<=0。
func BlockProfile
func BlockProfile(p []BlockProfileRecord) (n int, ok bool)
BlockProfile返回當前阻塞profile中的記錄個數(shù)兽掰。如果len(p)>=n芭碍,本函數(shù)就會將此profile中的記錄復(fù)制到p中并返回(n, true)。如果len(p)<n禾进,本函數(shù)則不會修改p豁跑,而只返回(n, false)。
絕大多數(shù)使用者應(yīng)當使用runtime/pprof包或testing包的-test.blockprofile標記泻云, 而非直接調(diào)用 BlockProfile艇拍。
- cgo
- debug
- pprof
- race
- trace
cgo
cgo 包含有 cgo 工具生成的代碼的運行時支持。 使用cgo來查看關(guān)于cgo命令的詳情宠纯。
debug
debug包包含用于程序在運行時進行自我調(diào)試的功能卸夕。
func FreeOSMemory
func FreeOSMemory()
FreeOSMemory強制進行一次垃圾收集,以釋放盡量多的內(nèi)存回操作系統(tǒng)婆瓜。(即使沒有調(diào)用快集,運行時環(huán)境也會在后臺任務(wù)里逐漸將內(nèi)存釋放給系統(tǒng))
func SetGCPercent
func SetGCPercent(percent int) int
SetGCPercent設(shè)定垃圾收集的目標百分比:當新申請的內(nèi)存大小占前次垃圾收集剩余可用內(nèi)存大小的比率達到設(shè)定值時贡羔,就會觸發(fā)垃圾收集。SetGCPercent返回之前的設(shè)定个初。初始值設(shè)定為環(huán)境變量GOGC的值乖寒;如果沒有設(shè)置該環(huán)境變量,初始值為100院溺。percent參數(shù)如果是負數(shù)值楣嘁,會關(guān)閉垃圾收集。
func SetMaxStack
func SetMaxStack(bytes int) int
SetMaxStack設(shè)置該以被單個go程調(diào)用椪湟荩可使用的內(nèi)存最大值逐虚。如果任何go程在增加其調(diào)用棧時超出了該限制,程序就會崩潰谆膳。SetMaxStack返回之前的設(shè)置叭爱。默認設(shè)置在32位系統(tǒng)是250MB,在64位系統(tǒng)是1GB漱病。
SetMaxStack主要用于限制無限遞歸的go程帶來的災(zāi)難买雾。 它只會限制未來增長的調(diào)用棧。
func SetMaxThreads
func SetMaxThreads(threads int) int
SetMaxThreads設(shè)置go程序可以使用的最大操作系統(tǒng)線程數(shù)缨称。如果程序試圖使用超過該限制的線程數(shù)凝果,就會導(dǎo)致程序崩潰。SetMaxThreads返回之前的設(shè)置睦尽,初始設(shè)置為10000個線程器净。
該限制控制操作系統(tǒng)線程數(shù),而非go程數(shù)当凡。go程序只有在一個go程準備要執(zhí)行山害,但現(xiàn)有的線程都阻塞在系統(tǒng)調(diào)用、cgo調(diào)用或被runtime.LockOSThread函數(shù)阻塞在其他go程時沿量,才會創(chuàng)建一個新的線程浪慌。
SetMaxThreads主要用于限制程序無限制的創(chuàng)造線程導(dǎo)致的災(zāi)難。目的是讓程序在干掉操作系統(tǒng)之前朴则,先干掉它自己权纤。
func SetPanicOnFault
func SetPanicOnFault(enabled bool) bool
SetPanicOnFault控制程序在不期望(非nil)的地址出錯時的運行時行為。這些錯誤一般是因為運行時內(nèi)存破壞的bug引起的乌妒,因此默認反應(yīng)是使程序崩潰汹想。使用內(nèi)存映射的文件或進行內(nèi)存的不安全操作的程序可能會在非nil的地址出現(xiàn)錯誤;SetPanicOnFault允許這些程序請求運行時只觸發(fā)一個panic撤蚊,而不是崩潰古掏。SetPanicOnFault只用于當前的go程。它返回之前的設(shè)置侦啸。
type GCStats
type GCStats struct {
LastGC time.Time // 最近一次垃圾收集的時間
NumGC int64 // 垃圾收集的次數(shù)
PauseTotal time.Duration // 所有暫停收集垃圾消耗的總時間
Pause []time.Duration // 每次暫停收集垃圾的消耗的時間
PauseQuantiles []time.Duration
}
GCStats收集了近期垃圾收集的信息槽唾。
func ReadGCStats
func ReadGCStats(stats *GCStats)
ReadGCStats將垃圾收集信息填入stats里丧枪。stats.Pause字段的長度是依賴于系統(tǒng)的;stats.Pause切片如果長度足夠會被重用庞萍,否則會重新申請拧烦。ReadGCStats可能會使用stats.Pause切片的全部容量。
如果stats.PauseQuantiles字段是非空的挂绰,ReadGCStats會在其中填寫說明暫停時間分配的分位數(shù)屎篱。例如,如果len(stats.PauseQuantiles)為5葵蒂,該字段會被填寫上0%、25%重虑、50%践付、75%、100%位置的分位數(shù)(就是說缺厉,不大于該位置暫停時間的暫停次數(shù)占總暫停次數(shù)的比例分別是0%永高、25%……)
func WriteHeapDump
func WriteHeapDump(fd uintptr)
WriteHeapDump將內(nèi)存分配堆和其中對象的描述寫入給定文件描述符fd指定的文件。
堆轉(zhuǎn)儲格式參見http://golang.org/s/go13heapdump
func Stack
func Stack() []byte
Stack 返回格式化的go程的調(diào)用棧蹤跡提针。 對于每一個調(diào)用棧命爬,它包括原文件的行信息和PC值;對go函數(shù)還會嘗試獲取調(diào)用該函數(shù)的函數(shù)或方法辐脖,及調(diào)用所在行的文本饲宛。
此函數(shù)已廢棄。請使用runtime包中的Stack函數(shù)代替嗜价。
func PrintStack
func PrintStack()
PrintStack將Stack返回信息打印到標準錯誤輸出艇抠。
pprof
pprof包以pprof可視化工具期望的格式書寫運行時剖面數(shù)據(jù)。
pprof的更多信息參見http://code.google.com/p/google-perftools/久锥。
func Profiles
func Profiles() []*Profile
Profiles返回所有已知profile的切片家淤,按名稱排序。
func StartCPUProfile
func StartCPUProfile(w io.Writer) error
StartCPUProfile為當前進程開啟CPU profile瑟由。在分析時絮重,分析報告會緩存并寫入到w中。若分析已經(jīng)開啟歹苦,StartCPUProfile就會返回錯誤青伤。
func StopCPUProfile
func StopCPUProfile()
StopCPUProfile會停止當前的CPU profile(如果有)。StopCPUProfile 只會在所有的分析報告寫入完畢后才會返回暂氯。
func WriteHeapProfile
func WriteHeapProfile(w io.Writer) error
WriteHeapProfile是Lookup("heap").WriteTo(w, 0) 的簡寫潮模。它是為了保持向后兼容性而存在的。
type Profile
type Profile struct {
name string
mu sync.Mutex
m map[interface{}][]uintptr
count func() int
write func(io.Writer, int) error
}
Profile是一個調(diào)用棧蹤跡的集合痴施,顯示導(dǎo)致特定事件(如內(nèi)存分配)的實例的調(diào)用棧序列擎厢。包可以創(chuàng)建并維護它們自己的profile究流;它一般用于跟蹤必須被顯式關(guān)閉的資源,例如文件或網(wǎng)絡(luò)連接动遭。
一個Profile的方法可被多個Go程同時調(diào)用芬探。
每個Profile都有唯一的名稱。有些Profile是預(yù)定義的:
goroutine - 當前Go所有程的調(diào)用棧蹤跡
heap - 所有堆分配的采樣
threadcreate - 導(dǎo)致新的OS線程創(chuàng)建的調(diào)用棧蹤跡
block - 導(dǎo)致同步原語水平的阻塞的調(diào)用棧蹤跡
這些預(yù)聲明的Profile自我維護厘惦,如果對它們調(diào)用Add或者Remove時偷仿,將導(dǎo)致panic。
CPU profile不能作為Profile使用宵蕉。它有專門的API酝静,即StartCPUProfile和StopCPUProfile函數(shù),因為它在分析時是以流的形式輸出到writer中的羡玛。
func Lookup
func Lookup(name string) *Profile
Lookup返回具有指定名字的Profile别智;如果沒有,會返回nil稼稿。
func NewProfile
func NewProfile(name string) *Profile
以給定的名稱創(chuàng)建一個新的Profile薄榛。若擁有該名稱的Profile已存在,NewProfile就會panic让歼。
約定會使用'import/path.'前綴來為每個包創(chuàng)建單獨的命名空間敞恋。
func (*Profile) Name
func (p *Profile) Name() string
Name返回該Profile的名稱,它可被傳入Lookup來重新獲取該Profile谋右。
func (*Profile) Add
func (p *Profile) Add(value interface{}, skip int)
Add 將當前的執(zhí)行棧添加到該分析中硬猫,并與value關(guān)聯(lián)。Add在一個內(nèi)部映射中存儲值倚评,因此value必須適于用作映射鍵浦徊,且在對應(yīng)的Remove調(diào)用之前不會被垃圾收集。
若分析的映射中已經(jīng)存在value鍵天梧,Add就會引發(fā)panic盔性。
skip 參數(shù)與runtime.Caller的skip參數(shù)意義相同,它用于控制調(diào)用棧蹤跡從哪里開始呢岗。skip=0時候會從調(diào)用Add的函數(shù)開始冕香。例如,給出如下執(zhí)行棧:
Add
called from rpc.NewClient
called from mypkg.Run
called from main.main
當skip=0時后豫,調(diào)用棧蹤跡從rpc.NewClient對Add的調(diào)用開始悉尾;當skp=1時,堆調(diào)用蹤跡從對rpc.NewClient的調(diào)用開始挫酿。
func (*Profile) Count
func (p *Profile) Count() int
Count返回該Profile中當前執(zhí)行棧的數(shù)量构眯。
func (*Profile) Remove
func (p *Profile) Remove(value interface{})
Remove從該分析中移除與值value相關(guān)聯(lián)的執(zhí)行棧。若值value不在此分析中早龟,則不做操作惫霸。
func (*Profile) WriteTo
func (p *Profile) WriteTo(w io.Writer, debug int) error
函數(shù)將pprof格式的profile快照寫入w中猫缭。若一個向w的寫入返回一個錯誤,WriteTo就會返回該錯誤壹店;否則會返回nil猜丹。
debug 參數(shù)用于開啟附加的輸出。如果debug=0硅卢,只會打印pprof所需要的十六進制地址射窒;如果debug=1,會將地址翻譯為函數(shù)名和行號并添加注釋将塑,以便讓程序員無需工具閱讀分析報告脉顿。
預(yù)定義Profile為其它debug值賦予了含義。例如抬旺,當打印“Go程”的分析報告時弊予,debug=2意為:由于不可恢復(fù)的恐慌而瀕臨崩潰時,使用與Go程序相同的格式打印Go程的堆棧信息开财。
Bugs
? NetBSD和OS X上的profile記錄服務(wù)是不完整谍倦、不準確的济欢,參見http://golang.org/issue/6047獲取細節(jié)。
race
race包實現(xiàn)了數(shù)據(jù)競爭檢測邏輯泣港。沒有提供公共接口兽间。
關(guān)于race detector的詳情參見 http://golang.org/doc/articles/race_detector.html
trace
GO執(zhí)行跟蹤器历葛。 跟蹤器捕獲各種執(zhí)行事件,例如goroutine創(chuàng)建/阻止/取消阻止嘀略,syscall輸入/退出/阻止恤溶,GC相關(guān)事件,堆大小的更改帜羊,處理器啟動/停止等咒程,并將它們寫入io.Writer中。 緊湊的形式讼育。 對于大多數(shù)事件帐姻,都會捕獲精確的納秒級時間戳和堆棧跟蹤。 稍后可以使用“執(zhí)行工具跟蹤”命令分析跟蹤奶段。
func Start
func Start(w io.Writer) error
Start可以跟蹤當前程序饥瓷。 跟蹤時,跟蹤將被緩沖并寫入w痹籍。 如果已經(jīng)啟用了跟蹤呢铆,則Start將返回錯誤。
func Stop
func Stop()
Stop停止當前跟蹤(如果有)蹲缠。 僅在跟蹤的所有寫操作完成后才返回Stop棺克。