GC.GetGCMemoryInfo を触ってみる
Sansan Advent Calendar 2020 の 19日目の記事です。
GC.GetGCMemoryInfo の存在は以前から知っていたのですがなかなか触る機会がありませんでした。
.NET5 がリリースされ、GC.GetGCMemoryInfo にも新機能が追加されたということでこの機会に触ってみようと思います。
GC.GetGCMemoryInfo
.NET Core 3.x で導入された GC のメモリ情報を取得するためのメソッドです。
.NET Core 3.x では以下の項目が取得できました。
- FragmentedBytes
- HeapSizeBytes
- HighMemoryLoadThresholdBytes
- MemoryLoadBytes
- TotalAvailableMemoryBytes
.NET5 ではさらに多くの項目が取得できるようになっていますが、その中でも気になるのが以下の項目です。
- Index
- PauseDurations
GC.GetGCMemoryInfo では最後に発生した GC の情報が取得できるのですが、Index にはその GC が何回目だったのかを表す数値が格納されています。
Index は 1 始まりなので 0 が取得された場合は GC はまだ発生していません。
PauseDurations には GC によって引き起こされたアプリケーションの一時停止期間が格納されています。
これは要素が 2 のコレクションになっており、通常の GC の場合は要素 1 だけに、 BGC の場合は要素 1 と 2 ともに値が格納されています。
この 2つの値をモニタリングすることで何回 GC が発生したか、停止期間がどれだけあったのかを測定することができそうです。
終わりに
GC.GetGCMemoryInfo で GC が発生したときの情報を取得できました。
最近は構造体を使ったゼロアロケーションなコードを書くことも多くなってきたので GC の詳細な情報が取得できるようになったことはとてもいいことだと思います。
パフォーマンスチューニングはまず計測からなのでうまく活用していいパフォーマンスのアプリケーションを目指して行きたいものです。