github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/runtime/debug/garbage.go (about) 1 // Copyright 2013 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package debug 6 7 import ( 8 "github.com/shogo82148/std/time" 9 ) 10 11 // GCStatsは最近のガベージコレクションに関する情報を収集します。 12 type GCStats struct { 13 LastGC time.Time 14 NumGC int64 15 PauseTotal time.Duration 16 Pause []time.Duration 17 PauseEnd []time.Time 18 PauseQuantiles []time.Duration 19 } 20 21 // ReadGCStatsはゴミ収集に関する統計情報をstatsに読み込みます。 22 // 一時停止履歴のエントリ数はシステムに依存します。 23 // stats.Pauseスライスは十分に大きければ再利用され、そうでなければ再割り当てされます。 24 // ReadGCStatsはstats.Pauseスライスの容量をフルに使用する可能性があります。 25 // もしstats.PauseQuantilesが空でない場合、ReadGCStatsは一時停止時間の分布を要約した 26 // 分位数をstats.PauseQuantilesに埋め込みます。 27 // 例えば、len(stats.PauseQuantiles)が5の場合、最小値、25%、50%、75%、最大値の一時停止時間が埋め込まれます。 28 func ReadGCStats(stats *GCStats) 29 30 // SetGCPercentはガベージコレクションの目標パーセンテージを設定します: 31 // 前回のコレクション後に残ったデータの生存データに対する最新割り当てデータの比率が 32 // このパーセンテージに達した時にコレクションがトリガーされます。 33 // SetGCPercentは以前の設定を返します。 34 // 初期設定は起動時のGOGC環境変数の値、または変数が設定されていない場合は100です。 35 // この設定はメモリ制限を維持するために効果的に減少させることができます。 36 // マイナスのパーセンテージは、メモリ制限が達成されない限り、ガベージコレクションを 37 // 実質的に無効にします。 38 // 詳細については、SetMemoryLimitを参照してください。 39 func SetGCPercent(percent int) int 40 41 // FreeOSMemoryはガベージコレクションを強制的に行い、可能なだけ多くのメモリをオペレーティングシステムに返す試みをします。 42 // (これが呼ばれなくても、ランタイムはバックグラウンドで徐々にメモリをオペレーティングシステムに返します。) 43 func FreeOSMemory() 44 45 // SetMaxStackは、個々のゴルーチンスタックが使用可能なメモリの最大量を設定します。 46 // スタックを成長させながらこの制限を超える場合、プログラムはクラッシュします。 47 // SetMaxStackは、前の設定を返します。 48 // 初期設定は、64ビットシステムでは1GB、32ビットシステムでは250MBです。 49 // SetMaxStackに提供される値に関係なく、システムによって設定された最大スタック制限がある場合があります。 50 // 51 // SetMaxStackは、無限再帰に入るゴルーチンによって引き起こされるダメージを制限するために主に役立ちます。 52 // これは将来のスタックの成長のみを制限します。 53 func SetMaxStack(bytes int) int 54 55 // SetMaxThreadsはGoプログラムが使用できるオペレーティングシステムの最大スレッド数を設定します。これ以上のスレッドを使用しようとすると、プログラムはクラッシュします。 56 // SetMaxThreadsは前の設定を返します。 57 // 初期設定は10,000スレッドです。 58 // 59 // 制限はオペレーティングシステムのスレッド数を制御しますが、ゴルーチンの数を制御しません。Goプログラムは、既存のすべてのスレッドがシステムコール、CGOコールにブロックされているか、runtime.LockOSThreadの使用により他のゴルーチンにロックされている場合にのみ新しいスレッドを作成します。 60 // 61 // SetMaxThreadsは、無制限の数のスレッドを作成するプログラムによる被害を制限するために主に役立ちます。アイデアは、プログラムがオペレーティングシステムをダウンさせる前にプログラム自体をダウンさせることです。 62 func SetMaxThreads(threads int) int 63 64 // SetPanicOnFaultは、プログラムが予期しない(非nil)アドレスでの障害が発生した場合、ランタイムの動作を制御します。 65 // このような障害は通常、ランタイムのメモリ破損などのバグによって引き起こされるため、デフォルトの応答はプログラムをクラッシュさせることです。 66 // メモリマップドファイルやメモリの安全でない操作を行うプログラムは、非nilアドレスでの障害を劇的な状況で引き起こすかもしれません。 67 // SetPanicOnFaultは、そのようなプログラムがクラッシュではなくパニックのみを要求できるようにします。 68 // ランタイムがパニックするときにランタイムがパニックするruntime.Errorには、追加のメソッドが存在する場合があります: 69 // Addr() uintptr 70 // もしAddrメソッドが存在する場合、それは障害を引き起こしたメモリアドレスを返します。 71 // Addrの結果はベストエフォートであり、結果の信頼性はプラットフォームに依存する可能性があります。 72 // SetPanicOnFaultは現在のゴルーチンにのみ適用されます。 73 // それは前の設定を返します。 74 func SetPanicOnFault(enabled bool) bool 75 76 // WriteHeapDumpはヒープとその中のオブジェクトの説明を指定されたファイルディスクリプタに書き込みます。 77 // 78 // WriteHeapDumpはヒープダンプが完全に書き込まれるまですべてのゴルーチンの実行を一時停止します。したがって、ファイルディスクリプタは、同じGoプロセスのもう一方のエンドがあるパイプやソケットに接続してはいけません。代わりに、一時ファイルまたはネットワークソケットを使用してください。 79 // 80 // ヒープダンプの形式はhttps://golang.org/s/go15heapdumpで定義されています。 81 func WriteHeapDump(fd uintptr) 82 83 // SetTracebackは、ランタイムがパニックや内部ランタイムエラーによる終了前に出力するトレースバックの詳細度を設定します。 84 // level引数は、GOTRACEBACK環境変数と同じ値を受け取ります。例えば、SetTraceback("all")は、プログラムがクラッシュしたときにすべてのゴルーチンを出力することを保証します。 85 // 詳細については、パッケージランタイムのドキュメントを参照してください。 86 // SetTracebackが環境変数よりも低いレベルで呼び出された場合、呼び出しは無視されます。 87 func SetTraceback(level string) 88 89 // SetMemoryLimitはランタイムにソフトメモリ制限を提供します。 90 // 91 // ランタイムは、ガベージコレクションの頻度の調整やメモリをより積極的に 92 // 下位システムに返却するなど、このメモリ制限を尊重するためにいくつかの 93 // プロセスを実行します。この制限は、GOGC=off (または、SetGCPercent(-1)が実行された場合も)であっても尊重されます。 94 // 95 // 入力制限はバイト単位で提供され、Goランタイムによってマップされた、管理された、リリースされていないすべてのメモリを含みます。特に、 96 // Goバイナリによって使用されるスペースや、Go以外のメモリ(プロセスの 97 // 代わりに下位システムによって管理されるメモリや、同じプロセス内の 98 // 非Goコードによって管理されるメモリなど)は考慮されません。除外される 99 // メモリソースの例には、プロセスのために保持されたOSカーネルメモリ、 100 // Cコードによって割り当てられたメモリ、syscall.Mmapによってマップされた 101 // メモリ(それはGoランタイムによって管理されていないため)が含まれます。 102 // 103 // より具体的には、次の式が制限としてランタイムが維持しようとする値を 104 // 正確に反映しています: 105 // 106 // runtime.MemStats.Sys - runtime.MemStats.HeapReleased 107 // 108 // またはruntime/metricsパッケージを使用して: 109 // 110 // /memory/classes/total:bytes - /memory/classes/heap/released:bytes 111 // 112 // ゼロの制限やGoランタイムによって使用されるメモリ量よりも低い制限は、 113 // ガベージコレクタがほぼ連続的に実行される原因となるかもしれません。 114 // ただし、アプリケーションは引き続き進行する可能性があります。 115 // 116 // メモリ制限は常にGoランタイムによって尊重されますので、 117 // この挙動を効果的に無効にするには、制限を非常に高く設定します。 118 // [math.MaxInt64] は制限を無効にするための標準的な値ですが、 119 // 制限値が基礎となるシステムの利用可能なメモリよりもはるかに大きい場合でも、 120 // 同様に機能します。 121 // 122 // 詳細なガイドと共に、ソフトメモリ制限について詳しく説明したガイドおよび 123 // さまざまな一般的な使用例とシナリオについては、 124 // https://go.dev/doc/gc-guideを参照してください。 125 // 126 // 初期設定はmath.MaxInt64ですが、GOMEMLIMIT環境変数が設定されている場合は、初期設定を提供します。GOMEMLIMITは、バイト単位の数値で、 127 // オプションの単位接尾辞を持ちます。サポートされる接尾辞には、B、KiB、 128 // MiB、GiB、TiBがあります。これらの接尾辞は、IEC 80000-13規格で定義されるバイトの数量を表します。つまり、KiBは2^10バイトを、 129 // MiBは2^20バイトを意味し、それ以降も同様です。 130 // 131 // SetMemoryLimitは以前に設定されたメモリ制限を返します。 132 // 負の入力は制限を調整せず、現在設定されたメモリ制限を取得することができます。 133 func SetMemoryLimit(limit int64) int64