見出し画像

Windows 11 25H2 の Working Set 挙動を実測してみた。Windows のメモリ管理を本気で観測したら、結局 C++ が基準言語になった話


※ 本記事では Working Set 昇格の内部評価ロジックそのものを断定するものではない。
あくまで観測可能な挙動(WS / PageFault の推移)から、
「アクセスの継続性(滞在時間)が影響しているように見える」
という傾向を示したものである。
本記事の検証は筆者の環境・条件での観測結果であり、
製品の不具合や仕様を断定するものではありません。
同様の結果が再現されるかは環境差があります。

はじめに

Windows のメモリ管理、とくに Working Set(WS)Page Fault(PF) の挙動は
「理論では知っているけど、実際にどう増えるのか?」を正確に見るのは意外と難しい。

今回、

  • Java

  • C#

  • Go

  • Python

  • そして C++

同じ条件・同じサイズ(512MB) のメモリを確保し、
1ページずつタッチして WS / PF を実測してみた。

結論から言う。

Windows のメモリ管理を“そのまま”観測できたのは C++ だけだった。


検証環境

  • OS: Windows 11 (x64)

  • メモリ確保サイズ: 512MB

  • ページサイズ: 4KB

  • API:

    • VirtualAlloc

    • GetProcessMemoryInfo

  • 1MB ごとにログ出力


C++ 実装概要

C++ では VirtualAlloc で確保した生メモリ
そのままポインタで 1 ページずつ読み出す。

for (size_t i = 0; i < SIZE; i += 4096) {
    volatile char x = buf[i];
}

余計なランタイムも GC も存在しない。
OS と 1 対 1 で向き合える状態を作る。


実測結果(C++)

Touched  492 MB | WS  496 MB | PF 127308
Touched  493 MB | WS  497 MB | PF 127564
Touched  494 MB | WS  498 MB | PF 127821
Touched  495 MB | WS  499 MB | PF 128077
Touched  496 MB | WS  500 MB | PF 128334
Touched  497 MB | WS  501 MB | PF 128590
Touched  498 MB | WS  502 MB | PF 128847
Touched  499 MB | WS  503 MB | PF 129103
Touched  500 MB | WS  504 MB | PF 129360
Touched  511 MB | WS  515 MB | PF 132181

何が「正しい」のか

Working Set

  • Touched MB と WS がほぼ 1:1

  • ページを触った瞬間に WS に反映

  • 遅延・圧縮・最適化なし

Page Fault

  • 512MB / 4KB ≒ 131,072

  • PF の最終値が 理論値とほぼ一致

  • 増え方も完全に線形

👉 Demand Paging の教科書どおりの挙動


他言語との違い

言語WSの挙動理由C++◎ 完全一致OS直アクセスC◎同上Delphi◎同上Rust◎unsafe で OS 直Go△→◎最適化・GC対策が必要C#○CLR が介在Java△JVM / FFM の制約Python○ctypes 経由

C++ が“速い”からではない。
“正確”だから基準になる。


なぜ C++ が基準になるのか

  • GC がない

  • ランタイム管理メモリがない

  • ヒープ拡張・圧縮がない

  • OS API の結果を そのまま観測できる

つまり:

C++ は「Windows メモリ管理の実測器」


まとめ

  • メモリ管理の理解は「理論」より「実測」

  • その基準として C++ は今も最強

  • 他言語の挙動は
    👉 C++ と比べることで初めて意味を持つ

いいなと思ったら応援しよう!