golangでマップメモリ​​を解放するにはどうすればよいですか?

coldplay.xixi
リリース: 2020-07-18 15:03:06
オリジナル
12092 人が閲覧しました

Golang のマップ メモリを解放する方法: まずマップ内のすべてのキーを削除しますが、マップが占有しているメモリはまだ [使用状態] のままです。その後、マップは nil に設定され、マップが占有しているメモリはin [アイドル状態]; 最終的にアイドル状態になります メモリは、オペレーティング システムに再度適用することなく、一定期間内であれば次のアプリケーションで再利用できます。

golangでマップメモリ​​を解放するにはどうすればよいですか?

Golang のマップ メモリを解放する方法:

サンプル コード:
go バージョン: 1.12.9

package main
import (
    "log"
    "runtime"
)
var intMap map[int]int
var cnt = 8192
func main() {
    printMemStats()
    initMap()
    runtime.GC()
    printMemStats()
    log.Println(len(intMap))
    for i := 0; i < cnt; i++ {
        delete(intMap, i)
    }
    log.Println(len(intMap))
    runtime.GC()
    printMemStats()
    intMap = nil
    runtime.GC()
    printMemStats()
}
func initMap() {
    intMap = make(map[int]int, cnt)
    for i := 0; i < cnt; i++ {
        intMap[i] = i
    }
}
func printMemStats() {
    var m runtime.MemStats
    runtime.ReadMemStats(&m)
    log.Printf("Alloc = %v TotalAlloc = %v Sys = %v NumGC = %v\n", m.Alloc/1024, m.TotalAlloc/1024, m.Sys/1024, m.NumGC)
}
ログイン後にコピー

出力結果:

2019/11/22 15:42:33 Alloc = 138 TotalAlloc = 138 Sys = 68290 NumGC = 0
2019/11/22 15:42:33 Alloc = 456 TotalAlloc = 460 Sys = 68610 NumGC = 1
2019/11/22 15:42:33 8192
2019/11/22 15:42:33 0
2019/11/22 15:42:33 Alloc = 458 TotalAlloc = 464 Sys = 68674 NumGC = 2
2019/11/22 15:42:33 Alloc = 146 TotalAlloc = 466 Sys = 68674 NumGC = 3
ログイン後にコピー

フィールドの説明:

  • Alloc: 現在のヒープ上でオブジェクトが占有しているメモリ サイズ;

  • TotalAlloc: ヒープに割り当てられた合計メモリ サイズ;

  • #Sys : プログラムは、システムによって要求された合計メモリ サイズに基づいて動作します;

  • NumGC: ガベージ コレクションの実行数。

#実行結果から、マップ内のキーが削除された後に占有されていたメモリが解放されていないことがわかります。

結論:
Golang のマップはキーが削除された直後にメモリを解放しないため、プログラムが実行されるにつれて、マップによって占有されるメモリは実際には増加するだけです。 。さらに、GC はマーキング フェーズ中にマップ内のすべての要素にアクセスするため、マップが非常に大きい場合、プログラムのパフォーマンスに非常に大きなオーバーヘッドが生じます。ただし、go バージョン 1.5 以降では、マップのキーと値にポインターが含まれていない場合、GC はマップを無視します。

関連する学習に関する推奨事項: Go 言語チュートリアル

以上がgolangでマップメモリ​​を解放するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート