Documentation
¶
Overview ¶
パッケージruntimeは、Goのランタイムシステムと対話する操作を含んでいます。 これには、ゴルーチンを制御するための関数などが含まれます。また、低レベルの型情報も含まれており、 これはreflectパッケージによって使用されます。ランタイム型システムへのプログラム可能な インターフェースについては、reflect のドキュメンテーションを参照してください。
環境変数 ¶
以下の環境変数(ホストオペレーティングシステムによっては$nameまたは%name%)は、Goプログラムのランタイム動作を制御します。意味や使用法はリリースごとに変更される可能性があります。
GOGC変数は、初期のガベージコレクションのターゲットパーセンテージを設定します。 前回のコレクション後に残されたライブデータに対する新しく割り当てられたデータの比率がこのパーセンテージに達すると、コレクションがトリガーされます。 デフォルトはGOGC=100です。GOGC=offに設定すると、ガベージコレクタが完全に無効になります。 runtime/debug.SetGCPercent を使用すると、このパーセンテージを実行時に変更できます。
GOMEMLIMIT変数は、ランタイムのソフトメモリ制限を設定します。 このメモリ制限には、Goヒープとランタイムによって管理されるすべてのその他のメモリが含まれますが、 バイナリ自体のマッピング、他の言語で管理されるメモリ、およびGoプログラムの代わりにオペレーティングシステムに保持されるメモリなど、外部メモリソースは除外されます。 GOMEMLIMITは、オプションの単位接尾辞を持つバイト単位の数値です。 サポートされる接尾辞には、B、KiB、MiB、GiB、およびTiBが含まれます。 これらの接尾辞は、IEC 80000-13標準で定義されるバイトの量を表します。 つまり、2の累乗に基づいています:KiBは2^10バイトを意味し、MiBは2^20バイトを意味します。 デフォルト設定は math.MaxInt64 であり、これによりメモリ制限が無効になります。 runtime/debug.SetMemoryLimit を使用すると、この制限を実行時に変更できます。
GODEBUG変数は、ランタイム内のデバッグ変数を制御します。 これは、これらの名前付き変数を設定するname=valペアのカンマ区切りリストです。
clobberfree: clobberfree=1を設定すると、ガベージコレクタがオブジェクトを解放するときに、オブジェクトのメモリ内容を悪い内容で上書きします。 cpu.*: cpu.all=offは、すべてのオプションの命令セット拡張機能の使用を無効にします。 cpu.extension=offは、指定された命令セット拡張機能からの命令の使用を無効にします。 拡張機能は、内部/cpuパッケージにリストされているsse41やavxなどの命令セット拡張機能の小文字の名前です。 例えば、cpu.avx=offは、AVX命令のランタイム検出とそれによる使用を無効にします。 cgocheck: cgocheck=0を設定すると、cgoを使用してGoポインタを非Goコードに誤って渡すパッケージのすべてのチェックが無効になります。 cgocheck=1(デフォルト)を設定すると、比較的安価なチェックが有効になりますが、一部のエラーを見逃す可能性があります。 より完全で遅いcgocheckモードは、GOEXPERIMENTを使用して有効にできます(再ビルドが必要です)。 詳細については、https://pkg.go.dev/internal/goexperiment を参照してください。 checkfinalizers: checkfinalizers=1を設定すると、ガベージコレクタが複数回の部分的な非並列ストップ・ザ・ワールドコレクションを実行し、ファイナライザやクリーンアップに関する一般的な問題(https://go.dev/doc/gc-guide#Finalizers_cleanups_and_weak_pointers に記載されているものなど)を特定します。潜在的な問題が見つかった場合、プログラムはすべての潜在的な問題の説明、関連する値、それらの値のファイナライザやクリーンアップのリスト(作成場所を含む)とともに終了します。また、タイニーブロックの追跡も追加され、これらの問題の診断にも役立ちます。部分的なコレクション中に行われる分析は保守的です。特に、クリーンアップ関数、クリーンアップ引数、ファイナライザ関数から元のオブジェクトへのパスがあれば、それが後で切断される可能性があっても潜在的な問題としてフラグ付けされます(ただし、このパターンは推奨されません)。このモードでは、各GCサイクルごとにファイナライザとクリーンアップキューの長さに関する情報をstderrに1行出力します。このモードで出力される行は "checkfinalizers:" で始まります。 decoratemappings: GoランタイムがOSの匿名メモリマッピングにその目的に関するコンテキストを注釈付けするかどうかを制御します。これらの注釈は /proc/self/maps や /proc/self/smaps に "[anon: Go: ...]" として表示されます。この設定はLinuxのみで使用されます。Go 1.25ではデフォルトで `decoratemappings=1` となり、注釈が有効になります。`decoratemappings=0` を使用すると、Go 1.25以前の動作に戻ります。 disablethp: Linuxでdisablethp=1を設定すると、ヒープに対するトランスペアレント・ヒュージページが無効になります。他のプラットフォームでは効果はありません。disablethpはGo 1.21以前のバージョンとの互換性のためのもので、Linuxカーネルのデフォルトによって大幅なメモリ過剰使用が発生する問題への回避策がGo 1.21以降で廃止されたためです。詳細は https://go.dev/issue/64332 を参照してください。この設定は将来のリリースで削除される予定なので、運用者はそれまでにLinuxの設定を調整してください。詳細は https://go.dev/doc/gc-guide#Linux_transparent_huge_pages を参照してください。 dontfreezetheworld: デフォルトでは、致命的なパニックまたはスローの開始は "世界を凍結"し、すべてのスレッドを事前に停止させてすべての実行中の ゴルーチンを停止させます。これにより、すべてのゴルーチンのトレースバックが可能になり、 その状態はパニックの地点に近く保たれます。dontfreezetheworld=1を設定すると、 この事前停止が無効になり、パニック処理中にゴルーチンが実行を続けることができます。 自然にスケジューラに入るゴルーチンは依然として停止することに注意してください。これは、 freezetheworldがスケジューラの状態を混乱させ、したがって問題を隠す可能性があるため、 ランタイムスケジューラのデバッグ時に役立つことがあります。 efence: efence=1を設定すると、アロケータがユニークなページ上に各オブジェクトを割り当て、アドレスを再利用しないモードで実行されるようになります。 gccheckmark: gccheckmark=1を設定すると、世界が停止している間に2回目のマークパスを実行して、ガベージコレクタの並列マークフェーズの検証を有効にします。 2回目のパスで並列マークで見つからなかった到達可能なオブジェクトが見つかった場合、ガベージコレクタはパニックを引き起こします。 go gcpacertrace: gcpacertrace=1を設定すると、ガベージコレクタが並列ペーサーの内部状態に関する情報を出力します。 gcshrinkstackoff: gcshrinkstackoff=1を設定すると、ゴルーチンをより小さなスタックに移動しないようにできます。 このモードでは、ゴルーチンのスタックは成長するだけで、縮小されません。 gcstoptheworld: gcstoptheworld=1を設定すると、並列ガベージコレクションが無効になり、すべてのガベージコレクションがストップ・ザ・ワールドイベントになります。 gcstoptheworld=2を設定すると、ガベージコレクションが終了した後に並列スイープも無効になります。 gctrace: gctrace=1を設定すると、ガベージコレクタが各コレクションで標準エラーに1行の要約を出力し、 回収されたメモリ量と一時停止の長さをまとめます。この行の形式は変更される可能性があります。 以下に説明するのは、各フィールドの関連するruntime/metricsメトリックも含まれています。現在の形式は次のとおりです。 gc # @#s #%: #+#+# ms clock, #+#/#/#+# ms cpu, #->#-># MB, # MB goal, # MB stacks, #MB globals, # P フィールドは次のようになります。 # GC番号 @#s プログラム開始以来の秒数 #% プログラム開始以来のGCに費やされた時間の割合 #+...+# GCフェーズのウォールクロック/CPU時間 #->#-># MB GC開始時、GC終了時、およびライブヒープのヒープサイズ、または/gc/scan/heap:bytes # MB goal ゴールヒープサイズ、または/gc/heap/goal:bytes # MB stacks スキャン可能なスタックサイズの推定値、または/gc/scan/stack:bytes # MB globals スキャン可能なグローバルサイズ、または/gc/scan/globals:bytes # P 使用されたプロセッサの数、または/sched/gomaxprocs:threads フェーズは、ストップ・ザ・ワールド(STW)スイープ終了、並列マーク・スキャン、およびSTWマーク終了です。 マーク/スキャンのCPU時間は、アシスト時間(割り当てと同時に実行されるGC)、 バックグラウンドGC時間、およびアイドルGC時間に分割されます。行が「(forced)」で終わる場合、 このGCはruntime.GC()呼び出しによって強制されました。 harddecommit: harddecommit=1を設定すると、OSに返されるメモリに対しても保護が解除されるようになります。 これはWindowsでの唯一の動作モードですが、他のプラットフォームでのスキャベンジャー関連の問題のデバッグに役立ちます。 現在、Linuxのみでサポートされています。 inittrace: inittrace=1を設定すると、ランタイムが、実行時間とメモリ割り当てを要約した、 各パッケージのinit作業ごとに標準エラーに1行の情報を出力します。 プラグインの読み込み時に実行されるinitsと、ユーザー定義とコンパイラ生成のinit作業の両方を持たないパッケージについては、 情報は出力されません。この行の形式は変更される可能性があります。現在の形式は次のとおりです。 init # @#ms, # ms clock, # bytes, # allocs フィールドは次のようになります。 init # パッケージ名 @# ms プログラム開始以来、initが開始されたときのミリ秒単位の時間 # clock パッケージ初期化作業のウォールクロック時間 # bytes ヒープに割り当てられたメモリ # allocs ヒープ割り当ての数 madvdontneed: madvdontneed=0を設定すると、Linuxではメモリをカーネルに返すときにMADV_DONTNEEDの代わりにMADV_FREEを使用します。 これはより効率的ですが、OSがメモリ圧力下にある場合にのみRSS数が減少することを意味します。 BSDおよびIllumos/Solarisでは、madvdontneed=1を設定すると、MADV_FREEの代わりにMADV_DONTNEEDを使用します。 これはより効率的ではありませんが、RSS数がより速く減少するようになります。 memprofilerate: memprofilerate=Xを設定すると、runtime.MemProfileRateの値が更新されます。 0に設定すると、メモリプロファイリングが無効になります。デフォルト値についてはMemProfileRateの説明を参照してください。 profstackdepth: profstackdepth=128(デフォルト)は、CPUプロファイラーを除くすべてのpprofプロファイラーによって使用される最大スタック 深さを128フレームに設定します。 この限界を超えるスタックトレースは、葉フレームから始まる限界まで切り捨てられます。profstackdepthを1024を超える任意の値に設定しても、 暗黙のうちに1024にデフォルト設定されます。将来のGoのバージョンでは、この制限が取り除かれ、profstackdepthがCPUプロファイラーと実行トレーサーにも 適用されるように拡張される可能性があります。 pagetrace: pagetrace=/path/to/fileを設定すると、ページイベントのトレースが書き出され、 x/debug/cmd/pagetraceツールを使用して表示、分析、および可視化できます。この機能を有効にするには、 プログラムをGOEXPERIMENT=pagetraceでビルドしてください。 この機能は、セットUIDバイナリの場合にセキュリティリスクを導入するため、 プログラムがセットUIDバイナリである場合はこの機能を有効にしないでください。 現在、Windows、plan9、js/wasmではサポートされていません。 一部のアプリケーションでこのオプションを設定すると、大きなトレースが生成される場合があるため、注意して使用してください。 panicnil: panicnil=1を設定すると、nilのインターフェース値または型指定されていないnilを引数にpanicを呼び出したときのランタイムエラーが無効になります。 invalidptr: invalidptr=1(デフォルト)を設定すると、ガベージコレクタとスタックコピー処理が、ポインタ型の場所に不正なポインタ値(例: 1)が見つかった場合にプログラムをクラッシュさせます。invalidptr=0を設定するとこのチェックが無効になります。これはバグのあるコードの診断のための一時的な回避策としてのみ使用してください。本来の修正は、ポインタ型の場所に整数値を格納しないことです。 sbrk: sbrk=1を設定すると、メモリアロケータとガベージコレクタが置き換えられ、オペレーティングシステムからメモリを取得し、メモリを回収しない単純なアロケータになります。 scavtrace: scavtrace=1を設定すると、ランタイムが、スキャベンジャーによって実行された作業量、 オペレーティングシステムに返された総メモリ量、および物理メモリ使用量の推定を要約した、標準エラーに1行の情報を出力します。 この行の形式は変更される可能性があります。現在の形式は次のとおりです。 scav # KiB work (bg), # KiB work (eager), # KiB total, #% util extern.goファイルから、フィールドは次のようになります。 # KiB work (bg) 前回の行以降にバックグラウンドでOSに返されたメモリ量 # KiB work (eager) 前回の行以降にイーガーモードでOSに返されたメモリ量 # KiB now 現在OSに返されているアドレス空間の量 #% util スキャベンジングされていないヒープメモリのうち、使用中の割合 もし行が"(forced)"で終わる場合、スキャベンジングはdebug.FreeOSMemory()呼び出しによって強制されました。 scheddetail: schedtrace=Xおよびscheddetail=1を設定すると、 スケジューラがXミリ秒ごとに詳細な複数行情報を出力し、スケジューラ、プロセッサ、スレッド、およびゴルーチンの状態を説明します。 schedtrace: schedtrace=Xを設定すると、スケジューラがXミリ秒ごとに、スケジューラの状態を要約した1行を標準エラーに出力します。 tracebackancestors: tracebackancestors=N を設定すると、ゴルーチンが作成された時点でのスタックを含むトレースバックが拡張され、 N は報告する先祖ゴルーチンの数を制限します。これは runtime.Stack によって返される情報も拡張します。 N を 0 に設定すると、先祖情報は報告されません。 tracefpunwindoff: tracefpunwindoff=1を設定すると、実行トレーサーがフレームポインタアンワインディングの代わりに ランタイムのデフォルトスタックアンワインダーを使用するようになります。これにより、トレーサーのオーバーヘッドが増加しますが、 フレームポインタアンワインディングによって引き起こされる予期しないリグレッションのワークアラウンドやデバッグに役立つ場合があります。 traceadvanceperiod: トレース生成間のおおよその周期(ナノ秒単位)。GOEXPERIMENT=exectracer2でプログラムがビルドされている場合にのみ適用されます。 主に実行トレーサーのテストとデバッグに使用されます。 tracecheckstackownership: tracecheckstackownership=1を設定すると、 スタックトレースを取る前にスタックの所有権を二重チェックするデバッグチェックが 実行トレーサーで有効になります。 asyncpreemptoff: asyncpreemptoff=1は、信号ベースの 非同期ゴルーチンの事前停止を無効にします。これにより、一部のループが 長期間にわたって非事前停止可能になり、GCと ゴルーチンのスケジューリングが遅延する可能性があります。これはGCの問題を デバッグするのに便利です。 なぜなら、非同期に事前停止されたゴルーチン用の保守的なスタックスキャンも 無効にするからです。
net および net/http パッケージも、GODEBUGのデバッグ変数を参照しています。 詳細については、それらのパッケージのドキュメントを参照してください。
GOMAXPROCS変数は、ユーザーレベルのGoコードを同時に実行できるオペレーティングシステムスレッドの数を制限します。 Goコードの代わりにシステムコールでブロックされているスレッドの数に制限はありません。 これらはGOMAXPROCSの制限には含まれません。このパッケージの GOMAXPROCS 関数は、制限をクエリおよび変更します。
GORACE変数は、-raceを使用してビルドされたプログラムのレースディテクタを設定します。 詳細については、Race Detector article を参照してください。
GOTRACEBACK変数は、Goプログラムが回復不能なパニックまたは予期しないランタイム条件によって失敗した場合に生成される出力量を制御します。 デフォルトでは、失敗は現在のゴルーチンのスタックトレースを出力し、ランタイムシステム内部の関数を省略して、終了コード2で終了します。 現在のゴルーチンが存在しない場合や、失敗がランタイム内部で発生した場合は、すべてのゴルーチンのスタックトレースが出力されます。 GOTRACEBACK=noneは、ゴルーチンのスタックトレースを完全に省略します。 GOTRACEBACK=single(デフォルト)は、上記の説明のように動作します。 GOTRACEBACK=allは、すべてのユーザー作成ゴルーチンのスタックトレースを追加します。 GOTRACEBACK=systemは、「all」と同様ですが、ランタイム関数のスタックフレームを追加します。 extern.goファイルから、フィールドは次のようになります。 ランタイムによって内部的に作成されたゴルーチンを表示します。 GOTRACEBACK=crashは、「system」と同様ですが、OS固有の方法でクラッシュします。たとえば、Unixシステムでは、クラッシュはSIGABRTを発生させてコアダンプをトリガーします。 GOTRACEBACK=werは、「crash」と同様ですが、Windows Error Reporting(WER)を無効にしません。 歴史的な理由から、GOTRACEBACK設定0、1、および2は、それぞれnone、all、およびsystemの同義語です。 runtime/debugパッケージのSetTraceback関数を使用すると、実行時に出力量を増やすことができますが、環境変数で指定された量を下回ることはできません。 runtime/debug.SetTraceback 関数を参照してください。
GOARCH、GOOS、GOPATH、およびGOROOT環境変数は、Goプログラムのビルドに影響を与えます (cmd/go および go/build を参照)。 GOARCH、GOOS、およびGOROOTは、コンパイル時に記録され、このパッケージの定数または関数によって利用可能になりますが、 ランタイムシステムの実行には影響しません。
セキュリティ ¶
Unixプラットフォームでは、危険な動作を防止するために、バイナリがsetuid/setgidに設定されているか、 setuid/setgidのようなプロパティで実行されている場合、Goのランタイムシステムはわずかに異なる動作をします。 Linuxでは、補助ベクトルでAT_SECUREフラグをチェックし、BSDおよびSolaris/Illumosではissetugidシスコールをチェックし、 AIXではuid/gidが有効なuid/gidと一致するかどうかをチェックします。
ランタイムがバイナリがsetuid/setgidのようであると判断した場合、次の3つの主な処理が行われます。
- 標準入出力ファイルディスクリプタ(0、1、2)が開いているかどうかを確認します。いずれかが閉じられている場合、/dev/nullを指すように開きます。
- GOTRACEBACK環境変数の値を'none'に設定します。
- プログラムを終了するシグナルが受信された場合、またはGOTRACEBACKの値を上書きする回復不能なパニックが発生した場合、ゴルーチンのスタック、レジスタ、およびその他のメモリ関連情報が省略されます。
Index ¶
- Constants
- Variables
- func BlockProfile(p []BlockProfileRecord) (n int, ok bool)
- func Breakpoint()
- func CPUProfile() []bytedeprecated
- func Caller(skip int) (pc uintptr, file string, line int, ok bool)
- func Callers(skip int, pc []uintptr) int
- func GC()
- func GOMAXPROCS(n int) int
- func GOROOT() stringdeprecated
- func Goexit()
- func GoroutineProfile(p []StackRecord) (n int, ok bool)
- func Gosched()
- func KeepAlive(x any)
- func LockOSThread()
- func MemProfile(p []MemProfileRecord, inuseZero bool) (n int, ok bool)
- func MutexProfile(p []BlockProfileRecord) (n int, ok bool)
- func NumCPU() int
- func NumCgoCall() int64
- func NumGoroutine() int
- func ReadMemStats(m *MemStats)
- func ReadTrace() []byte
- func SetBlockProfileRate(rate int)
- func SetCPUProfileRate(hz int)
- func SetCgoTraceback(version int, traceback, context, symbolizer unsafe.Pointer)
- func SetDefaultGOMAXPROCS()
- func SetFinalizer(obj any, finalizer any)
- func SetMutexProfileFraction(rate int) int
- func Stack(buf []byte, all bool) int
- func StartTrace() error
- func StopTrace()
- func ThreadCreateProfile(p []StackRecord) (n int, ok bool)
- func UnlockOSThread()
- func Version() string
- type BlockProfileRecord
- type Cleanup
- type Error
- type Frame
- type Frames
- type Func
- type MemProfileRecord
- type MemStats
- type PanicNilError
- type Pinner
- type StackRecord
- type TypeAssertionError
Examples ¶
Constants ¶
const Compiler = "gc"
Compilerは、実行中のバイナリを構築したコンパイラツールチェーンの名前です。既知のツールチェーンは次のとおりです:
gc cmd/compileとしても知られています。 gccgo GCCコンパイラスイートの一部であるgccgoフロントエンドです。
const GOARCH string = goarch.GOARCH
GOARCHは、実行中のプログラムのアーキテクチャターゲットです。 386、amd64、arm、s390xなどのいずれかです。
const GOOS string = goos.GOOS
GOOSは実行中のプログラムのオペレーティングシステムターゲットです。 darwin、freebsd、linuxなどのいずれかです。 GOOSとGOARCHの可能な組み合わせを表示するには、「go tool dist list」と入力してください。
Variables ¶
var MemProfileRate int = 512 * 1024
MemProfileRateは、メモリプロファイルに記録および報告されるメモリ割り当ての割合を制御します。 プロファイラは、MemProfileRateバイトあたり平均1回の割り当てをサンプリングすることを目指しています。 プロファイルにすべての割り当てブロックを含めるには、MemProfileRateを1に設定します。 プロファイリングを完全にオフにするには、MemProfileRateを0に設定します。 メモリプロファイルを処理するツールは、プロファイルの割合がプログラムの生存期間全体で一定であり、現在の値と等しいと想定しています。 メモリプロファイリングの割合を変更するプログラムは、できるだけ早く(たとえば、mainの開始時などに)1度だけ行う必要があります。
Functions ¶
func BlockProfile ¶ added in v1.1.0
func BlockProfile(p []BlockProfileRecord) (n int, ok bool)
BlockProfileは現在のブロッキングプロファイルのレコード数nを返します。 もしlen(p) >= nの場合、BlockProfileはプロファイルをpにコピーし、nとtrueを返します。 もしlen(p) < nの場合、BlockProfileはpを変更せずに、nとfalseを返します。
ほとんどのクライアントは、 runtime/pprof パッケージや testing パッケージの-test.blockprofileフラグを使用して、 BlockProfileを直接呼び出す代わりに使用すべきです。
func CPUProfile
deprecated
func CPUProfile() []byte
CPUProfileはパニックします。 以前はランタイムによって生成されたpprof形式のプロファイルの チャンクへの直接的なアクセスを提供していました。 その形式を生成する方法が変更されたため、 この機能は削除されました。
Deprecated: runtime/pprof パッケージ、 または net/http/pprof パッケージのハンドラ、 または testing パッケージの-test.cpuprofileフラグを代わりに使用してください。
func Caller ¶
Callerは、呼び出し元ゴルーチンのスタック上での関数呼び出しについて、ファイル名と行番号の情報を報告します。 引数skipは、上昇するスタックフレームの数で、0はCallerの呼び出し元を識別します。 (歴史的な理由により、skipの意味はCallerと[Callers]で異なります。) 戻り値は、プログラムカウンタ、ファイル名(Windowsでもパス区切りにスラッシュを使用)、対応する呼び出しのファイル内の行番号を報告します。 情報の取得ができなかった場合、okはfalseになります。
func Callers ¶
Callersは、呼び出し元のゴルーチンのスタック上での関数呼び出しの戻りプログラムカウンタを、スライスpcで埋めます。 引数skipは、pcに記録する前にスキップするスタックフレームの数であり、0はCallers自体のフレームを識別し、1はCallersの呼び出し元を識別します。 pcに書き込まれたエントリ数を返します。
これらのPCを関数名や行番号などの記号情報に変換するには、CallersFrames を使用します。 CallersFramesはインライン化された関数を考慮に入れ、戻りプログラムカウンタを 呼び出しプログラムカウンタに調整します。返されたPCのスライスを直接反復処理することは 勧められません。また、返されたPCのいずれかに FuncForPC を使用することも、 インライン化や戻りプログラムカウンタの調整を考慮に入れられないため、勧められません。
func GOMAXPROCS ¶
GOMAXPROCSは同時に実行可能なCPUの最大数を設定し、以前の設定値を返します。n < 1の場合は現在の設定を変更しません。
Default ¶
GOMAXPROCS環境変数が正の整数に設定されている場合、GOMAXPROCSはその値がデフォルトになります。
それ以外の場合、Goランタイムは以下の組み合わせから適切なデフォルト値を選択します。
- マシン上の論理CPU数
- プロセスのCPUアフィニティマスク
- Linuxの場合、cgroup CPUクォータに基づくプロセスの平均CPUスループット制限(存在する場合)
GODEBUG=containermaxprocs=0が設定されていて、GOMAXPROCSが環境変数で設定されていない場合、GOMAXPROCSは[runtime.NumCPU]の値がデフォルトになります。なお、GODEBUG=containermaxprocs=0はバージョン1.24以下では default です。
Updates ¶
Goランタイムは、論理CPU数、CPUアフィニティマスク、cgroupクォータの変更に基づいてデフォルト値を定期的に更新します。 GOMAXPROCS環境変数を設定するか、GOMAXPROCSを呼び出してカスタム値を設定すると、自動更新は無効になります。 デフォルト値と自動更新は SetDefaultGOMAXPROCS を呼び出すことで元に戻せます。
GODEBUG=updatemaxprocs=0 が設定されている場合、GoランタイムはGOMAXPROCSの自動更新を行いません。 なお、GODEBUG=updatemaxprocs=0 は言語バージョン1.24以下では default です。
Compatibility ¶
デフォルトのGOMAXPROCSの挙動は、スケジューラの改善に伴い変更される可能性があることに注意してください。特に以下の実装詳細に関しては変更される場合があります。
Implementation details ¶
デフォルトのGOMAXPROCSをcgroup経由で計算する場合、GoランタイムはcgroupのCPUクォータ/期間として「平均CPUスループット制限」を計算します。cgroup v2ではこれらの値はcpu.maxファイルから取得され、cgroup v1ではそれぞれcpu.cfs_quota_usとcpu.cfs_period_usから取得されます。コンテナランタイムでCPU制限を設定できる場合、この値は通常「CPUリミット」オプションに対応し、「CPUリクエスト」ではありません。
Goランタイムは通常、論理CPU数、CPUアフィニティマスク数、cgroupのCPUスループット制限のうち最小値をデフォルトのGOMAXPROCSとして選択します。ただし、論理CPU数またはCPUアフィニティマスク数が2未満でない限り、GOMAXPROCSを2未満に設定することはありません。
cgroupのCPUスループット制限が整数でない場合、Goランタイムは次の整数に切り上げます。
GOMAXPROCSの更新は最大で1秒に1回、またはアプリケーションがアイドル状態の場合はそれ以下の頻度で行われます。
func Goexit ¶
func Goexit()
Goexitはそれを呼び出したゴルーチンを終了します。他のゴルーチンには影響を与えません。 Goexitは終了する前にすべての延期呼び出しを実行します。Goexitはパニックではないため、 これらの延期された関数内のrecover呼び出しはnilを返します。
メインゴルーチンからGoexitを呼び出すと、そのゴルーチンはfunc mainがreturnせずに終了します。 func mainがreturnしていないため、他のゴルーチンの実行は継続されます。 他のすべてのゴルーチンが終了すると、プログラムはクラッシュします。
Goランタイムによって作成されていないスレッドから呼び出すとクラッシュします。
func GoroutineProfile ¶
func GoroutineProfile(p []StackRecord) (n int, ok bool)
GoroutineProfileはアクティブなゴルーチンスタックプロファイルのレコード数であるnを返します。 もしlen(p)がn以上であれば、GoroutineProfileはプロファイルをpにコピーしnとtrueを返します。 もしlen(p)がn未満であれば、GoroutineProfileはpを変更せずにnとfalseを返します。
ほとんどのクライアントは直接GoroutineProfileを呼び出す代わりに runtime/pprof パッケージを使用するべきです。
func Gosched ¶
func Gosched()
Gosched はプロセッサを譲り、他のゴルーチンが実行されるようにします。現在のゴルーチンは一時停止されませんが、実行は自動的に再開されます。
func KeepAlive ¶ added in v1.7.0
func KeepAlive(x any)
KeepAliveは、引数を現在到達可能なものとしてマークします。 これにより、オブジェクトが解放されず、そのファイナライザが実行されないようになります。 KeepAliveが呼び出されたプログラムのポイントより前に。
KeepAliveが必要な場所を示す非常に簡単な例:
type File struct { d int }
d, err := syscall.Open("/file/path", syscall.O_RDONLY, 0)
// ... errがnilでない場合は何かを実行します ...
p := &File{d}
runtime.SetFinalizer(p, func(p *File) { syscall.Close(p.d) })
var buf [10]byte
n, err := syscall.Read(p.d, buf[:])
// Readが返るまで、pがファイナライズされないようにします。
runtime.KeepAlive(p)
// このポイント以降、pを使用しないでください。
KeepAlive呼び出しがない場合、ファイナライザは syscall.Read の開始時に実行され、 実際のシステムコールを行う前にファイルディスクリプタを閉じます。
注意:KeepAliveは、ファイナライザが予期せず実行されるのを防止するためにのみ使用する必要があります。 特に、unsafe.Pointer と一緒に使用する場合は、unsafe.Pointerの有効な使用方法のルールが適用されます。
func LockOSThread ¶
func LockOSThread()
LockOSThreadは呼び出し側のゴルーチンを現在のオペレーティングシステムスレッドに接続します。 呼び出し側のゴルーチンは常にそのスレッドで実行され、他のゴルーチンは実行されません。 それまでのLockOSThreadへの呼び出し回数と同じ数だけ、UnlockOSThread への呼び出しを行うまで、呼び出し側のゴルーチン以外は実行されません。 呼び出し側のゴルーチンがスレッドのロックを解除せずに終了すると、スレッドは終了します。
すべてのinit関数は起動時のスレッド上で実行されます。init関数からLockOSThreadを呼び出すと、main関数がそのスレッド上で呼び出されます。
ゴルーチンは、スレッドごとの状態に依存するOSサービスや非Goライブラリ関数を呼び出す前に、LockOSThreadを呼び出す必要があります。
func MemProfile ¶
func MemProfile(p []MemProfileRecord, inuseZero bool) (n int, ok bool)
MemProfileは、割り当てられたメモリと解放されたメモリのプロファイルを、割り当ての場所別に返します。 MemProfileは、現在のメモリプロファイルのレコード数であるnを返します。 もしlen(p) >= nであれば、MemProfileはプロファイルをpにコピーし、nとtrueを返します。 もしlen(p) < nであれば、MemProfileはpを変更せずに、nとfalseを返します。 inuseZeroがtrueの場合、プロファイルにはr.AllocBytes > 0 かつ r.AllocBytes == r.FreeBytesのアロケーションレコードが含まれます。 これは、メモリが割り当てられたがランタイムにすべて解放された場所です。 返されるプロファイルは、最大で2つのガベージコレクションサイクル前のものです。 これは、プロファイルがアロケーションに偏った結果にならないようにするためです。 アロケーションはリアルタイムで発生しますが、解放はガベージコレクタがスイーピングを実行するまで遅延されるため、 プロファイルはガベージコレクタによって解放されるチャンスを持ったアロケーションのみをカウントします。 多くのクライアントは、runtime/pprofパッケージまたはtestingパッケージの-test.memprofileフラグを直接呼び出す代わりに使用するべきです。
func MutexProfile ¶ added in v1.8.0
func MutexProfile(p []BlockProfileRecord) (n int, ok bool)
MutexProfileは現在のmutexプロファイルのレコード数であるnを返します。 もしlen(p) >= nならば、MutexProfileはプロファイルをpにコピーしてnとtrueを返します。 そうでなければ、MutexProfileはpを変更せずにnとfalseを返します。
ほとんどのクライアントは、MutexProfileを直接呼び出す代わりに runtime/pprof パッケージを使用するべきです。
func NumCPU ¶
func NumCPU() int
NumCPUは現在のプロセスで使用可能な論理CPUの数を返します。
利用可能なCPUのセットはプロセスの起動時にオペレーティングシステムによって確認されます。 プロセスの起動後にオペレーティングシステムのCPU割り当てに変更があっても、それは反映されません。
func ReadMemStats ¶
func ReadMemStats(m *MemStats)
ReadMemStatsはメモリアロケータ統計情報をmに書き込みます。
返されるメモリアロケータ統計情報はReadMemStatsの呼び出し時点で最新のものです。 これは、ヒーププロファイルとは異なり、最新のガベージコレクションサイクルのスナップショットです。
func ReadTrace ¶ added in v1.5.0
func ReadTrace() []byte
ReadTrace はバイナリ追跡データの次のチャンクを返します。データが利用可能になるまでブロックされます。もし追跡がオフになっており、オンの間に蓄積されたデータがすべて返された場合、ReadTrace は nil を返します。呼び出し元は、再度 ReadTrace を呼び出す前に返されたデータをコピーする必要があります。 ReadTrace は一度に1つの goroutine から呼び出す必要があります。
func SetBlockProfileRate ¶ added in v1.1.0
func SetBlockProfileRate(rate int)
SetBlockProfileRateは、ブロッキングイベントの割合を制御します。 プロファイラは、ブロックされた時間がrateナノ秒ごとに平均1つのブロッキングイベントをサンプリングすることを目指しています。
プロファイルにすべてのブロッキングイベントを含めるには、rate = 1を渡します。 プロファイリングを完全にオフにするには、rate <= 0を渡します。
func SetCPUProfileRate ¶
func SetCPUProfileRate(hz int)
SetCPUProfileRateはCPUプロファイリングのレートをhzサンプル/秒に設定します。 hz <= 0の場合、プロファイリングはオフになります。 プロファイラがオンの場合、レートを変更する前にオフにする必要があります。
ほとんどのクライアントは、runtime/pprof パッケージまたは testing パッケージの-test.cpuprofileフラグを直接呼び出す代わりに使用するべきです。
func SetCgoTraceback ¶ added in v1.7.0
SetCgoTracebackは、Cコードからトレースバック情報を収集し、そのトレースバック情報をシンボル情報に変換するために使用する3つのC関数を記録します。 これらは、cgoを使用するプログラムのスタックトレースを印刷するときに使用されます。
トレースバックとコンテキスト関数は、シグナルハンドラから呼び出すことができるため、 非同期シグナルセーフ関数のみを使用する必要があります。 シンボライザ関数は、プログラムがクラッシュしている間に呼び出される可能性があるため、 メモリの使用に注意する必要があります。これらの関数のいずれも、Goにコールバックすることはできません。
context関数は、構造体へのポインタを単一の引数として呼び出されます。
struct {
Context uintptr
}
In C syntax, this struct will be
struct {
uintptr_t Context;
};
Contextフィールドが0の場合、context関数は現在のトレースバックコンテキストを記録するために呼び出されます。 おそらくスタックポインタとPCなど、後でスタックトレースを生成するために必要な現在の実行ポイントに関する情報をContextフィールドに記録する必要があります。 この場合、context関数はCコードから呼び出されます。
Contextフィールドが0でない場合、それは以前のcontext関数の呼び出しで返された値です。 この場合、GoコードがCコードの呼び出し元に戻るとき、つまりコンテキストが不要になったときに呼び出されます。 これにより、context関数は関連するリソースを解放できます。
context関数が呼び出されるたびに完全なスタックトレースを記録し、 traceback関数でそれを単にコピーすることが正しいと言えますが、 典型的なプログラムでは、context関数はそのコンテキストのためにトレースバックを記録することなく多数の呼び出しが行われます。 context関数の呼び出しで完全なスタックトレースを記録することは、効率的ではない可能性があります。
traceback関数は、構造体へのポインタを単一の引数として呼び出されます。
struct {
Context uintptr
SigContext uintptr
Buf *uintptr
Max uintptr
}
In C syntax, this struct will be
struct {
uintptr_t Context;
uintptr_t SigContext;
uintptr_t* Buf;
uintptr_t Max;
};
Contextフィールドが0の場合、現在のプログラム実行ポイントからトレースバックを収集するために使用されます。 この場合、traceback関数はCコードから呼び出されます。
それ以外の場合、Contextは以前のcontext関数の呼び出しで返された値です。 traceback関数は、その保存されたプログラム実行ポイントからスタックトレースを収集する必要があります。 traceback関数は、コンテキストが有効で変更されていないことがわかっている場合にのみ、 コンテキストを記録した実行スレッド以外の実行スレッドから呼び出すことができます。 traceback関数は、同じスレッドでコンテキストを記録した深い呼び出しスタックでも呼び出すことができます。 traceback関数は、同じContext値で複数回呼び出されることがあります。 特定のコンテキスト値に対して最初に呼び出された場合、可能であれば結果をキャッシュするのが通常適切です。
Unixシステムのシグナルハンドラからtraceback関数が呼び出された場合、 SigContextはシグナルハンドラに渡されたシグナルコンテキスト引数です(uintptr_tにキャストされたCのucontext_t*)。 これを使用して、シグナルが発生したポイントからトレースを開始できます。 traceback関数がシグナルハンドラから呼び出されていない場合、SigContextはゼロになります。
Bufはトレースバック情報を格納する場所です。 Buf[0]が呼び出し元のPCであり、Buf[1]がその関数の呼び出し元のPCであるような、PC値である必要があります。 Maxは格納するエントリの最大数です。 関数は、スタックのトップを示すためにゼロを格納する必要があります。 または、呼び出し元が別のスタック、おそらくGoスタックにあることを示します。
runtime.Callersとは異なり、返されるPC値は、 シンボライザ関数に渡された場合、呼び出し命令のファイル/行を返す必要があります。 追加の減算は必要ありません。また、適切ではありません。
すべてのプラットフォームで、トレースバック関数は、GoからCへの呼び出しとCからGoへの呼び出しの間でスタックトレースを要求する場合に呼び出されます。 linux/amd64、linux/ppc64le、linux/arm64、およびfreebsd/amd64では、トレースバック関数は、cgo呼び出しを実行しているスレッドがシグナルを受信した場合にも呼び出されます。 トレースバック関数は、いつ呼び出されるかについての仮定をするべきではありません。将来のGoのバージョンでは、追加の呼び出しが行われる可能性があります。
シンボライザ関数は、構造体へのポインタを単一の引数として呼び出されます。
struct {
PC uintptr // 情報を取得するプログラムカウンタ
File *byte // ファイル名(NULで終わる)
Lineno uintptr // 行番号
Func *byte // 関数名(NULで終わる)
Entry uintptr // 関数のエントリポイント
More uintptr // このPCに対してさらに情報がある場合は非ゼロに設定します
Data uintptr // ランタイムによって使用されない、関数で使用可能なデータ
}
C言語の構文では、この構造体は次のようになります。
struct {
uintptr_t PC;
char* File;
uintptr_t Lineno;
char* Func;
uintptr_t Entry;
uintptr_t More;
uintptr_t Data;
};
PCフィールドは、traceback関数の呼び出しで返される値です。
トレースバック関数が特定のトレースバックに対して最初に呼び出された場合、 PC以外のすべてのフィールドは0になります。 情報が利用できない場合は、フィールドを0/nilに設定して、他のフィールドを埋める必要があります。 Dataフィールドは、呼び出し間で有用な情報を格納するために使用できます。 Moreフィールドは、このPCに対してさらに情報がある場合は非ゼロに設定します。 Moreが非ゼロに設定されている場合、同じPCで再度呼び出され、異なる情報を返すことができます(これはインライン関数で使用するために意図されています)。 Moreがゼロの場合、次のPC値でトレースバック関数が呼び出されます。 トレースバックが完了すると、PCがゼロに設定された状態で関数が1回呼び出されます。 これは、情報を解放するために使用できます。 各呼び出しでは、Moreフィールドがゼロである場合を除き、構造体のフィールドが呼び出し前と同じ値に設定されたままになります。 関数は、呼び出し間で構造体ポインタのコピーを保持してはいけません。
SetCgoTracebackを呼び出すとき、version引数は関数が受け取る構造体のバージョン番号です。 現在、これは0でなければなりません。
シンボライザ関数がnilの場合、トレースバック関数の結果は数値として表示されます。 トレースバック関数がnilの場合、シンボライザ関数は呼び出されません。 コンテキスト関数がnilの場合、トレースバック関数はコンテキストフィールドが0に設定された状態でのみ呼び出されます。 コンテキスト関数がnilの場合、GoからCへの呼び出しでは、C部分の呼び出しスタックのトレースバックは表示されません。
SetCgoTracebackは、理想的にはinit関数から1回だけ呼び出す必要があります。
func SetDefaultGOMAXPROCS ¶ added in v1.25.0
func SetDefaultGOMAXPROCS()
SetDefaultGOMAXPROCSは、GOMAXPROCSの設定をランタイムのデフォルト値に更新します。GOMAXPROCS で説明されている通り、GOMAXPROCS環境変数は無視されます。
SetDefaultGOMAXPROCSは、GOMAXPROCS環境変数や以前の[GOMAXPROCS]呼び出しによって自動更新が無効化されている場合に、デフォルトの自動更新GOMAXPROCS動作を有効にするため、または論理CPU数・CPUアフィニティマスク・cgroupクォータの合計が変更されたことを呼び出し元が認識している場合に即座に更新を強制するために使用できます。
func SetFinalizer ¶
SetFinalizerは、objに関連付けられたファイナライザを提供されたファイナライザ関数に設定します。 ガベージコレクタが関連付けられたファイナライザを持つ到達不能なブロックを見つけると、 関連付けをクリアし、別のゴルーチンでfinalizer(obj)を実行します。 これにより、objは再び到達可能になりますが、関連付けられたファイナライザはなくなります。 SetFinalizerが再度呼び出されない限り、次にガベージコレクタがobjが到達不能であることを検出した場合、objは解放されます。
SetFinalizer(obj, nil)は、objに関連付けられたファイナライザをクリアします。
新しいGoコードでは、SetFinalizerよりも AddCleanup の使用を検討してください。AddCleanupの方がはるかにエラーが発生しにくいです。
引数objは、newで割り当てるか、複合リテラルのアドレスを取得するか、ローカル変数のアドレスを取得することで割り当てられたオブジェクトへのポインタでなければなりません。 引数finalizerは、objの型を代入できる単一の引数を取る関数であり、戻り値は任意で無視されます。これらの条件を満たさない場合、SetFinalizerはプログラムを中断することがあります。
ファイナライザは依存関係の順序で実行されます。 AがBを指し示し、両方にファイナライザがあり、それらが到達不能である場合、Aのファイナライザのみが実行されます。 Aが解放された後、Bのファイナライザが実行されます。 ファイナライザを持つブロックを含む循環構造がある場合、その循環はガベージコレクトされることは保証されず、 依存関係を尊重する順序がないため、ファイナライザが実行されることも保証されません。
ファイナライザは、プログラムがobjが指し示すオブジェクトに到達できなくなった後、 任意の時点で実行されるようにスケジュールされます。 プログラムが終了する前にファイナライザが実行されることは保証されていないため、 通常、長時間実行されるプログラム中にオブジェクトに関連付けられた非メモリリソースを解放するためにのみ有用です。 たとえば、os.File オブジェクトは、プログラムがCloseを呼び出さずにos.Fileを破棄するときに、 関連するオペレーティングシステムのファイルディスクリプタを閉じるためにファイナライザを使用できますが、 bufio.WriterのようなインメモリI/Oバッファをフラッシュするためにファイナライザに依存することは誤りです。 なぜなら、プログラムが終了するときにバッファがフラッシュされないためです。
*objのサイズがゼロバイトの場合、ファイナライザが実行されることは保証されません。 なぜなら、メモリ内の他のゼロサイズのオブジェクトと同じアドレスを共有する可能性があるためです。 詳細については、https://go.dev/ref/spec#Size_and_alignment_guarantees を参照してください。
パッケージレベルの変数の初期化子で割り当てられたオブジェクトに対して、 ファイナライザが実行されることは保証されません。 このようなオブジェクトはヒープに割り当てられるのではなく、リンカによって割り当てられる可能性があります。
ファイナライザがオブジェクトが参照されなくなってから任意の時間が経過した後に実行される可能性があるため、 ランタイムは、オブジェクトを単一の割り当てスロットにまとめるスペース節約の最適化を実行できます。 そのような割り当て内の参照されなくなったオブジェクトのファイナライザは、常に参照されたオブジェクトと同じバッチに存在する場合、実行されない可能性があります。 通常、このバッチ処理は、小さな(16バイト以下の)ポインタフリーオブジェクトに対してのみ行われます。
ファイナライザは、オブジェクトが到達不能になるとすぐに実行される可能性があります。 ファイナライザを正しく使用するためには、プログラムはオブジェクトが不要になるまで到達可能であることを保証する必要があります。 グローバル変数に格納されたオブジェクトや、グローバル変数からポインタをたどって見つけることができるオブジェクトは到達可能です。 関数の引数やレシーバは、関数がそれを最後に言及する時点で到達不能になる可能性があります。 到達不能なオブジェクトを到達可能にするためには、そのオブジェクトを KeepAlive 関数の呼び出しに渡して、 関数内でオブジェクトが到達可能でなければならない最後の時点をマークします。
たとえば、pがファイルディスクリプタdを含むos.Fileのような構造体を指し示す場合、 pにはdを閉じるファイナライザがあり、pの最後の使用がsyscall.Write(p.d、buf、size)の呼び出しである場合、 プログラムがsyscall.Writeに入るとすぐにpが到達不能になる可能性があります。 その瞬間にファイナライザが実行され、p.dを閉じ、syscall.Writeが閉じられたファイルディスクリプタ(または、 より悪い場合、別のgoroutineによって開かれた完全に異なるファイルディスクリプタ)に書き込もうとして失敗する可能性があります。 この問題を回避するには、syscall.Writeの呼び出し後にKeepAlive(p)を呼び出します。
プログラムのすべてのファイナライザを、1つのgoroutineが順次実行します。 ファイナライザが長時間実行する必要がある場合は、新しいgoroutineを開始することで実行する必要があります。
Goのメモリモデルの用語で、SetFinalizer(x、f)の呼び出しは、 ファイナライザ呼び出しf(x)の前に「同期」します。 ただし、KeepAlive(x)またはxの他の使用がf(x)の前に「同期」されることは保証されていないため、 一般的には、ファイナライザがxの可変状態にアクセスする必要がある場合は、ミューテックスまたは他の同期メカニズムを使用する必要があります。 たとえば、x内の時折変更される可変フィールドを検査するファイナライザを考えてみましょう。 xが到達不能になり、ファイナライザが呼び出される前に、メインプログラムで時折変更される場合。 メインプログラムでの変更とファイナライザでの検査は、読み書き競合を回避するために、ミューテックスやアトミック更新などの適切な同期を使用する必要があります。
func SetMutexProfileFraction ¶ added in v1.8.0
SetMutexProfileFractionは、mutexの衝突イベントのうち、 プロファイルに報告される割合を制御します。平均して1/rateのイベントが報告されます。 以前のrateが返されます。
プロファイリングを完全に無効にするには、rateに0を渡します。 現在のrateだけを読み取るには、rateに0より小さい値を渡します。 (n>1の場合、サンプリングの詳細が変更される場合があります。)
func Stack ¶
Stackは呼び出し元のゴルーチンのスタックトレースをbufに書き込み、 bufに書き込まれたバイト数を返します。 allがtrueの場合、現在のゴルーチンのトレースの後に、 他のすべてのゴルーチンのスタックトレースをbufに書き込みます。
func StartTrace ¶ added in v1.5.0
func StartTrace() error
StartTraceは現在のプロセスのトレースを有効にします。 トレース中はデータがバッファされ、ReadTrace を介して利用可能です。 トレースが既に有効化されている場合、StartTraceはエラーを返します。 ほとんどのクライアントは runtime/trace パッケージや testing パッケージの-test.traceフラグを直接呼び出す代わりに使用するべきです。
func StopTrace ¶ added in v1.5.0
func StopTrace()
StopTraceは、以前に有効にされていた場合にトレースを停止します。 StopTraceは、トレースのすべての読み取りが完了するまで戻りません。
func ThreadCreateProfile ¶
func ThreadCreateProfile(p []StackRecord) (n int, ok bool)
ThreadCreateProfileはスレッド作成プロファイル内のレコード数であるnを返します。 もし、len(p) >= nならば、ThreadCreateProfileはプロファイルをpにコピーしてn, trueを返します。 もし、len(p) < nならば、ThreadCreateProfileはpを変更せずにn, falseを返します。
大抵のクライアントは直接ThreadCreateProfileを呼び出す代わりに、runtime/pprofパッケージを使用すべきです。
func UnlockOSThread ¶
func UnlockOSThread()
UnlockOSThreadは、以前のLockOSThread呼び出しを取り消します。 呼び出し元のゴルーチンのアクティブなLockOSThread呼び出し数がゼロになると、 呼び出し元のゴルーチンは固定されたオペレーティングシステムスレッドからの接続が解除されます。 アクティブなLockOSThread呼び出しがない場合、これは無効操作です。
UnlockOSThreadを呼び出す前に、呼び出し元は他のゴルーチンを実行するためにOSスレッドが適していることを確認する必要があります。 呼び出し元が他のゴルーチンに影響を与えるスレッドの状態に対して恒久的な変更を行った場合、 この関数を呼び出さずにゴルーチンをOSスレッドにロックしたままにしておくべきです。
Types ¶
type BlockProfileRecord ¶ added in v1.1.0
type BlockProfileRecord struct {
Count int64
Cycles int64
StackRecord
}
BlockProfileRecordは、特定の呼び出しシーケンス(スタックトレース)で発生したブロッキングイベントを記述します。
type Cleanup ¶ added in v1.25.0
type Cleanup struct {
// contains filtered or unexported fields
}
Cleanup is a handle to a cleanup call for a specific object.
func AddCleanup ¶ added in v1.25.0
AddCleanup attaches a cleanup function to ptr. Some time after ptr is no longer reachable, the runtime will call cleanup(arg) in a separate goroutine.
A typical use is that ptr is an object wrapping an underlying resource (e.g., a File object wrapping an OS file descriptor), arg is the underlying resource (e.g., the OS file descriptor), and the cleanup function releases the underlying resource (e.g., by calling the close system call).
There are few constraints on ptr. In particular, multiple cleanups may be attached to the same pointer, or to different pointers within the same allocation.
If ptr is reachable from cleanup or arg, ptr will never be collected and the cleanup will never run. As a protection against simple cases of this, AddCleanup panics if arg is equal to ptr.
There is no specified order in which cleanups will run. In particular, if several objects point to each other and all become unreachable at the same time, their cleanups all become eligible to run and can run in any order. This is true even if the objects form a cycle.
Cleanups run concurrently with any user-created goroutines. Cleanups may also run concurrently with one another (unlike finalizers). If a cleanup function must run for a long time, it should create a new goroutine to avoid blocking the execution of other cleanups.
If ptr has both a cleanup and a finalizer, the cleanup will only run once it has been finalized and becomes unreachable without an associated finalizer.
The cleanup(arg) call is not always guaranteed to run; in particular it is not guaranteed to run before program exit.
Cleanups are not guaranteed to run if the size of T is zero bytes, because it may share same address with other zero-size objects in memory. See https://go.dev/ref/spec#Size_and_alignment_guarantees.
It is not guaranteed that a cleanup will run for objects allocated in initializers for package-level variables. Such objects may be linker-allocated, not heap-allocated.
Note that because cleanups may execute arbitrarily far into the future after an object is no longer referenced, the runtime is allowed to perform a space-saving optimization that batches objects together in a single allocation slot. The cleanup for an unreferenced object in such an allocation may never run if it always exists in the same batch as a referenced object. Typically, this batching only happens for tiny (on the order of 16 bytes or less) and pointer-free objects.
A cleanup may run as soon as an object becomes unreachable. In order to use cleanups correctly, the program must ensure that the object is reachable until it is safe to run its cleanup. Objects stored in global variables, or that can be found by tracing pointers from a global variable, are reachable. A function argument or receiver may become unreachable at the last point where the function mentions it. To ensure a cleanup does not get called prematurely, pass the object to the KeepAlive function after the last point where the object must remain reachable.
Example ¶
package main
import (
"github.com/shogo82148/std/fmt"
"github.com/shogo82148/std/os"
"github.com/shogo82148/std/runtime"
)
func main() {
tempFile, err := os.CreateTemp(os.TempDir(), "file.*")
if err != nil {
fmt.Println("failed to create temp file:", err)
return
}
ch := make(chan struct{})
// Attach a cleanup function to the file object.
runtime.AddCleanup(&tempFile, func(fileName string) {
if err := os.Remove(fileName); err == nil {
fmt.Println("temp file has been removed")
}
ch <- struct{}{}
}, tempFile.Name())
if err := tempFile.Close(); err != nil {
fmt.Println("failed to close temp file:", err)
return
}
// Run the garbage collector to reclaim unreachable objects
// and enqueue their cleanup functions.
runtime.GC()
// Wait until cleanup function is done.
<-ch
}
Output: temp file has been removed
func (Cleanup) Stop ¶ added in v1.25.0
func (c Cleanup) Stop()
Stop cancels the cleanup call. Stop will have no effect if the cleanup call has already been queued for execution (because ptr became unreachable). To guarantee that Stop removes the cleanup function, the caller must ensure that the pointer that was passed to AddCleanup is reachable across the call to Stop.
type Error ¶
type Error interface {
error
RuntimeError()
}
Errorはpanicで使用されるランタイムエラーを識別します。
Goランタイムは、Go言語仕様で説明されている様々なケース、例えばスライスや配列の範囲外アクセス、nilチャネルのクローズ、型アサーションの失敗などでpanicを発生させます。
これらのケースが発生した場合、GoランタイムはErrorを実装するエラーでpanicします。これは、panicからのリカバリー時に、カスタムアプリケーションのpanicと基本的なランタイムpanicを区別するのに役立ちます。
Go標準ライブラリ以外のパッケージでErrorを実装すべきではありません。
type Frame ¶ added in v1.7.0
type Frame struct {
// PCはこのフレームの位置に対するプログラムカウンタです。
// 別のフレームを呼び出すフレームの場合、これは
// 呼び出し命令のプログラムカウンタです。インライン展開のため、
// 複数のフレームは同じPC値を持つことがありますが、異なる
// シンボリック情報を持ちます。
PC uintptr
// Funcはこの呼び出しフレームのFunc値です。これは、非Goコードや完全にインライン化された関数の場合はnilになることがあります。
Func *Func
// Functionはこの呼び出しフレームのパッケージパス修飾された関数名です。非空であれば、この文字列はプログラム内の1つの関数を一意に識別します。
// これは知られていない場合は空の文字列になることがあります。
// Funcがnilでない場合、Function == Func.Name()です。
Function string
// FileとLineは、このフレーム内の位置のファイル名と行番号です。
// 非リーフフレームの場合、これは呼び出し位置になります。
// これらは、それぞれ空文字列およびゼロになる場合があります(情報が不明な場合)。
// ファイル名はWindowsでもスラッシュ区切りを使用します。
File string
Line int
// 関数のエントリーポイントのプログラムカウンター。不明の場合はゼロ。
// Funcがnilでない場合、Entry == Func.Entry()。
Entry uintptr
// contains filtered or unexported fields
}
Frameは各コールフレームごとに Frames によって返される情報です。
type Frames ¶ added in v1.7.0
type Frames struct {
// contains filtered or unexported fields
}
Framesを使用すると、Callers が返すPC値のスライスのための関数/ファイル/行情報を取得できます。
Example ¶
package main
import (
"github.com/shogo82148/std/fmt"
"github.com/shogo82148/std/runtime"
"github.com/shogo82148/std/strings"
)
func main() {
c := func() {
// runtime.Callersを含めて最大10個のPCを要求します。
pc := make([]uintptr, 10)
n := runtime.Callers(0, pc)
if n == 0 {
// PC(プログラムカウンタ)が利用できません。これは、runtime.Callersの最初の引数が大きい場合に発生する可能性があります。
//
// frames.Next以下で返されるはずのゼロのフレームを処理しないため、ここでリターンします。
return
}
pc = pc[:n] // runtime.CallersFramesには有効なプログラムカウンタ(pcs)のみを渡してください。
frames := runtime.CallersFrames(pc)
// フレームを取得するためのループ。
// 固定数のPCが無限のフレームに拡張できます。
for {
frame, more := frames.Next()
// 関数名を正規化し、この関数の呼び出し元をスキップします。
// 例の出力を予測可能にするためです。
// 通常は自身のコードでこれを使う必要はありません。
function := strings.ReplaceAll(frame.Function, "main.main", "runtime_test.ExampleFrames")
fmt.Printf("- more:%v | %s\n", more, function)
if function == "runtime_test.ExampleFrames" {
break
}
// このフレームの処理後にさらにフレームがあるかどうかを確認します。
if !more {
break
}
}
}
b := func() { c() }
a := func() { b() }
a()
}
Output: - more:true | runtime.Callers - more:true | runtime_test.ExampleFrames.func1 - more:true | runtime_test.ExampleFrames.func2 - more:true | runtime_test.ExampleFrames.func3 - more:true | runtime_test.ExampleFrames
func CallersFrames ¶ added in v1.7.0
CallersFramesは Callers によって返されるPC値のスライスを受け取り、 関数/ファイル/行情報を返す準備をします。 Frames で終わるまでスライスを変更しないでください。
type Func ¶
type Func struct {
// contains filtered or unexported fields
}
Funcは実行中のバイナリ内のGo関数を表します。
func FuncForPC ¶
FuncForPCは、指定されたプログラムカウンターアドレスを含む関数を記述した*Func を返します。もし複数の関数がインライン展開の影響で存在する場合は、最も内側の関数を示す*Funcを返しますが、最も外側の関数のエントリーも持っています。
pcがインライン展開によって複数の関数を表す場合、最も内側の関数を記述する*Funcを返しますが、エントリーは最も外側の関数のものになります。
type MemProfileRecord ¶
type MemProfileRecord struct {
AllocBytes, FreeBytes int64
AllocObjects, FreeObjects int64
Stack0 [32]uintptr
}
MemProfileRecordは、特定の呼び出しシーケンス(スタックトレース)によって割り当てられた生きているオブジェクトを記述します。
func (*MemProfileRecord) InUseBytes ¶
func (r *MemProfileRecord) InUseBytes() int64
InUseBytesは使用中のバイト数(AllocBytes - FreeBytes)を返します。
func (*MemProfileRecord) InUseObjects ¶
func (r *MemProfileRecord) InUseObjects() int64
InUseObjectsは使用中のオブジェクトの数を返します(AllocObjects - FreeObjects)。
func (*MemProfileRecord) Stack ¶
func (r *MemProfileRecord) Stack() []uintptr
Stackは、レコードに関連付けられたスタックトレースを返します。 r.Stack0のプレフィックスです。
type MemStats ¶
type MemStats struct {
// Allocは割り当てられたヒープオブジェクトのバイト数です。
//
// これはHeapAllocと同じです(以下を参照)。
Alloc uint64
// TotalAllocはヒープオブジェクトのために割り当てられた累積バイト数です。
//
// TotalAllocはヒープオブジェクトが割り当てられると増加しますが、
// AllocとHeapAllocとは異なり、オブジェクトが解放されると減少しません。
TotalAlloc uint64
// SysはOSから取得したメモリの合計バイト数です。
//
// Sysは以下のXSysフィールドの合計です。SysはGoランタイムがヒープ、スタック、および他の内部データ構造に予約した仮想アドレススペースを計測します。ある時点では、仮想アドレススペースのすべてが物理メモリでバックアップされているわけではありませんが、一般的にはすべてバックアップされています。
Sys uint64
// Lookupsはランタイムによって実行されるポインターの参照の数です。
//
// これは主にランタイム内部のデバッグに役立ちます。
Lookups uint64
// Mallocsはヒープオブジェクトの割り当て数の累積数です。
// 生存しているオブジェクトの数はMallocs - Freesです。
Mallocs uint64
// Frees はヒープオブジェクトが解放された累積数です。
Frees uint64
// HeapAllocは割り当てられたヒープオブジェクトのバイト数です。
//
// "割り当てられた"ヒープオブジェクトには、到達可能なオブジェクト全体と、
// ガベージコレクタがまだ解放していない到達不能なオブジェクトが含まれます。
// 具体的には、ヒープオブジェクトが割り当てられるとHeapAllocは増加し、
// ヒープがスイープされて到達不能なオブジェクトが解放されるとHeapAllocは減少します。
// スイープはGCサイクル間に段階的に行われるため、
// これらの2つのプロセスは同時に発生し、その結果HeapAllocは滑らかに変化します
//(ストップ・ザ・ワールドのガベージコレクタの典型的なギザギザとは対照的です)。
HeapAlloc uint64
// HeapSysはOSから取得されたヒープメモリのバイト数です。
//
// HeapSysは、ヒープのために予約された仮想アドレス空間の量を測定します。
// これには、まだ使用されていないが予約されている仮想アドレス空間が含まれます。
// これは物理メモリを消費しませんが、通常は小さくなります。
// また、使用されなくなった後に物理メモリがOSに返された仮想アドレス空間も含まれます(後者の測定にはHeapReleasedを参照してください)。
//
// HeapSysは、ヒープが持っていた最大のサイズを推測します。
HeapSys uint64
// HeapIdleはアイドル状態(未使用)のスパンのバイト数です。
//
// アイドルスパンにはオブジェクトが含まれていません。これらのスパンは
// OSに返却されることができます(または既に返却されているかもしれません)し、ヒープの割り当てに再利用されることもあります。
// また、スタックメモリとして再利用されることもあります。
//
// HeapIdleからHeapReleasedを引いた値は、OSに返還できるメモリ量を見積もるものですが、
// ランタイムによって保持されているため、ヒープの拡張時にOSからの追加メモリ要求なしでヒープを成長させるために利用されています。
// もし、この差がヒープサイズよりもはるかに大きい場合、最近の一時的なライブヒープサイズの急増を示しています。
HeapIdle uint64
// HeapInuseは使用中スパンのバイト数です。
//
// 使用中スパンには少なくとも1つのオブジェクトが含まれています。
// これらのスパンはおおよそ同じサイズの他のオブジェクトにのみ使用できます。
//
// HeapInuseからHeapAllocを引いた値は、特定のサイズクラスに割り当てられたメモリの量を推定しますが、現在は使用されていません。
// これは断片化の上限であり、一般的にこのメモリは効率的に再利用できます。
HeapInuse uint64
// HeapReleasedはOSに返される物理メモリのバイト数です。
//
// これは、ヒープに再取得される前に、アイドルスパンから返された
// ヒープメモリをカウントしています。
HeapReleased uint64
// HeapObjectsは割り当てられたヒープオブジェクトの数です。
//
// HeapAllocと同様に、オブジェクトが割り当てられると増加し、
// ヒープが掃引され、到達不能なオブジェクトが解放されると減少します。
HeapObjects uint64
// StackInuse はスタックスパンのバイト数です。
//
// 使用中のスタックスパンには少なくとも1つのスタックがあります。これらのスパンは同じサイズの他のスタックにしか使用できません。
//
// StackIdle は存在しません。未使用のスタックスパンはヒープに戻されるため(そのため HeapIdle にカウントされます)。
StackInuse uint64
// StackSysはOSから取得したスタックメモリのバイト数です。
//
// StackSysはStackInuseに加えて、OSスレッドスタック用に直接
// OSから取得したメモリです。
//
// cgoを使用しないプログラムでは、このメトリックは現在StackInuseと同じです
// (しかし、これに依存するべきではなく、値は将来変わる可能性があります)。
//
// cgoを使用するプログラムでは、OSスレッドスタックも含まれます。
// 現在、c-sharedおよびc-archiveビルドモードでは1つのスタックのみを考慮し、
// 他のOSからのスタック(特にCコードによって割り当てられたスタック)は現在計測されていません。
// これも将来変更される可能性があります。
StackSys uint64
// MSpanInuseは割り当てられたmspan構造体のバイト数です。
MSpanInuse uint64
// MSpanSysは、mspan構造体のためにOSから取得したメモリのバイトです。
MSpanSys uint64
// MCacheInuseは割り当てられたmcache構造体のバイト数です。
MCacheInuse uint64
// MCacheSysは、mcache構造体のためにオペレーティングシステムから取得されたバイト数です。
MCacheSys uint64
BuckHashSys uint64
// GCSysはゴミ回収メタデータのメモリのバイト数です。
GCSys uint64
// OtherSys は、さまざまなオフヒープランタイム割り当てのメモリのバイト数です。
OtherSys uint64
// NextGCは次のGCサイクルのターゲットヒープサイズです。
//
// ガベージコレクタの目標は、HeapAlloc ≤ NextGCを維持することです。
// 各GCサイクルの終了時に、次のサイクルのターゲットは
// アクセス可能なデータの量とGOGCの値に基づいて計算されます。
NextGC uint64
// LastGCは、最後のガベージコレクションが終了した時刻で、
// 1970年以降のUNIXエポックからの経過時間(ナノ秒単位)です。
LastGC uint64
// PauseTotalNsは、プログラムが開始されてからのGCによる累積ナノ秒数です。
//
// ストップ・ザ・ワールド・ポーズ中には、すべてのゴルーチンが一時停止され、
// ガベージコレクタのみが実行されます。
PauseTotalNs uint64
// PauseNsは直近のGCのストップ・ザ・ワールドの一時停止時間(ナノ秒)の循環バッファです。
//
// 最も直近の一時停止はPauseNs[(NumGC+255)%256]にあります。一般的に、PauseNs[N%256]は直近のN%256番目のGCサイクルでの一時停止時間を記録しています。1つのGCサイクルに複数の一時停止が存在する可能性があります。これはサイクル中のすべての一時停止の合計です。
PauseNs [256]uint64
// PauseEndは最近のGCの一時停止終了時間の循環バッファで、1970年以降のナノ秒(UNIXエポック)で表されます。
//
// このバッファはPauseNsと同じ方法で埋められます。1つのGCサイクルに複数の一時停止がある場合があります。このバッファはサイクル内の最後の一時停止の終了を記録します。
PauseEnd [256]uint64
// NumGCは完了したGCサイクルの数です。
NumGC uint32
// NumForcedGC は、アプリケーションがGC関数を呼び出し、強制的に実行されたGCサイクルの回数です。
NumForcedGC uint32
// GCCPUFractionは、プログラム開始以来のGCによって使用された利用可能なCPU時間の割合です。
//
// GCCPUFractionは0から1の数値で表され、0はこのプログラムのCPUの使用が全くないことを意味します。
// プログラムの利用可能なCPU時間は、プログラム開始時からのGOMAXPROCSの積分と定義されます。
// つまり、GOMAXPROCSが2で、プログラムが10秒間実行されている場合、その「利用可能なCPU時間」は20秒です。
// GCCPUFractionには、書き込みバリアのアクティビティに使用されたCPU時間は含まれません。
//
// これは、GODEBUG=gctrace=1によって報告されるCPUの割合と同じです。
GCCPUFraction float64
// EnableGCはGCが有効であることを示します。常にtrueですが、
// GOGC=offの場合でも有効です。
EnableGC bool
// DebugGC は現在使用されていません。
DebugGC bool
// BySizeは、サイズごとの割り当て統計を報告します。
//
// BySize[N]は、サイズSの割り当てに関する統計を提供します。ここで、BySize[N-1].Size < S ≤ BySize[N].Sizeです。
//
// これは、BySize[60].Sizeより大きい割り当てを報告しません。
BySize [61]struct {
Size uint32
Mallocs uint64
Frees uint64
}
}
MemStatsはメモリアロケータに関する統計情報を記録します。
type PanicNilError ¶ added in v1.21.0
type PanicNilError struct {
// contains filtered or unexported fields
}
PanicNilErrorは、コードがpanic(nil)を呼び出したときに発生します。
Go 1.21より前のバージョンでは、panic(nil)を呼び出すプログラムでは、recoverがnilを返すことが観察されました。 Go 1.21以降、panic(nil)を呼び出すプログラムでは、recoverが*PanicNilErrorを返すことが観察されます。 プログラムは、GODEBUG=panicnil=1を設定することで古い動作に戻すことができます。
func (*PanicNilError) Error ¶ added in v1.21.0
func (*PanicNilError) Error() string
func (*PanicNilError) RuntimeError ¶ added in v1.21.0
func (*PanicNilError) RuntimeError()
type Pinner ¶ added in v1.21.0
type Pinner struct {
// contains filtered or unexported fields
}
Pinnerは、メモリ内の固定された場所に各Goオブジェクトが固定されたセットです。 [Pinner.Pin]メソッドは1つのオブジェクトを固定し、[Pinner.Unpin]メソッドはすべての固定されたオブジェクトを解除します。 詳細については、それぞれのコメントを参照してください。
func (*Pinner) Pin ¶ added in v1.21.0
PinはGoオブジェクトをピン留めし、Pinner.Unpin メソッドが呼び出されるまで、 ガベージコレクタによって移動または解放されるのを防ぎます。
固定されたオブジェクトへのポインタは、Cメモリに直接格納されるか、C関数に渡されるGoメモリに含まれることができます。 固定されたオブジェクト自体がGoオブジェクトへのポインタを含む場合、これらのオブジェクトがCコードからアクセスされる場合は、別途固定する必要があります。
引数は、任意の型のポインタまたは unsafe.Pointer である必要があります。 非Goポインタに対してPinを呼び出すことは安全であり、その場合、Pinは何もしません。
type StackRecord ¶
type StackRecord struct {
Stack0 [32]uintptr
}
StackRecordは単一の実行スタックを説明します。
func (*StackRecord) Stack ¶
func (r *StackRecord) Stack() []uintptr
Stackは、レコードに関連付けられたスタックトレースを返します。 これはr.Stack0のプレフィックスです。
type TypeAssertionError ¶
type TypeAssertionError struct {
// contains filtered or unexported fields
}
TypeAssertionErrorは、型アサーションの失敗を説明します。
func (*TypeAssertionError) Error ¶
func (e *TypeAssertionError) Error() string
func (*TypeAssertionError) RuntimeError ¶
func (*TypeAssertionError) RuntimeError()
Source Files
¶
- alg.go
- arena.go
- asan0.go
- atomic_pointer.go
- badlinkname.go
- badlinkname_linux.go
- cgo.go
- cgo_mmap.go
- cgo_sigaction.go
- cgocall.go
- cgocallback.go
- cgocheck.go
- cgroup_linux.go
- chan.go
- checkptr.go
- compiler.go
- complex.go
- coro.go
- covercounter.go
- covermeta.go
- cpuflags.go
- cpuflags_amd64.go
- cpuprof.go
- cputicks.go
- create_file_unix.go
- debug.go
- debugcall.go
- debuglog.go
- debuglog_off.go
- defs_linux_amd64.go
- env_posix.go
- error.go
- extern.go
- fastlog2.go
- fastlog2table.go
- fds_unix.go
- float.go
- hash64.go
- heapdump.go
- histogram.go
- iface.go
- lfstack.go
- linkname.go
- linkname_unix.go
- lock_futex.go
- lock_spinbit.go
- lockrank.go
- lockrank_off.go
- malloc.go
- map.go
- map_fast32.go
- map_fast64.go
- map_faststr.go
- mbarrier.go
- mbitmap.go
- mcache.go
- mcentral.go
- mcheckmark.go
- mcleanup.go
- mem.go
- mem_linux.go
- mem_nonsbrk.go
- metrics.go
- mfinal.go
- mfixalloc.go
- mgc.go
- mgclimit.go
- mgcmark.go
- mgcmark_nogreenteagc.go
- mgcpacer.go
- mgcscavenge.go
- mgcstack.go
- mgcsweep.go
- mgcwork.go
- mheap.go
- minmax.go
- mpagealloc.go
- mpagealloc_64bit.go
- mpagecache.go
- mpallocbits.go
- mprof.go
- mranges.go
- msan0.go
- msize.go
- mspanset.go
- mstats.go
- mwbbuf.go
- nbpipe_pipe2.go
- netpoll.go
- netpoll_epoll.go
- nonwindows_stub.go
- os_linux.go
- os_linux_generic.go
- os_linux_noauxv.go
- os_linux_x86.go
- os_nonopenbsd.go
- os_unix.go
- panic.go
- pinner.go
- plugin.go
- preempt.go
- preempt_nonwindows.go
- print.go
- proc.go
- profbuf.go
- proflabel.go
- race0.go
- rand.go
- rdebug.go
- retry.go
- runtime.go
- runtime1.go
- runtime2.go
- runtime_boring.go
- rwmutex.go
- security_linux.go
- security_unix.go
- select.go
- sema.go
- set_vma_name_linux.go
- signal_amd64.go
- signal_linux_amd64.go
- signal_unix.go
- sigqueue.go
- sigqueue_note.go
- sigtab_linux_generic.go
- slice.go
- softfloat64.go
- stack.go
- stkframe.go
- string.go
- stubs.go
- stubs2.go
- stubs3.go
- stubs_amd64.go
- stubs_linux.go
- symtab.go
- symtabinl.go
- synctest.go
- sys_nonppc64x.go
- sys_x86.go
- tagptr.go
- tagptr_64bit.go
- test_amd64.go
- time.go
- time_nofake.go
- timeasm.go
- tls_stub.go
- trace.go
- traceallocfree.go
- traceback.go
- tracebuf.go
- tracecpu.go
- traceevent.go
- tracemap.go
- traceregion.go
- traceruntime.go
- tracestack.go
- tracestatus.go
- tracestring.go
- tracetime.go
- tracetype.go
- type.go
- typekind.go
- unsafe.go
- utf8.go
- valgrind0.go
- vdso_elf64.go
- vdso_linux.go
- vdso_linux_amd64.go
- vgetrandom_linux.go
- write_err.go
Directories
¶
| Path | Synopsis |
|---|---|
|
cgoパッケージは、cgoツールによって生成されたコードの実行時サポートを含んでいます。
|
cgoパッケージは、cgoツールによって生成されたコードの実行時サポートを含んでいます。 |
|
Package coverage contains APIs for writing coverage profile data at runtime from long-running and/or server programs that do not terminate via os.Exit.
|
Package coverage contains APIs for writing coverage profile data at runtime from long-running and/or server programs that do not terminate via os.Exit. |
|
debug パッケージには、プログラムが実行中に自己デバッグするための機能が含まれています。
|
debug パッケージには、プログラムが実行中に自己デバッグするための機能が含まれています。 |
|
internal
|
|
|
sys
package sys contains system- and configuration- and architecture-specific constants used by the runtime.
|
package sys contains system- and configuration- and architecture-specific constants used by the runtime. |
|
Package metrics provides a stable interface to access implementation-defined metrics exported by the Go runtime.
|
Package metrics provides a stable interface to access implementation-defined metrics exported by the Go runtime. |
|
pprofパッケージは、pprof視覚化ツールで期待される形式でランタイムプロファイリングデータを書き込みます。
|
pprofパッケージは、pprof視覚化ツールで期待される形式でランタイムプロファイリングデータを書き込みます。 |
|
raceパッケージはデータ競合検出ロジックを実装しています。
|
raceパッケージはデータ競合検出ロジックを実装しています。 |
|
traceパッケージには、Go実行トレーサーのためのトレースを生成するプログラムの機能が含まれています。
|
traceパッケージには、Go実行トレーサーのためのトレースを生成するプログラムの機能が含まれています。 |