Go 1.3 ガベージ コレクターがサーバー上のメモリをリークする
質問:
なぜ Go なのか1.3 ガベージ コレクターがサーバー メモリを解放して動作状態に戻せないsystem?
答え:
Go ランタイムは、使用されなくなったメモリの割り当てを解除するガベージ コレクション プロセスを定期的に実行します。ただし、ガベージ コレクターが OS に要求されたすべてのメモリを解放しない場合がある理由はいくつかあります。
-
ヒープは解放されているが、仮想アドレス空間は解放されていない: Unix ベースのプラットフォームでは、Go はシステム コールを使用して、ヒープの未使用部分を再利用できることをオペレーティング システムに伝えます。この機能は Windows プラットフォームでは使用できません。
-
メモリが空きとしてマークされていません: スライスおよびその他のデータ構造は、空きとしてマークされず、使用中である可能性があります。これにより、それらが OS に返されるのを防ぎます。
-
割り当てられたすべてのシステム メモリが「実際の」メモリであるわけではありません: ランタイムによって割り当てられているが、実際にはプログラムによって使用されていないメモリは、依然として存在する可能性があります。 Go の runtime.Stats コマンドによって割り当てられたメモリとして報告されます。 OS はまだ内部でこのメモリを使用している可能性があります。
Go が常にメモリ領域を縮小するわけではありませんが、問題を軽減する解決策がいくつかあります。
-
強制ガベージ コレクション: runtime.GC() 関数を呼び出して手動でガベージをトリガーしますcollection.
-
OS メモリの強制返却: runtime.FreeOSMemory 関数を呼び出して、明示的にメモリを OS に返します。これは、GC が実行された後にのみ機能します。
ゴルーチンによって占有されているすべてのメモリが GC によって解放されるわけではないことに注意することが重要です。
以上がGo 1.3 のガベージ コレクターが常にメモリをオペレーティング システムに返さないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。