以前に続いて、下記の記事にインスパイアされての話です。
他の言語でのメモリ割り当てはどうなの?
下記の記事でわかりやすく紹介されています。
Rubyは散らかしっぱなし、Pythonは、綺麗好きな同居人がいるという説明。
memcached
Object Pool Patternの関連記事で Slab allocationというのがありました。
何だろうと思って調べると、下記の記事が。
この考え方も面白いなと。
割り当て次第で、どうしても余ってしまうので、1,2,4,8,16,と様々なサイズを分けて用意しておいて適切なサイズに納めるというアーキテクチャです。
C#のメモリ管理の仕組み
で、肝心のC#のメモリ管理。
ガベージ コレクションの基礎 | Microsoft Docs
色々、書こうと思ったのですが、MSDNに書いてあるのだから、これを読むべきですね。
私は、下記のスライドも合わせて、理解を深めて行きました。
www.slideshare.net
※GoやPythonについても一部触れられています。
C#はメモリの割り当てを整理もしますし、それだけでなく世代管理ということもしています。
世代管理
- オブジェクトの生存時間が長くなるにつれ、Gen0→Gen1→Gen2と次世代の領域に移動します。
- ただし、85KB以上のLOH(Large Object Heap)は世代管理とは別で管理する。コピーするのに時間がかかるため。それ専用で管理する。
とのことですが、
なぜC#に世代管理なんて概念が存在するのか。
です。
これについても下記で詳しく回答してくれる人がいて
なるほど。長く置かれるほど、そこに留まる可能性が高い、という仮定から来ているのですね。
Garbage Collectionのソースコード
下記にあるらしいです。
https://raw.githubusercontent.com/dotnet/coreclr/master/src/gc/gc.cpp
ダウンロードしてVisual Studioで見たのですが、私は攻略の糸口さえ掴めませんでした。
腕に自信のある方はチャレンジしてみてください。