Automatische LDR_CNTRL=MAXDATA-Werte (nur 32 Bit)

Die automatische Einstellung des Werts der Umgebungsvariablen LDR_CNTRL=MAXDATA ist mit der Größe des Java™ -Heapspeichers verknüpft, der vom SDK verwendet wird. Zur Vereinfachung der Einstellung von LDR_CNTRL=MAXDATA legt das SDK einen geeigneten Wert fest, der auf der maximalen Größe des Heapspeichers basiert.

Wird LDR_CNTRL=MAXDATA vor dem Start des Software-Development-Kits festgelegt, nutzt das SDK den angegebenen Wert. Andernfalls verwendet das SDK folgenden Algorithmus zur Festlegung von LDR_CNTRL=MAXDATA:
  • Übersteigt die Größe des Heapspeichers 3 GB, wird LDR_CNTRL=MAXDATA=0@DSA festgelegt.
  • Übersteigt die Größe des Heapspeichers 2,25 GB, liegt sie jedoch unter 3 GB, wird LDR_CNTRL=MAXDATA=0XB0000000@DSA festgelegt.
  • Andernfalls wird LDR_CNTRL=MAXDATA=0XA0000000@DSA festgelegt.
Im Folgenden sehen Sie ein Bild des Speicherlayouts mit MAXDATA=0xA0000000@DSA, das für Java-Heapspeicher bis zu 2.25 GB verwendet wird:
Tabelle 1. Das Java Virtual Memory-Standardmodell
Segmentierung Inhalt
0 AIX® -Kernel
1 Java-Programm
2 Ursprünglicher Stack (Thread-Stack des Hauptprogramms)
3 Nativer Heapspeicher (über malloc zugeordneter Speicher)
4-C Nativer Heapspeicher (über malloc zugeordneter Speicher) oder einem Speicher zugeordneter Bereich (mmap/shmat)
D Code gemeinsam genutzter Bibliotheken
E Einem Speicher zugeordneter Bereich (mmap/shmat)
F Daten gemeinsam genutzter Bibliotheken

Die Segmente 0 und 1 haben eine feste Nutzung; Segment 0 wird immer für den AIX -Kernel und Segment 1 immer für den Anwendungsprogrammcode verwendet. In diesem Fall ist der Anwendungsprogrammcode für gewöhnlich die ausführbare java-Funktion.

Die Einstellung von MAXDATA=0xA0000000@DSA wirkt sich wie folgt auf die Verwendung der übrigen Segmente aus:
  • Segment 2 wird für den Stack des Anwendungsprogramms verwendet.
  • Die Segmente 3 bis C stehen dem nativen Heapspeicher zur Verfügung, auch wenn anfangs nur Segment 3 für den nativen Heapspeicher reserviert ist. Da die JVM und JIT Speicherbereich aus dem nativen Heapspeicher zuordnen, ist eine Erweiterung möglich, damit weitere fortlaufende Segmente genutzt werden können.
  • Der Java-Heapspeicher wird in zusammenhängendem Speicherbereich in Segment E oder aus Segment C und niedrigeren Segmenten zugeordnet. Das bedeutet, dass ein Java-Heapspeicher von 256 MB oder weniger nur Segment E verwendet. Ein Java-Heapspeicher mit mehr als 256 MB verwendet die Segmente C, B, ... Bei Bedarf bis zu einer maximalen Größe von 2.25 GB bei Verwendung aller C-4. Bei der maximalen Größe von 2,25 GB kann der native Heapspeicher nicht über Segment 3 hinaus erweitert werden.
  • Segment D wurde vom Betriebssystem bereits für den gemeinsam genutzten Bibliothekscode zugeordnet, während Segment F für gemeinsam genutzte Bibliotheksdaten verwendet wird. Die JVM und JIT sind meist in den gemeinsam genutzten Bibliotheken enthalten, die in diese Segmente geladen werden.
Der Java-Heapspeicher wird von der JVM mithilfe der AIX -Funktionen 'mmap' oder 'shmget' bzw. 'shmat' zugeordnet. Die Funktion mmap wird verwendet, wenn der Java-Heapspeicher in normalen 4-KB-Seiten zugeordnet wird. Die Funktion shmget/shmat wird verwendet, wenn über die Option -Xlp angegeben ist, dass große Seiten verwendet werden sollen.

