カテゴリトップに戻る    前へ    次へ

Windowsサービスで使われるデスクトップヒープ領域について

そもそも「デスクトップヒープ」という言葉をあまり聞いたことがないと思いますが、Windows NT系のOSでプロセスを管理するための領域のことを指し、ログオンセッション毎に割り当てられています。
(Windows 9x系のOSでは「システムリソース」と呼ばれていたものです)

Windowsサービスとは一見関係なさそうなデスクトップヒープ領域ですが、実はWindowsサービスでもデスクトップヒープ領域が使用されています。
ここでは、それを確認するために「Desktop Heap Monitor」というツールをインストールしてみます。
↓こちらからダウンロードできます。(英語ページ)
Desktop Heap Monitor Version 8.1

ダウンロードが完了後、解凍用のexe(DesktopHeapMonitor8_1_2925_0.exe)を実行します。
※「8_1_2925_0」の部分は、バージョンにより変わると思われます。

解凍先(デフォルトは「C:\kktools\dheapmon8.1」)のフォルダ構成


使用方法については、「dheapmon.chm」(英語)に掲載されていますが、簡単に解説しておきます。

インストール方法
インターネットに接続できる環境であれば、解凍先の「x86」フォルダにある「dheapinst.exe」を以下のように実行すればインストールできます。
dheapinst.exe -y srv*http://msdl.microsoft.com/download/symbols

アンインストール方法
「コントロールパネル」→「プログラムの追加と削除」から「Desktop Heap Monitor」を削除します。

使用方法
このツールは、デスクトップヒープの使用状況のスナップショットを1回だけ取得し、テキストファイルに出力するものです。
従って、一定間隔でデスクトップヒープの使用状況をモニタリングするためには、自分でツールを作る必要があります。
(batファイル、Windowsサービスetc.)

1. 事前に、以下のコマンドでDesktop Heap Monitorをロードしておきます。
   dheapmon.exe -l

2. Desktop Heap Monitorを以下のコマンドで実行します。
   dheapmon.exe -f summary.txt
   ここでは、実行結果は「summary.txt」に出力されます。

3. 使わなくなった場合は、以下のコマンドでDesktop Heap Monitorをアンロードします。
   dheapmon.exe -u

出力された結果
Desktop Heap Information Monitor Tool (Version 8.1.2925.0)
Copyright (c) Microsoft Corporation.  All rights reserved.
-------------------------------------------------------------
  Session ID:    0 Total Desktop: (  5312 KB -    7 desktops)

  WinStation\Desktop            Heap Size(KB)    Used Rate(%)
-------------------------------------------------------------
   WinSta0\Default                   3072             22.5
   WinSta0\Disconnect                  64              4.5
   WinSta0\Winlogon                   128             10.3
   Service-0x0-3e7$\Default           512             17.7
   Service-0x0-3e4$\Default           512              4.3
   Service-0x0-3e5$\Default           512              4.3
   SAWinSta\SADesktop                 512              0.5
-------------------------------------------------------------

このような形式で結果が出力されますが、内容は簡単に言うと下記の通りです。
項目 内容
WinStation\Desktop デスクトップヒープ領域の名前
Heap Size 割り当てられている領域
Used Rate スナップショットを取得した時点での使用率

通常使用される領域は「WinSta0\Default」で、3,072KBの領域が割り当てられているのに対し、Windowsサービスは「Service-0x0-3e7$\Default」で、512KBしか割り当てられていません。

ここで、作成したサンプルアプリケーションを動作させてデスクトップヒープの使用状況をモニタリングした結果を下記の通りです。
(「WinSta0\Default」、「Service-0x0-3e7$\Default」のみ抜粋)
サービス開始前
  WinStation\Desktop            Heap Size(KB)    Used Rate(%)
-------------------------------------------------------------
   WinSta0\Default                   3072             22.5
   Service-0x0-3e7$\Default           512             17.7
-------------------------------------------------------------

サービス開始後
  WinStation\Desktop            Heap Size(KB)    Used Rate(%)
-------------------------------------------------------------
   WinSta0\Default                   3072             22.5
   Service-0x0-3e7$\Default           512             19.6
-------------------------------------------------------------

タイマー処理起動中
  WinStation\Desktop            Heap Size(KB)    Used Rate(%)
-------------------------------------------------------------
   WinSta0\Default                   3072             22.5
   Service-0x0-3e7$\Default           512             21.6
-------------------------------------------------------------

タイマー処理終了
  WinStation\Desktop            Heap Size(KB)    Used Rate(%)
-------------------------------------------------------------
   WinSta0\Default                   3072             22.5
   Service-0x0-3e7$\Default           512             19.6
-------------------------------------------------------------

サービス停止後
  WinStation\Desktop            Heap Size(KB)    Used Rate(%)
-------------------------------------------------------------
   WinSta0\Default                   3072             22.5
   Service-0x0-3e7$\Default           512             17.7
-------------------------------------------------------------

こうして見ると、サービスが稼動中に「Service-0x0-3e7$\Default」の領域の使用率が増減していることが分かります。
(例えば、タイマー処理起動中の状態では、サービス開始前と比べて3.9%(約20KB)増加しています)
しかし、デスクトップヒープ領域をより多く使用するサービスの場合、領域不足で以下のようなエラーが発生するケースもあるかも知れません。
エラーコード[0xc0000142]「アプリケーションを正しく初期化できませんでした」

これを回避する方法(※)は色々とあると思いますが、一つの方法として、Windowsサービスで使用するデスクトップヒープ領域をアプリケーション内で切り替える方法を次のページで紹介したいと思います。
(※)レジストリを変更して「Service-0x0-3e7$\Default」の領域を拡張する方法もありますが、レジストリエディタの使い方を誤ると、最悪の場合はOSの再インストールが必要となるため、あまりお勧めできません。

カテゴリトップに戻る    前へ    次へ

<参考リンク>
Desktop Heap Monitor ツールのインストール時にエラー メッセージ
"dheapinst - Win32k.sys symbol load error, correct symbol required" が表示される

デスクトップ アプリケーションのヒープを増やす