Praxistipp: Wie können Windows Desktop Heap-Probleme untersucht und gelöst werden?

Kompatibel :1.0.0
Editionen :Professional EditionStandard EditionCommunity Edition
Betriebssysteme :WindowsMac OSX (Not Supported)Linux (Not Supported)IBM AIX (Not Supported)FreeBSD (Not Supported)HP-UX (Not Supported)Solaris (Not Supported)IBM z/Linux (Not Supported)

Beim Installieren und Starten verschiedener Dienste unter Windows, kann das Problem auftreten, dass es nicht länger möglich ist, zusätzliche Dienste zu starten.

Jeder Dienst weist eine bestimmte Menge an Speicher des intern genutzten Desktop Heap Bereichs zu, um Dinge wie Windows, Schriftarten, API-Elemente etc. zu speichern. Wenn dieser Desktop-Heap ausgeschöpft ist, können user32-System-Aufrufe beim Aufruf abbrechen. Leider ist es gegenwärtig nicht möglich, das Windows-System nach der Menge des verfügbaren Desktop-Heap Bereichs im Voraus abzufragen. Wenn der verfügbare Desktop Heap für den Wrapper-Prozess aufgebraucht ist, werden Sie sehr wahrscheinlich einen der folgenden Fehler antreffen:

  • Der Versuch, einen Dienst zu starten, führt dazu, dass der Dienst-Manager unmittelbar mit folgendem Fehler abbricht:

    Error 1053: The service did not respond to the start or control request in a timely fashion
    
  • Der Dienst startet, aber der Versuch, die JVM komplett zu starten, mißlingt und diese beendet sich mit Fehlercode 6. Die wrapper.log-Datei enthält gewöhnlich einen Fehler wie den Folgenden:

    STATUS | wrapper  | 2011/08/31 16:54:53 | Launching a 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 exited while loading the application.
    
  • Der Dienst startet, aber die Zuweisung einer Konsole war nicht möglich.

Eine detaillierte Beschreibung zum internen Desktop-Heap kann auf einer externen Seite gefunden werden. Wenn der Dienst als ein nicht-interaktiver Dienst gestartet wird, ist auf einem 32-Bit Windows XP System die Standard Desktop Heap-Größe 512KB, aber dies variiert stark abhängig von der jeweiligen Windows-Version, die Sie am Laufen haben. Der Wrapper selbst belegt für jede Instanz zwischen 10-15 KB. Jedoch belegt auch jede gestartete JVM zumindest 20 KB. Der genaue Wert unterscheidet sich abhängig davon, was die ausgeführte Java-Anwendung gerade tut. Wenn der Heap-Bereich während des Ladens des Wrapper-Prozesses ausgeschöpft wird, werden Sie den oben beschriebenen Timeout erhalten. Wenn dieser ausgeschöpft ist, während die JVM geladen ist, dann sehen Sie eins der anderen Probleme.

Wie geschrieben, ist es nicht möglich gewesen, einen Weg für den Wrapper zu finden, Windows nach der Menge des verbleibenden Desktop-Heaps abzufragen. Es ist möglich, die Desktop-Heap-Nutzung mit dem "Desktop Heap Monitor" Tool, welches von Microsoft angeboten wird, zu überwachen und festzustellen. Dieses Tool funktioniert, indem es als Treiber der Kernelebene ausgeführt wird, welche eine Zugriffsebene erfordert, die wir für die Nutzung des Wrappers nicht voraussetzen möchten.

Bitte lesen Sie auf der Microsoft-Site mehr bezüglich der Nutzung der dheapmon.exe. Die grundlegenden Schritte sind wie folgt:

  • Der Desktop-Heap Monitor erfordert Zugriff auf die Windows Systemsymbole, um so zu zaubern. In den meisten Fällen ist es am einfachsten Microsofts Symbol-Server zu benutzen.

    dheapinst.exe -y srv*http://msdl.microsoft.com/download/symbols
    
  • Als Nächstes ist es notwendig, den Kernel-Treiber des Desktop Heap Monitors zu laden.

    dheapmon.exe -l
    
  • Schließlich führen Sie ihn aus, um den gegenwärtigen Zustand von allen Desktop-Heaps zu sammeln.

    dheapmon.exe
    

Wenn dheapmon.exe ausgeführt wird, sollten Sie etwas wie folgt sehen:

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
-------------------------------------------------------------

In dem obigen Beispiel wird der Wrapper als nicht-interaktiver, unabhängiger Dienst, als System-User im Service-0x0-3e7$\Default ausgeführt. Das Starten von zusätzlichen nicht-interaktiven Diensten wie den Standard System-User wird die Heap-Nutzung dieses Desktops entsprechend erhöhen.

Das Ausführen des Dienstes als einen interaktiven Dienst sorgt dafür, dass die Nutzung des WinSta0\Default-Heap-Bereichs wächst.

Das Ausführen des Dienstes mit einem bestimmten Benutzerkonto erstellt eine neue WinStation\Desktop-Sitzung für jeden individuellen Dienst.

Es gibt 2 gegenwärtig verfügbare Workarounds:

  • Das Ausführen mit einem bestimmten Dienst-Benutzerkonto mit der wrapper.ntservice.account_Eigenschaft. Jeder Dienst hat seinen eigenen Desktop und auf diese Weise auch seinen eigenen Desktop-Heap. Dies erlaubt Ihnen mehr Dienste zu starten, aber jeder Dienst erfordert auch mehr Desktop-Heap, als wenn diese zusammen auf einem gleichen Desktop ausgeführt würden. Sobald die Summe aller Desktop-Heaps die Größe des Session View Space erreicht, treten wieder Ressourcenprobleme auf. Für Windows XP und neuere Versionen von Windows ist die gesamte Standardgröße des Session View Space 48 MB. Es kann durch eine Änderung in der Registry geändert werden.

  • Es ist möglich den nicht-interaktiven Desktop Heap Bereich zu erhöhen, indem die Registry so wie in the instructions on Microsoft site beschrieben, editiert wird. Seien Sie, wie gewöhnlich, sehr vorsichtig, wenn Sie Ihre Registry ändern.

64-Bit-Versionen von Windows haben viel größere Standard Desktop-Heap-Größen, so werden Sie auf diesen Systemen wahrscheinlich viel seltener derartige Probleme antreffen.