web-dev-qa-db-ja.com

golang gcを停止して手動でトリガーする方法は?

現在、私はgolangで書かれたデータベースで大きなテーブル結合をサポートしています。しかし、GCには時間がかかりすぎます。 go gcを閉じて手動でトリガーしたい。 goビルド引数を構成するにはどうすればよいですか?

12
Han Fei

runtime のパッケージドキュメントには、必要なすべての詳細が含まれています。

GOGC変数は、初期のガベージコレクションのターゲットパーセンテージを設定します。前回の収集後に残っているライブデータに対する新しく割り当てられたデータの比率がこのパーセンテージに達すると、収集がトリガーされます。デフォルトはGOGC = 100です。 GOGC = offを設定すると、ガベージコレクターが完全に無効になります。ランタイム/デバッグパッケージのSetGCPercent関数を使用すると、実行時にこのパーセンテージを変更できます。 https://golang.org/pkg/runtime/debug/#SetGCPercent を参照してください。

したがって、環境変数GOGCを、前回の収集後に残っているライブデータに対する新しく割り当てられたデータの比率であるパー​​セントに設定できます。

上記のデータ比率がGOGCの値に達すると、(ガベージ)コレクションが開始されます。初期設定はGOGC env変数から取得されます。変数が設定されていない場合は_100_から取得されます。値offは、ガベージコレクションを無効にします。

実行時に debug.SetGCPercent() を呼び出してGOGC比率を変更し、負の値を渡して無効にすることができます。

_debug.SetGCPercent(-1)
_

runtime.GC() を使用して、ガベージコレクションを「手動で」トリガーできます。

ただし、GCを完全に無効にすることは、あなたが望むものではないかもしれません。 runtimeの完全なパッケージドキュメントを読み、GCを微調整する方法とGC実行をトレースする方法の詳細を確認してください。それらを分析し、それに応じて行動します。

Go 1.7 はガベージコレクターが改善され、本日リリースされたことにも注意してください。

ガベージコレクタの高速化と標準ライブラリの最適化により、プログラムの実行速度が少し速くなるはずです。多くのアイドル状態のgoroutineがあるプログラムでは、Go 1.6よりもはるかに短いガベージコレクションの一時停止が発生します。

まだの場合は、Go 1.7でコンパイルしたアプリケーションをテストしてから、さらにアクションを実行してください。

22
icza