Go/Size class
表示
< Go
Goにおける Size class(サイズクラス) とは、メモリ割り当てを効率的に行うために使われる固定サイズのバケット分類のことです。Goのランタイムは、ヒープメモリの割り当て・解放の効率化のために、よく使われるメモリサイズをいくつかのクラス(=サイズクラス)に分け、それぞれのクラスごとに管理しています。
基本概念
[編集]Goのメモリ管理では、オブジェクトを以下のように分類します:
| オブジェクトの大きさ | 管理単位 |
|---|---|
| 小さい(<= 32KB) | Size class による固定サイズ管理(mcache, mcentral, mheap)
|
| 大きい(> 32KB) | Large object として mheap が直接管理
|
Size class の具体例(Go 1.21 付近)
[編集]Goは以下のような 固定サイズのバケットを持っています:
8, 16, 32, 48, 64, 80, 96, 112, ...
つまり、16バイトを要求すると、16バイトのサイズクラスから、128バイトを要求すると128バイトのサイズクラスからメモリが割り当てられます。
メモリ割り当ての流れ(小さなオブジェクト)
[編集]new()やmake()で割り当て要求- サイズに応じて size class を決定
- スレッドローカルキャッシュ(
mcache)に空きがあればそこから割り当て - なければ
mcentral→mheapにフォールバックしてページ取得
なぜ Size class を使うのか?
[編集]- 断片化を防ぐ
- 固定サイズなので、メモリの穴(fragmentation)が発生しにくい。
- 高速化
- 頻繁に使われるサイズ(例: 16, 32, 64バイト)に最適化されており、即座に確保可能。
- 再利用しやすい
- 同じサイズクラスの空き領域がプールされていて、解放後も再利用可能。
詳しい実装箇所
[編集]Goのランタイムの以下のファイル群が関係します:
src/runtime/malloc.go(mallocgc,mcache,mcentral,mheapなど)src/runtime/sizeclasses.go(サイズクラスの定義)
サイズクラスの情報はビルド時に自動生成され、sizeclass 配列に格納されています。
まとめ
[編集]| 項目 | 内容 |
|---|---|
| 定義 | メモリ割り当てサイズを分類する単位 |
| 対象 | およそ 32KB 以下のオブジェクト |
| 利点 | 高速、断片化の低減、再利用性 |
| 実装 | mcache/mcentral/mheap による階層構造
|
必要であれば sizeclass の一覧やソースコードからの読み方もご案内します。