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