World Map
Java Service Wrapperは、御社Javaアプリケーション製品の安定した信頼性を高める最短最善の方法です。
  • Free Trial
  • Buy Now

HowTo: Windowsデスクトップ・ヒープ問題の調査と解決方法

対応バージョン : 1.0.0
対応エディション :プロフェッショナル版スタンダード版コミュニティー版
対応プラットフォーム :WindowsMac OSX (未対応)Linux (未対応)IBM AIX (未対応)FreeBSD (未対応)HP-UX (未対応)Solaris (未対応)IBM z/OS (未対応)IBM z/Linux (未対応)

Windows上で、いくつかサービスをインストールしてスタートすると、 追加したサービスが開始できないという問題に遭遇する場合があります。

各サービスでは、Windowsシステム、フォント、APIエレメントなどを保存するのに利用する内部のデスクトップ・ヒープ領域から、 一定量のメモリを割り当てます。 このデスクトップ・ヒープ領域が枯渇すると、user32システムコールが失敗し始めます。 残念ながら、現在のところ、事前にWindowsシステムへ問い合わせして、 デスクトップ・ヒープ容量について確認することはできません。 Wrapperプロセスで有効なデスクトップ・ヒープ領域が枯渇すると、 ほとんどの場合、以下のようなエラーに遭遇することになるでしょう:

  • サービス開始の試みで、サービスマネージャーが即座に次のエラーでタイムアウトになります:

    Error 1053: The service did not respond to the start or control request in a timely fashion
  • サービスを開始しますが、完全にJVMの起動失敗になり、コード6で終了します。 通常、次のようなエラーを「wrapper.log」ファイルに記録します。

    STATUS | wrapper  | 2011/08/31 16:54:53 | JVM起動中...
    INFO   | jvm 1    | 2011/08/31 16:54:54 | Error loading: C:\Sun\jdk1.6.0_24\jre\bin\server\jvm.dll
    ERROR  | wrapper  | 2011/08/31 16:54:54 | アプリケーションを読み込み中に、JVMが終了しました。
  • サービスを開始しますが、コンソールの配置に失敗します。

内部デスクトップ・ヒープに関する説明は、外部サイトをご覧ください。 もし、サービスが非対話サービスとして起動すると、WindowsXP 32ビット版システムで、 デフォルトのヒープ容量は512KBですが、これは 動作しているWindowsバージョン次第で大きく変化します。 Wrapper自体は各インスタンスごとに10-15KBを割り当てます。 しかしながら、起動されたJVMもまた最低でも20 KBを割り当てます。 その正確な値は、動作しているJavaアプリケーションが何をしているか次第で変化します。 もしWrapperプロセスをロード(読み込み)している時にヒープ容量が枯渇すると、 上記で示すようなタイムアウト(時間切れ)という結果になります。 もしJVMをロード(読み込み)している時にヒープ容量が枯渇すると、その他の問題になります。

これを書いている現時点で、 Wrapperからデスクトップ・ヒープの残量についてWindowsへ問い合わせする方法を見つけることができません。 マイクロソフトから提供されているツール「デスクトップ・ヒープ・モニター」 を使い、デスクトップ・ヒープを診断し、モニタリング(監視)することが可能です。 このツールは、カーネル・レベルのドライバーとして動作する必要があるため、Wrapperには不要ですが、アクセス・レベルが必要です。

dheapmon.exeの使い方は、マイクロソフトの説明書を参照ください。 基本ステップは次のとおり:

  • 「デスクトップ・ヒープ・モニター」には、Windowsシステム・シンボルへのアクセス権が必要です。 ほとんどのケースで、一番簡単な方法は、マイクロソフトのシンボル・サーバーへアクセスすることです。

    dheapinst.exe -y srv*http://msdl.microsoft.com/download/symbols
  • 次に、デスクトップ・ヒープ・モニター・カーネル・ドライバーをロード(読み込み)する必要があります。

    dheapmon.exe -l
  • 最後に、動作させて、全てのデスクトップ・ヒープの現在の状況を収集します。

    dheapmon.exe

dheapmon.exe」が動作するとき、 以下のように見えるはずです:

C:\kktools\dheapmon8.1\x86>dheapmon.exe
Desktop Heap Information Monitor Tool (Version 8.1.2925.0)
Copyright (c) Microsoft Corporation.  All rights reserved.
-------------------------------------------------------------
  Session ID:    0 Total Desktop: (  5824 KB -    7 desktops)

  WinStation\Desktop            Heap Size(KB)    Used Rate(%)
-------------------------------------------------------------
  WinSta0\Default                    3072              8.2
  WinSta0\Disconnect                   64              4.5
  WinSta0\Winlogon                    128              9.8
  Service-0x0-3e7$\Default            512             28.8
  Service-0x0-3e4$\Default            512              2.1
  Service-0x0-3e5$\Default            512              3.1
  SAWinSta\SADesktop                 1024              0.3
-------------------------------------------------------------

上記の例で、「Service-0x0-3e7$\Default」で、 WrapperはSYSTEMユーザーとして非対話サービスとして動作しています、 デフォルト・SYSTEMユーザーとして、さらに非対話サービスを追加で開始すると、 次第にこのデスクトップ・ヒープ利用が増量します。

対話サービスとしてサービスを動作させると、WinSta0\Defaultヒープ量が増えることになります。

あるユーザーアカウントでサービスを動作させると、それぞれ個別のサービスごとに、 新しくWinStation\Desktopセッションを作成します。

現在のところ、ここに2つの回避策があります:

  • wrapper.ntservice.account]プロパティで、 特定のサービス・ユーザーアカウントとして動作させること。 各サービスには、そのデスクトップと、ゆえにデスクトップ・ヒープを持っています。 これにより、より多くのサービスを動かせるようになりますが、 各サービスは、同じデスクトップで一緒に動作するときよりも、もっと多くのデスクトップ・ヒープを要求します。 一旦、全てのデスクトップ・ヒープの合計が、Session View Spaceのサイズに達すると、 再度リソース問題に遭遇します。 WindowsXPや、その後続バージョンのWindowsで、 Session View Spaceのデフォルト合計サイズは48MBです。 レジストリを変更することで、その数字を増加させることができます。

  • マイクロソフトの手順書のとおり、 レジストリを変更することで、非対話デスクトップ・ヒープ容量を増やすことは可能です。 ご存知かと思いますが、レジストリを変更する際には十分に注意してください。

Windows 64ビット版には、デフォルトで、かなり大きなデスクトップ・ヒープのサイズを用意してありますので、 そのシステム上で問題に遭遇することは、まずありません。