システム圧力を打つための1は、メモリフットプリントを増加したが、圧力の停止後、メモリを削減することができない、それはメモリリークを有していてもよいです。
2は、トップがシステムメモリに移動アプリケーションが使用されていないため、システムはすぐに返されません、プログラムがメモリを取るリアルタイムに反映していません。
3、プログラムはヒープメモリを移動し、システムメモリを使用して、メモリの実際の使用:システム・メモリ・プールからアプリケーションメモリが行くに管理され、全体のメモリページは、長い時間のためにアクセスし、一定の条件を満たし、唯一の操作に戻すことがされていませんシステム。GCがあるためと、ヒープメモリは、メモリフットプリントを表すことができない、そして残りは後でクリアし、それはメモリの実際の使用です。
4. [コールruntime.ReadMemStatsは、メモリの使用状況に関する情報を参照することができ
、実際のHeapInuseでGOツールpprof -inuse_space http://127.0.0.1:6060/debug/pprof/heap?debug=2得るより多くの詳細な情報を、使用して、5メモリ使用量
図6は、第一の原則は、データが閉じられたチャネルをパニックに書かれているので、絶対に、消費者のチャンネルによって閉じることができないということです。正しい姿勢は、すべてのデータのプロデューサー、閉じられたチャンネルの後に終了すると、消費者は、データチャネルの内側に仕上がっすべての消費のために責任があります
生成FUNC(CHチャン< - T){ 延期閉じる(CH)// メーカーデータ書き込ま閉じるチャネル CH < - Tは、{} } FUNC消費(CH < - チャンT){ ため _範囲CH = { // 消費以下のためのレンジを読み取るされているすべてのデータ } } CH: = メイク(チャンT) 移動プロデュース(CH)が (CH)を消費
図7は、第2の原理は、クラスWaitGroupと共に使用することができる放送チャンネルオフキャンセル処理を使用することです
FUNCプロデュース(CHちゃん< - Tは、チャンキャンセル構造体{}){ 選択{ 場合 - CH < T {}: ケース < -キャンセル://は用同时监听动作キャンセル選択 } }を FUNC(CH消費 <ちゃんTをチャンキャンセル構造体{}){ :V - = < CH :ERR = doSomethingの(v)の 場合!誤る= {ゼロ )(キャンセル閉じる// 能够通知所有退出生成 リターン } } ため I:= 0 ; I < 10 ; I ++ { (生産行きます) } )(消費
8、channによってシグナリングコルーチンを閉じます
FUNC(メートルの*のTtlMap)クリア(){ のために{ SELECT { // 閉じる ケース < - m.stop: リターン // 定期的な清掃... } } }
MapWarpperは、その機能の終了を定義ローカル変数として、MapWarpperライフサイクルが終了したときに図9に示すように、Gcが回収されます。Gcは回復MapWarpper onGarbageCollect()関数を実行し、明確なTtlmapはTtlmapが回復オン、オフコルーチン。
{TtlMap strcut ... STOPチャンBOOL } // パッケージ定義され たstruct MapWarpper { * TtlMap } FUNC新() * MapWarpper { 地図: =&TtlMap { ... } 行くmap.clear() // 層でコーティングされた MW: &= MapWarpper地図{} // ここで重要:設定操作が回復したとき runtime.SetFinalizer(onGarbageCollect、のMw)は 返すのMwを }
10、メモリリークを回避するためにパケットコンテキスト
(){FUNCメイン :CTX、キャンセル = context.WithCancel(context.Background()) CH: = funcを(CTX context.Context)<ちゃんINT { :CH =(ちゃん作るintは) (FUNCを行く){ のために I := 0 ; ; 私は++ { 選択{ 場合 < - ctx.Done(): 戻り ケース CH < - I: } } }() 戻りCHを }(CTX) のために、V:= レンジCH { fmt.Println(v)の 場合のV == 5は、{ (キャンセル) ブレーク } } }