runtime

package
v1.21.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 6, 2023 License: MIT Imports: 3 Imported by: 0

Documentation

Overview

パッケージruntimeには、goroutineを制御するための関数など、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ペアのカンマ区切りリストです。

allocfreetrace: allocfreetrace=1を設定すると、すべての割り当てがプロファイルされ、各オブジェクトの割り当てと解放時にスタックトレースが出力されます。

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 を参照してください。

dontfreezetheworld: デフォルトでは、致命的なパニックまたは例外の開始は「世界を凍結」し、実行中のすべてのスレッドをプリエンプトして、
実行中のすべてのgoroutineを停止します。これにより、すべてのgoroutineをトレースバックし、パニックの発生地点に近い状態を保持することができます。
dontfreezetheworld=1を設定すると、このプリエンプションが無効になり、パニック処理中にgoroutineが引き続き実行されるようになります。
ただし、スケジューラに自然に入るgoroutineは引き続き停止します。これは、スケジューラのランタイムデバッグ時に有用であり、
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の説明を参照してください。

pagetrace: pagetrace=/path/to/fileを設定すると、ページイベントのトレースが書き出され、
x/debug/cmd/pagetraceツールを使用して表示、分析、および可視化できます。この機能を有効にするには、
プログラムをGOEXPERIMENT=pagetraceでビルドしてください。
この機能は、セットUIDバイナリの場合にセキュリティリスクを導入するため、
プログラムがセットUIDバイナリである場合はこの機能を有効にしないでください。
現在、Windows、plan9、js/wasmではサポートされていません。
一部のアプリケーションでこのオプションを設定すると、大きなトレースが生成される場合があるため、注意して使用してください。

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が返す情報も拡張されます。
祖先のゴルーチンIDは、作成時のゴルーチンIDを参照します。このIDは、別のゴルーチンで再利用される可能性があります。Nを0に設定すると、祖先情報は報告されません。

tracefpunwindoff: tracefpunwindoff=1を設定すると、実行トレーサーがフレームポインタアンワインディングの代わりに
ランタイムのデフォルトスタックアンワインダーを使用するようになります。これにより、トレーサーのオーバーヘッドが増加しますが、
フレームポインタアンワインディングによって引き起こされる予期しないリグレッションのワークアラウンドやデバッグに役立つ場合があります。

asyncpreemptoff: asyncpreemptoff=1を設定すると、シグナルベースの非同期ゴルーチンプリエンプションが無効になります。
これにより、一部のループが長時間プリエンプションされなくなり、GCとゴルーチンスケジューリングが遅れる場合があります。
これは、非同期にプリエンプションされたゴルーチンに対して使用される保守的なスタックスキャンも無効にするため、GCの問題をデバッグするために役立ちます。

netおよびnet/httpパッケージも、GODEBUGのデバッグ変数を参照しています。 詳細については、それらのパッケージのドキュメントを参照してください。

GOMAXPROCS変数は、ユーザーレベルのGoコードを同時に実行できるオペレーティングシステムスレッドの数を制限します。 Goコードの代わりにシステムコールでブロックされているスレッドの数に制限はありません。 これらはGOMAXPROCSの制限には含まれません。このパッケージのGOMAXPROCS関数は、制限をクエリおよび変更します。

GORACE変数は、-raceを使用してビルドされたプログラムのレースディテクタを設定します。 詳細については、https://golang.org/doc/articles/race_detector.html を参照してください。

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関数を使用すると、実行時に出力量を増やすことができますが、環境変数で指定された量を下回ることはできません。 https://golang.org/pkg/runtime/debug/#SetTraceback を参照してください。

