github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/runtime/mstats.go (about) 1 // Copyright 2009 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 // メモリの統計情報 6 7 package runtime 8 9 // MemStatsはメモリアロケータに関する統計情報を記録します。 10 type MemStats struct { 11 12 // Allocは割り当てられたヒープオブジェクトのバイト数です。 13 // 14 // これはHeapAllocと同じです(以下を参照)。 15 Alloc uint64 16 17 // TotalAllocはヒープオブジェクトのために割り当てられた累積バイト数です。 18 // 19 // TotalAllocはヒープオブジェクトが割り当てられると増加しますが、 20 // AllocとHeapAllocとは異なり、オブジェクトが解放されると減少しません。 21 TotalAlloc uint64 22 23 // SysはOSから取得したメモリの合計バイト数です。 24 // 25 // Sysは以下のXSysフィールドの合計です。SysはGoランタイムがヒープ、スタック、および他の内部データ構造に予約した仮想アドレススペースを計測します。ある時点では、仮想アドレススペースのすべてが物理メモリでバックアップされているわけではありませんが、一般的にはすべてバックアップされています。 26 Sys uint64 27 28 // Lookupsはランタイムによって実行されるポインターの参照の数です。 29 // 30 // これは主にランタイム内部のデバッグに役立ちます。 31 Lookups uint64 32 33 // Mallocsはヒープオブジェクトの割り当て数の累積数です。 34 // 生存しているオブジェクトの数はMallocs - Freesです。 35 Mallocs uint64 36 37 // Frees はヒープオブジェクトが解放された累積数です。 38 Frees uint64 39 40 // HeapAllocは割り当てられたヒープオブジェクトのバイト数です。 41 // 42 // "割り当てられた"ヒープオブジェクトには、到達可能なオブジェクト全体と、 43 // ガベージコレクタがまだ解放していない到達不能なオブジェクトが含まれます。 44 // 具体的には、ヒープオブジェクトが割り当てられるとHeapAllocは増加し、 45 // ヒープがスイープされて到達不能なオブジェクトが解放されるとHeapAllocは減少します。 46 // スイープはGCサイクル間に段階的に行われるため、 47 // これらの2つのプロセスは同時に発生し、その結果HeapAllocは滑らかに変化します 48 //(ストップ・ザ・ワールドのガベージコレクタの典型的なギザギザとは対照的です)。 49 HeapAlloc uint64 50 51 // HeapSysはOSから取得されたヒープメモリのバイト数です。 52 // 53 // HeapSysは、ヒープのために予約された仮想アドレス空間の量を測定します。 54 // これには、まだ使用されていないが予約されている仮想アドレス空間が含まれます。 55 // これは物理メモリを消費しませんが、通常は小さくなります。 56 // また、使用されなくなった後に物理メモリがOSに返された仮想アドレス空間も含まれます(後者の測定にはHeapReleasedを参照してください)。 57 // 58 // HeapSysは、ヒープが持っていた最大のサイズを推測します。 59 HeapSys uint64 60 61 // HeapIdleはアイドル状態(未使用)のスパンのバイト数です。 62 // 63 // アイドルスパンにはオブジェクトが含まれていません。これらのスパンは 64 // OSに返却されることができます(または既に返却されているかもしれません)し、ヒープの割り当てに再利用されることもあります。 65 // また、スタックメモリとして再利用されることもあります。 66 // 67 // HeapIdleからHeapReleasedを引いた値は、OSに返還できるメモリ量を見積もるものですが、 68 // ランタイムによって保持されているため、ヒープの拡張時にOSからの追加メモリ要求なしでヒープを成長させるために利用されています。 69 // もし、この差がヒープサイズよりもはるかに大きい場合、最近の一時的なライブヒープサイズの急増を示しています。 70 HeapIdle uint64 71 72 // HeapInuseは使用中スパンのバイト数です。 73 // 74 // 使用中スパンには少なくとも1つのオブジェクトが含まれています。 75 // これらのスパンはおおよそ同じサイズの他のオブジェクトにのみ使用できます。 76 // 77 // HeapInuseからHeapAllocを引いた値は、特定のサイズクラスに割り当てられたメモリの量を推定しますが、現在は使用されていません。 78 // これは断片化の上限であり、一般的にこのメモリは効率的に再利用できます。 79 HeapInuse uint64 80 81 // HeapReleasedはOSに返される物理メモリのバイト数です。 82 // 83 // これは、ヒープに再取得される前に、アイドルスパンから返された 84 // ヒープメモリをカウントしています。 85 HeapReleased uint64 86 87 // HeapObjectsは割り当てられたヒープオブジェクトの数です。 88 // 89 // HeapAllocと同様に、オブジェクトが割り当てられると増加し、 90 // ヒープが掃引され、到達不能なオブジェクトが解放されると減少します。 91 HeapObjects uint64 92 93 // StackInuse はスタックスパンのバイト数です。 94 // 95 // 使用中のスタックスパンには少なくとも1つのスタックがあります。これらのスパンは同じサイズの他のスタックにしか使用できません。 96 // 97 // StackIdle は存在しません。未使用のスタックスパンはヒープに戻されるため(そのため HeapIdle にカウントされます)。 98 StackInuse uint64 99 100 // StackSysはOSから取得したスタックメモリのバイト数です。 101 // 102 // StackSysはStackInuseに加えて、OSスレッドスタック用に直接 103 // OSから取得したメモリです。 104 // 105 // cgoを使用しないプログラムでは、このメトリックは現在StackInuseと同じです 106 // (しかし、これに依存するべきではなく、値は将来変わる可能性があります)。 107 // 108 // cgoを使用するプログラムでは、OSスレッドスタックも含まれます。 109 // 現在、c-sharedおよびc-archiveビルドモードでは1つのスタックのみを考慮し、 110 // 他のOSからのスタック(特にCコードによって割り当てられたスタック)は現在計測されていません。 111 // これも将来変更される可能性があります。 112 StackSys uint64 113 114 // MSpanInuseは割り当てられたmspan構造体のバイト数です。 115 MSpanInuse uint64 116 117 // MSpanSysは、mspan構造体のためにOSから取得したメモリのバイトです。 118 MSpanSys uint64 119 120 // MCacheInuseは割り当てられたmcache構造体のバイト数です。 121 MCacheInuse uint64 122 123 // MCacheSysは、mcache構造体のためにオペレーティングシステムから取得されたバイト数です。 124 MCacheSys uint64 125 126 BuckHashSys uint64 127 128 // GCSysはゴミ回収メタデータのメモリのバイト数です。 129 GCSys uint64 130 131 // OtherSys は、さまざまなオフヒープランタイム割り当てのメモリのバイト数です。 132 OtherSys uint64 133 134 // NextGCは次のGCサイクルのターゲットヒープサイズです。 135 // 136 // ガベージコレクタの目標は、HeapAlloc ≤ NextGCを維持することです。 137 // 各GCサイクルの終了時に、次のサイクルのターゲットは 138 // アクセス可能なデータの量とGOGCの値に基づいて計算されます。 139 NextGC uint64 140 141 // LastGCは、最後のガベージコレクションが終了した時刻で、 142 // 1970年以降のUNIXエポックからの経過時間(ナノ秒単位)です。 143 LastGC uint64 144 145 // PauseTotalNsは、プログラムが開始されてからのGCによる累積ナノ秒数です。 146 // 147 // ストップ・ザ・ワールド・ポーズ中には、すべてのゴルーチンが一時停止され、 148 // ガベージコレクタのみが実行されます。 149 PauseTotalNs uint64 150 151 // PauseNsは直近のGCのストップ・ザ・ワールドの一時停止時間(ナノ秒)の循環バッファです。 152 // 153 // 最も直近の一時停止はPauseNs[(NumGC+255)%256]にあります。一般的に、PauseNs[N%256]は直近のN%256番目のGCサイクルでの一時停止時間を記録しています。1つのGCサイクルに複数の一時停止が存在する可能性があります。これはサイクル中のすべての一時停止の合計です。 154 PauseNs [256]uint64 155 156 // PauseEndは最近のGCの一時停止終了時間の循環バッファで、1970年以降のナノ秒(UNIXエポック)で表されます。 157 // 158 // このバッファはPauseNsと同じ方法で埋められます。1つのGCサイクルに複数の一時停止がある場合があります。このバッファはサイクル内の最後の一時停止の終了を記録します。 159 PauseEnd [256]uint64 160 161 // NumGCは完了したGCサイクルの数です。 162 NumGC uint32 163 164 // NumForcedGC は、アプリケーションがGC関数を呼び出し、強制的に実行されたGCサイクルの回数です。 165 NumForcedGC uint32 166 167 // GCCPUFractionは、プログラム開始以来のGCによって使用された利用可能なCPU時間の割合です。 168 // 169 // GCCPUFractionは0から1の数値で表され、0はこのプログラムのCPUの使用が全くないことを意味します。 170 // プログラムの利用可能なCPU時間は、プログラム開始時からのGOMAXPROCSの積分と定義されます。 171 // つまり、GOMAXPROCSが2で、プログラムが10秒間実行されている場合、その「利用可能なCPU時間」は20秒です。 172 // GCCPUFractionには、書き込みバリアのアクティビティに使用されたCPU時間は含まれません。 173 // 174 // これは、GODEBUG=gctrace=1によって報告されるCPUの割合と同じです。 175 GCCPUFraction float64 176 177 // EnableGCはGCが有効であることを示します。常にtrueですが、 178 // GOGC=offの場合でも有効です。 179 EnableGC bool 180 181 // DebugGC は現在使用されていません。 182 DebugGC bool 183 184 // BySizeは、サイズごとの割り当て統計を報告します。 185 // 186 // BySize[N]は、サイズSの割り当てに関する統計を提供します。ここで、BySize[N-1].Size < S ≤ BySize[N].Sizeです。 187 // 188 // これは、BySize[60].Sizeより大きい割り当てを報告しません。 189 BySize [61]struct { 190 Size uint32 191 192 Mallocs uint64 193 194 Frees uint64 195 } 196 } 197 198 // ReadMemStatsはメモリアロケータ統計情報をmに書き込みます。 199 // 200 // 返されるメモリアロケータ統計情報はReadMemStatsの呼び出し時点で最新のものです。 201 // これは、ヒーププロファイルとは異なり、最新のガベージコレクションサイクルのスナップショットです。 202 func ReadMemStats(m *MemStats)