この記事は「Windows & Microsoft技術 基礎 Advent Calendar 2015」の12/7分です。
Windowsにはデスクトップヒープという、システムリソースを制限する仕組みがあります。要は無制限にGDIで管理されている画面のプログラムを動かしていると、デスクトップヒープが足りなくなって、アプリケーション初期化処理で失敗する、というものです。私もWindows Server 2003時代には結構泣かされました(使っていた独自ランタイムがあれだったせいもある)。
通常のユーザーログオン画面で動かしている分には発生することは、よっぽど派手なリークでもない限り、デスクトップヒープが問題になることはないのですが、サービスはこのヒープがデスクトップよりも制限されているのでしばしば発生していました。
https://support.microsoft.com/ja-jp/kb/126962
そもそもデスクトップヒープがどういうものか、という話はここが非常に詳しいです。
blogs.msdn.com technet.microsoft.com
デスクトップヒープがどのくらい使われているか調べる方法はDesktop Heap Monitorを入れる、ということで、あちこちに書かれているのですが、実はこのツールはWindows Server 2003でサポートが終了しました。前に書いた通り、「64bitで結構増やしたからもういいよね」ということのようです。
しかし、それでも調べたいのが人情で、どうやったらいいかということなんですが、どちらかでしょうか。
- sysinternalsのLiveKdを使う
- インストーラーのdheapinst.exeをWindows XP/Server 2003の互換モードで動かす
しかし、知らなかったのですが、Windows 8以降Vistaより前のOSの互換モードってなくなっているんですね*1。使ったことがないから知りませんでした。じゃあ、livekdでどうか?と思ってやってみるとこれがエラーになる。
Windows 8.1でのlivekd実行結果
Windows 7でのlivekd実行結果
Windows 10(TH2)でのlivekd実行結果
Windows 8.1のみ仮想マシンのリモートです。リモートデスクトップだからかと思ったのですが、WinObjではちゃんとWindowStationが見えていますね。
Windows 10では次の画像のように、Windows 8.1と違って、WindowStationが取得できていません(今ダウンロードした最新版のはずです)。
仮想デスクトップをちゃんとサポートするにあたり、この辺もWindows 8.1と変わったんでしょうか。
で、結局Windows 8以降のOSではデスクトップヒープの使用量は今のところ簡単には調べられなさそうだ、というのが結論。最初はWindows 8.1/10でも同じ方法でできるよ、ということを書こうとしたのですが(^^;。
ただ、リークに関してはVisual Studio 2015でアンマネージドでもリーク調査ができるようになったので、この辺の機能を使って、調査していくという方法になるのでしょう。
*1:コメントで教えていただきました。32bitのWin32アプリケーションなら9x系も表示されます