6

実行時に6〜7Gのメモリを使用するgoで書かれたサービスがあります(上部のRES)。そこで、問題がどこにあるかを把握するために pprof ツールを使用しました。

go tool pprof --pdf http://<service>/debug/pprof/heap > heap_prof.pdf

しかし、結果には約1〜2Gのメモリしかありません(pdfの「合計MB」)。残りはどこ?

そして、GOGC=off でサービスのプロファイリングを試みた結果、「Total MB」は上部の「RES」とまったく同じになりました。メモリはGCされているようですが、カーネルに戻されていないため、プロファイルされません。

何か案が?

PS、1.0.3 と 1.1rc3 の両方でテストしました。

4

1 に答える 1

10

これは、Go が現在、GC されたオブジェクトのメモリをオペレーティング システムに返さないためです。正確には、定義済みの制限 (32KB) よりも小さいオブジェクトに対してのみです。代わりに、将来の割り当てGo:mallocを高速化するためにメモリがキャッシュされます。また、これは将来のTODOで修正されるようです。

編集: 新しい GC 動作: メモリがしばらく (約 5 分) 使用されない場合、ランタイムは未使用の仮想範囲から物理マッピングを削除するようにカーネルに通知します。このプロセスは、次の呼び出しによって強制できます。runtime.FreeOSMemory()

于 2013-05-13T13:27:38.143 に答える