Valeurs automatiques de LDR_CNTRL=MAXDATA (32 bits uniquement)
Le paramètre automatique de la valeur de la variable d'environnement LDR_CNTRL=MAXDATA est lié à la taille du segment de mémoire Java™ utilisé par le SDK. Pour simplifier le réglage de LDR_CNTRL=MAXDATA, le SDK fixe une valeur appropriée basée sur la taille maximum du tas.
- Si la taille du tas est supérieure à 3 Go, LDR_CNTRL=MAXDATA=0@DSA est appliqué.
- Si la taille du tas est supérieure à 2,25 Go, mais inférieure à 3 Go, LDR_CNTRL=MAXDATA=0XB0000000@DSA est appliqué.
- Autrement, LDR_CNTRL=MAXDATA=0XA0000000@DSA est appliqué.
| Segment | Contenu |
|---|---|
| 0 | Noyau AIX® |
| 1 | programme Java |
| 2 | Pile primordiale (pile d'unité d'exécution du programme principal) |
| 3 | Tas natif (espace alloué avec malloc) |
| 4-C | Tas natif (espace alloué avec malloc) ou espace mémoire mappé (mmap/shmat) |
| D | Code des bibliothèques partagées |
| E | Espace de mémoire mappé (mmap/shmat) |
| F | Données des bibliothèques partagées |
Les segments 0 et 1 ont une utilisation fixe ; le segment 0 est toujours utilisé pour le noyau AIX et le segment 1 est toujours utilisé pour le code du programme d'application. Dans ce cas, le programme d'application est en général l'exécutable java.
- Le segment 2 est utilisé pour la pile du programme d'application.
- Les segments 3 à C sont disponibles pour le tas natif, bien que seul le segment 3 soit initialement réservé à l'usage du tas natif. Comme la machine virtuelle Java et le code JIT allouent de l'espace à partir du tas natif, celui-ci peut croître et consommer des segments contigus supplémentaires.
- Le segment de mémoire Java est alloué dans l'espace contigu du segment E ou à partir du segment C et des segments inférieurs. Autrement dit, un segment de mémoire Java de 256 Mo ou moins utilise uniquement le segment E. Un segment de mémoire Java de plus de 256 Mo utilise les segments C, B, ... jusqu'à une taille maximum de 2,25 Go utilisant tout C-4. Avec une taille maximale de 2,25 Go, le tas natif ne peut pas s'étendre au-delà du segment 3.
- Le segment D a été alloué par le système d'exploitation pour le code des bibliothèques partagées. Le segment F est utilisé pour les données des bibliothèques partagées. La machine virtuelle Java et le code JIT sont essentiellement contenus dans des bibliothèques partagées qui sont chargées dans ces segments.
Il ressort clairement de cette présentation de la mémoire que certaines applications Java peuvent rencontrer des problèmes lors de l'utilisation de segments de mémoire Java volumineux. Si un segment de mémoire Java de 2.25 Go est utilisé, le segment de mémoire natif est limité à un seul segment de 256 Mo. Si l'application Java a créé de nombreuses unités d'exécution, par exemple, elle peut consommer une grande partie du segment de mémoire natif pour les piles d'unités d'exécution, ce qui peut rendre la machine virtuelle Java ou JIT à court d'espace de segment de mémoire natif. Une telle situation nécessite une étude plus approfondie de la taille du segment de mémoire Java à utiliser et peut motiver l'utilisation d'un paramètre MAXDATA explicite.
Pour un segment de mémoire Java supérieur à 2.25 Go, un paramètre MAXDATA différent est nécessaire pour libérer des segments supplémentaires pour une zone contiguë suffisamment grande pour le segment de mémoire. Avec le réglage automatique MAXDATA=0xB0000000@DSA, l'agencement de mémoire devient :
| Segment | Contenu |
|---|---|
| 0 | AIX |
| 1 | programme Java |
| 2 | Pile primordiale (pile d'unité d'exécution du programme principal) |
| 3 | Tas natif (espace alloué avec malloc) |
| 4-D | Tas natif (espace alloué avec malloc) ou espace mémoire mappé (mmap/shmat) |
| E-F | Espace de mémoire mappé (mmap/shmat) |
- Le segment 2 est utilisé pour la pile du programme d'application.
- Les segments 3 à D sont disponibles pour le tas natif, bien que seul le segment 3 soit initialement réservé à l'usage du tas natif. Comme la machine virtuelle Java et le code JIT allouent de l'espace à partir du tas natif, celui-ci peut croître et consommer des segments contigus supplémentaires. Les bibliothèques partagées doivent aussi être chargées en privé dans cette plage de segments, car les segments D et F ne sont pas réservés aux bibliothèques partagées.
- Le segment de mémoire Java est alloué dans l'espace contigu à partir du segment F et des segments inférieurs, jusqu'à une taille maximale de 3 Go en utilisant tous les F-4.
Pour un segment de mémoire Java de plus de 3 Go, la seule option consiste à utiliser MAXDATA=0@DSA, ce qui génère un agencement de mémoire comme suit:
| Segment | Contenu |
|---|---|
| 0 | Noyau AIX |
| 1 | programme Java |
| 2 | Tas natif (espace alloué avec malloc) et pile primordiale (pile d'appels principale) |
| 3-F | Espace de mémoire mappé (mmap/shmat) |
Dans ce cas, le segment de mémoire Java consomme tous les segments 3 à F, pour une taille maximale de 3.25 Go. La pile primordiale, le tas natif et les bibliothèques partagées sont tous regroupés dans le segment 2. Il est peu probable que de nombreuses applications Java puissent s'exécuter correctement dans cette configuration.