GOARCH、GOOS、GOPATH、およびGOROOT環境変数は、Goプログラムのビルドに影響を与えます (https://golang.org/cmd/go および https://golang.org/pkg/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

Examples

Constants

View Source
const Compiler = "gc"

Compilerは、実行中のバイナリを構築したコンパイラツールチェーンの名前です。既知のツールチェーンは次のとおりです:

gc cmd/compileとしても知られています。 gccgo GCCコンパイラスイートの一部であるgccgoフロントエンドです。

View Source
const GOARCH string = goarch.GOARCH

GOARCHは、実行中のプログラムのアーキテクチャターゲットです。 386、amd64、arm、s390xなどのいずれかです。

View Source
const GOOS string = goos.GOOS

GOOSは実行中のプログラムのオペレーティングシステムターゲットです。 darwin、freebsd、linuxなどのいずれかです。 GOOSとGOARCHの可能な組み合わせを表示するには、「go tool dist list」と入力してください。

Variables

View Source
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 Breakpoint

func Breakpoint()

ブレークポイントはブレークポイントトラップを実行します。

func CPUProfile

func CPUProfile() []byte

CPUProfileはパニックします。 以前はランタイムによって生成されたpprof形式のプロファイルの チャンクへの直接的なアクセスを提供していました。 その形式を生成する方法が変更されたため、 この機能は削除されました。

非推奨: runtime/pprofパッケージ、 またはnet/http/pprofパッケージのハンドラ、 またはtestingパッケージの-test.cpuprofileフラグを代わりに使用してください。

func Caller

func Caller(skip int) (pc uintptr, file string, line int, ok bool)

Callerは、呼び出し元のゴルーチンのスタック上での関数呼び出しに関するファイルと行番号情報を報告します。 引数skipは、上昇するスタックフレームの数であり、0はCallerの呼び出し元を識別します。 (歴史的な理由から、skipの意味はCallerとCallersで異なります。) 戻り値は、対応する呼び出しのプログラムカウンタ、ファイル名、およびファイル内の行番号を報告します。 情報を回復できなかった場合、ブール値okはfalseです。

func Callers

func Callers(skip int, pc []uintptr) int

Callersは、呼び出し元のゴルーチンのスタック上での関数呼び出しの戻りプログラムカウンタを、スライスpcで埋めます。 引数skipは、pcに記録する前にスキップするスタックフレームの数であり、0はCallers自体のフレームを識別し、1はCallersの呼び出し元を識別します。 pcに書き込まれたエントリ数を返します。

これらのPCを関数名や行番号などのシンボル情報に変換するには、CallersFramesを使用します。 CallersFramesはインライン関数を考慮し、戻りプログラムカウンタを呼び出しプログラムカウンタに調整します。 直接PCのスライスを反復処理することは推奨されていません。また、返されたPCのいずれかに対してFuncForPCを使用することも推奨されていません。 これらはインライン化や戻りプログラムカウンタの調整を考慮できないためです。

func GC

func GC()

GCはガベージコレクションを実行し、呼び出し元が完了するまで呼び出し元をブロックします。 プログラム全体をブロックする場合もあります。

func GOMAXPROCS

func GOMAXPROCS(n int) int

GOMAXPROCSは同時に実行できる最大CPU数を設定し、前の設定を返します。デフォルトはruntime.NumCPUの値です。nが1未満の場合、現在の設定は変更されません。スケジューラの改善が行われると、この呼び出しはなくなります。

func GOROOT

func GOROOT() string

GOROOTは、Goツリーのルートを返します。プロセス開始時に設定されている場合はGOROOT環境変数を使用し、 それ以外の場合はGoビルド中に使用されたルートを使用します。

func Goexit

func Goexit()

Goexitはそれを呼び出したゴルーチンを終了します。他のゴルーチンには影響を与えません。 Goexitは終了する前にすべての延期呼び出しを実行します。Goexitはパニックではないため、 これらの延期された関数内のrecover呼び出しはnilを返します。

メインゴルーチンからGoexitを呼び出すと、そのゴルーチンはfunc mainが戻らない状態で終了します。 func mainが戻っていないため、プログラムは他のゴルーチンの実行を継続します。 他のすべてのゴルーチンが終了すると、プログラムはクラッシュします。

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 NumCgoCall

func NumCgoCall() int64

NumCgoCall は現在のプロセスによって行われた cgo 呼び出しの数を返します。

func NumGoroutine

func NumGoroutine() int

NumGoroutineは現在存在するゴルーチンの数を返します。

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パッケージまたは テストパッケージの-test.cpuprofileフラグを直接呼び出す代わりに使用するべきです。

func SetCgoTraceback added in v1.7.0

func SetCgoTraceback(version int, traceback, context, symbolizer unsafe.Pointer)

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 SetFinalizer

func SetFinalizer(obj any, finalizer any)

SetFinalizerは、objに関連付けられたファイナライザを提供されたファイナライザ関数に設定します。 ガベージコレクタが関連付けられたファイナライザを持つ到達不能なブロックを見つけると、 関連付けをクリアし、別のゴルーチンでfinalizer(obj)を実行します。 これにより、objは再び到達可能になりますが、関連付けられたファイナライザはなくなります。 SetFinalizerが再度呼び出されない限り、次にガベージコレクタがobjが到達不能であることを検出した場合、objは解放されます。

SetFinalizer(obj, nil)は、objに関連付けられたファイナライザをクリアします。

引数objは、newを呼び出すことによって割り当てられたオブジェクトへのポインタ、 複合リテラルのアドレスを取得することによって、またはローカル変数のアドレスを取得することによって割り当てられたオブジェクトへのポインタである必要があります。 引数finalizerは、objの型に割り当てることができる単一の引数を取る関数であり、任意の無視される戻り値を持つことができます。 これらのいずれかがtrueでない場合、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

func SetMutexProfileFraction(rate int) int

SetMutexProfileFractionは、mutexの衝突イベントのうち、 プロファイルに報告される割合を制御します。平均して1/rateのイベントが報告されます。 以前のrateが返されます。

プロファイリングを完全に無効にするには、rateに0を渡します。 現在のrateだけを読み取るには、rateに0より小さい値を渡します。 (n>1の場合、サンプリングの詳細が変更される場合があります。)

func Stack

func Stack(buf []byte, all bool) int

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スレッドにロックしたままにしておくべきです。

func Version

func Version() string

Versionは、Goツリーのバージョン文字列を返します。 ビルド時のコミットハッシュと日付、または可能な場合は「go1.3」のようなリリースタグです。

Types

type BlockProfileRecord added in v1.1.0

type BlockProfileRecord struct {
	Count  int64
	Cycles int64
	StackRecord
}

BlockProfileRecordは、特定の呼び出しシーケンス(スタックトレース)で発生したブロッキングイベントを記述します。

type Error

type Error interface {
	error

	// RuntimeError is a no-op function but
	// serves to distinguish types that are run time
	// errors from ordinary errors: a type is a
	// run time error if it has a RuntimeError method.
	RuntimeError()
}

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は、このフレームのファイル名と行番号です。
	// 非終端フレームの場合、これは呼び出しの位置になります。
	// もし分かっていない場合は、それぞれ空文字列とゼロになります。
	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()

			// このフレームを処理します。
			//
			// この例の出力を安定させるために
			// テストパッケージに変更があっても
			// runtimeパッケージを抜けるとアンワインドを停止します。
			if !strings.Contains(frame.File, "runtime/") {
				break
			}
			fmt.Printf("- more:%v | %s\n", more, frame.Function)

			// このフレームの処理後にさらにフレームがあるかどうかを確認します。
			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

func CallersFrames(callers []uintptr) *Frames

CallersFramesはCallersによって返されるPC値のスライスを受け取り、 関数/ファイル/行情報を返す準備をします。 Framesで終わるまでスライスを変更しないでください。

func (*Frames) Next added in v1.7.0

func (ci *Frames) Next() (frame Frame, more bool)

Nextは、PC値のスライス内で次の呼び出しフレームを表すFrameを返します。 すべての呼び出しフレームをすでに返した場合、NextはゼロのFrameを返します。

moreの結果は、次のNext呼び出しで有効なFrameが返されるかどうかを示します。 これが呼び出し元に一つ返されたかどうかを必ずしも示しません。

典型的な使用法については、Framesの例を参照してください。

type Func

type Func struct {
	// contains filtered or unexported fields
}

Funcは実行中のバイナリ内のGo関数を表します。

func FuncForPC

func FuncForPC(pc uintptr) *Func

FuncForPCは、指定されたプログラムカウンターアドレスを含む関数を記述した*Funcを返します。もし複数の関数がインライン展開の影響で存在する場合は、最も内側の関数を示す*Funcを返しますが、最も外側の関数のエントリーも持っています。

func (*Func) Entry

func (f *Func) Entry() uintptr

Entryは関数のエントリーアドレスを返します。

func (*Func) FileLine

func (f *Func) FileLine(pc uintptr) (file string, line int)

FileLineは、プログラムカウンターpcに対応するソースコードのファイル名と行番号を返します。 pcがfのプログラムカウンターでない場合、結果は正確ではありません。

func (*Func) Name

func (f *Func) Name() string

Nameは関数の名前を返します。

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オブジェクトのセットです。オブジェクトはPinメソッドで固定でき、Pinnerのすべての固定されたオブジェクトはUnpinメソッドで固定を解除できます。

func (*Pinner) Pin added in v1.21.0

func (p *Pinner) Pin(pointer any)

PinはGoのオブジェクトをピン留めし、ガベージコレクターによる移動や解放を防止します。 Unpinメソッドが呼び出されるまで、ピン留めされたオブジェクトへのポインタは、 Cメモリに直接格納するか、Goメモリに含めてC関数に渡すことができます。 ピン留めされたオブジェクト自体がGoオブジェクトへのポインタを持っている場合、 Cコードからアクセスするためにはそれらのオブジェクトも別途ピン留めする必要があります。

引数は任意の型のポインタまたはunsafe.Pointerである必要があります。 newの呼び出し結果、複合リテラルのアドレス、またはローカル変数のアドレスを取る必要があります。 上記の条件のいずれかが満たされない場合、Pinはパニックを引き起こします。

func (*Pinner) Unpin added in v1.21.0

func (p *Pinner) Unpin()

UnpinはPinnerのすべてのピン留めされたオブジェクトを解除します。

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

Directories

Path Synopsis
Package cgoは、cgoツールによって生成されたコードの実行時サポートを含んでいます。
Package cgoは、cgoツールによって生成されたコードの実行時サポートを含んでいます。
debug パッケージには、プログラムが実行中に自己デバッグするための機能が含まれています。
debug パッケージには、プログラムが実行中に自己デバッグするための機能が含まれています。
internal
atomic
Package atomic provides atomic operations, independent of sync/atomic, to the runtime.
Package atomic provides atomic operations, independent of sync/atomic, to the runtime.
startlinetest
Package startlinetest contains helpers for runtime_test.TestStartLineAsm.
Package startlinetest contains helpers for runtime_test.TestStartLineAsm.
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.
syscall
Package syscall provides the syscall primitives required for the runtime.
Package syscall provides the syscall primitives required for 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.
Package pprofは、pprof視覚化ツールで期待される形式でランタイムプロファイリングデータを書き込みます。
Package pprofは、pprof視覚化ツールで期待される形式でランタイムプロファイリングデータを書き込みます。
Package raceはデータ競合検出ロジックを実装しています。
Package raceはデータ競合検出ロジックを実装しています。
Package trace contains facilities for programs to generate traces for the Go execution tracer.
Package trace contains facilities for programs to generate traces for the Go execution tracer.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL