HowTo: Windows デスクトップヒープ問題の調査と解決方法 |
||||||||||||
Windows 上で、いくつかサービスをインストールしてスタートすると、 追加したサービスが開始できないという問題に遭遇する場合があります。 各サービスでは、Windows システム、フォント、API エレメントなどを保存するのに利用する内部のデスクトップヒープ領域から、 一定量のメモリを割り当てます。 このデスクトップヒープ領域が枯渇すると、user32 システムコールが失敗し始めます。 残念ながら、現在のところ、事前に Windows システムへ問い合わせして、 デスクトップヒープ容量について確認することはできません。 Wrapper プロセスで有効なデスクトップヒープ領域が枯渇すると、 ほとんどの場合、以下のようなエラーに遭遇することになるでしょう。
内部デスクトップヒープに関する説明は、外部サイトをご覧ください。 もし、サービスが非対話サービスとして起動すると、Windows XP 32 ビット版システムで、 デフォルトのヒープ容量は 512 KB ですが、これは 動作しているWindowsバージョン次第で大きく変化します。 Wrapper 自体は各インスタンスごとに 10-15 KB を割り当てます。 しかしながら、起動された JVM もまた最低でも 20 KB を割り当てます。 その正確な値は、動作している Java アプリケーションが何をしているか次第で変化します。 もし Wrapper プロセスをロード(読み込み)している時にヒープ容量が枯渇すると、 上記で示すようなタイムアウト(時間切れ)という結果になります。 もし JVM をロード(読み込み)している時にヒープ容量が枯渇すると、その他の問題になります。 これを書いている現時点で、 Wrapper からデスクトップヒープの残量について Windows へ問い合わせする方法を見つけることができません。 マイクロソフトから提供されているツール「デスクトップヒープモニター」を使い、デスクトップヒープを診断し、 モニタリング(監視)することが可能です。 このツールは、カーネルレベルのドライバーとして動作する必要があるため、Wrapper には不要ですが、アクセスレベルが必要です。
dheapmon.
「dheapmon.
上記の例で、「Service-0x0-3e7$\Default」で、 Wrapper は SYSTEM ユーザーとして非対話サービスとして動作しています、 デフォルト SYSTEM ユーザーとして、さらに非対話サービスを追加で開始すると、 次第にこのデスクトップヒープ利用が増量します。 対話サービスとしてサービスを動作させると、WinSta0\Default ヒープ量が増えることになります。 あるユーザーアカウントでサービスを動作させると、それぞれ個別のサービスごとに、 新しく WinStation\Desktop セッションを作成します。 現在のところ、ここに2つの回避策があります:
Windows 64 ビット版には、デフォルトで、かなり大きなデスクトップヒープのサイズを用意してありますので、 そのシステム上で問題に遭遇することは、まずありません。 |