Golang標準庫——runtime

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棺克。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悠垛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子逆航,更是在濱河造成了極大的恐慌鼎文,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件因俐,死亡現(xiàn)場離奇詭異拇惋,居然都是意外死亡,警方通過查閱死者的電腦和手機抹剩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門撑帖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人澳眷,你說我怎么就攤上這事胡嘿。” “怎么了钳踊?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵衷敌,是天一觀的道長。 經(jīng)常有香客問我拓瞪,道長缴罗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任祭埂,我火速辦了婚禮面氓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛆橡。我一直安慰自己舌界,他們只是感情好,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布泰演。 她就那樣靜靜地躺著呻拌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粥血。 梳的紋絲不亂的頭發(fā)上柏锄,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音复亏,去河邊找鬼趾娃。 笑死,一個胖子當著我的面吹牛缔御,可吹牛的內(nèi)容都是我干的抬闷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼笤成!你這毒婦竟也來了评架?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤炕泳,失蹤者是張志新(化名)和其女友劉穎纵诞,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體培遵,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡浙芙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了籽腕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗡呼。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖皇耗,靈堂內(nèi)的尸體忽然破棺而出南窗,到底是詐尸還是另有隱情,我是刑警寧澤郎楼,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布万伤,位于F島的核電站,受9級特大地震影響呜袁,放射性物質(zhì)發(fā)生泄漏壕翩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一傅寡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧北救,春花似錦荐操、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至攘宙,卻和暖如春屯耸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹭劈。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工疗绣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铺韧。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓多矮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子塔逃,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353