Aus diesem Speicherlayout ist ersichtlich, dass einige Java-Anwendungen Probleme haben können, wenn große Java-Heapspeicher verwendet werden. Wenn ein Java-Heapspeicher von 2.25 GB verwendet wird, ist der native Heapspeicher auf ein einzelnes 256-MB-Segment beschränkt. Wenn die Java-Anwendung beispielsweise viele Threads erstellt hat, verbraucht sie möglicherweise einen großen Teil des nativen Heapspeichers für Thread-Stacks, was dazu führen kann, dass die JVM oder JIT nicht mehr über nativen Heapspeicher verfügt. Eine solche Situation erfordert eine sorgfältigere Überlegung, welche Größe des Java-Heapspeichers verwendet werden soll, und kann die Verwendung einer expliziten Einstellung für MAXDATA motivieren.

Für einen Java-Heapspeicher mit mehr als 2.25 GB ist eine andere MAXDATA -Einstellung erforderlich, um zusätzliche Segmente für einen zusammenhängenden Bereich freizugeben, der groß genug für den Heapspeicher ist. Bei der automatischen Einstellung MAXDATA=0xB0000000@DSA ändert sich der Speicheraufbau wie folgt:

Tabelle 2. Speichermodell mit MAXDATA=0xB0000000@DSA
Segmentierung Inhalt
0 AIX -Kernel
1 Java-Programm
2 Ursprünglicher Stack (Thread-Stack des Hauptprogramms)
3 Nativer Heapspeicher (über malloc zugeordneter Speicher)
4-D Nativer Heapspeicher (über malloc zugeordneter Speicher) oder einem Speicher zugeordneter Bereich (mmap/shmat)
E-F Einem Speicher zugeordneter Bereich (mmap/shmat)
Die Verwendung der Segmente 0 und 1 ist festgelegt. Die Einstellung von MAXDATA=0xB0000000@DSA wirkt sich wie folgt auf die Verwendung der übrigen Segmente aus:
  • Segment 2 wird für den Stack des Anwendungsprogramms verwendet.
  • Die Segmente 3 bis D stehen dem nativen Heapspeicher zur Verfügung, auch wenn anfangs nur Segment 3 für den nativen Heapspeicher reserviert ist. Da die JVM und JIT Speicherbereich aus dem nativen Heapspeicher zuordnen, ist eine Erweiterung möglich, damit weitere fortlaufende Segmente genutzt werden können. Gemeinsam genutzte Bibliotheken müssen in diesen Segmentbereich auch privat geladen werden, da die Segmente D und F nicht für gemeinsam genutzte Bibliotheken reserviert sind.
  • Der Java-Heapspeicher wird in zusammenhängendem Speicherbereich von Segment F und niedrigeren Segmenten bis zu einer maximalen Größe von 3 GB unter Verwendung aller F-4zugeordnet.
Wenn ein Heapspeicher mit der maximalen Größe von 3 GB verwendet wird, ist der native Heapspeicher, der der JVM und JIT zur Verfügung steht, beschränkt. In diesem Fall besteht die zusätzliche Einschränkung, dass die gemeinsam genutzten Bibliotheken neben dem nativen Heapspeicher existieren müssen.

Für einen Java-Heapspeicher, der größer als 3 GB ist, ist die einzige Option, MAXDATA=0@DSAzu verwenden, was zu einem Speicherlayout wie folgt führt:

Tabelle 3. Speichermodell mit MAXDATA=0@DSA
Segmentierung Inhalt
0 AIX -Kernel
1 Java-Programm
2 Nativer Heapspeicher (über malloc zugeordneter Speicher) und ursprünglicher Stack (Hauptaufrufstack)
3-F Einem Speicher zugeordneter Bereich (mmap/shmat)

Der Java-Heapspeicher verbraucht in diesem Fall alle Segmente 3 bis F für eine maximale Größe von 3.25 GB. Der ursprüngliche Stack, der native Heapspeicher und die gemeinsam genutzten Bibliotheken werden alle in Segment 2 gepackt. Es ist unwahrscheinlich, dass viele Java-Anwendungen erfolgreich in dieser Konfiguration ausgeführt wurden.