Valores automáticos de LDR_CNTRL=MAXDATA (solo 32 bits)
El valor automático de la variable de entorno LDR_CNTRL=MAXDATA se enlaza con el tamaño del almacenamiento dinámico de Java™ utilizado por el SDK. Para simplificar el valor de LDR_CNTRL=MAXDATA, el SDK establece un valor adecuado basado en el tamaño máximo del almacenamiento dinámico.
- Si el tamaño de almacenamiento dinámico es superior a 3 GB, se establece LDR_CNTRL=MAXDATA=0@DSA.
- Si el tamaño de almacenamiento dinámico es superior a 2,25 GB pero no superior a 3 GB, se establece LDR_CNTRL=MAXDATA=0XB0000000@DSA.
- De lo contrario, se establece LDR_CNTRL=MAXDATA=0XA0000000@DSA.
| Segmento | Contenido |
|---|---|
| 0 | Kernel de AIX® |
| 1 | Programa Java |
| 2 | Pila primordial (pila de hebra de programa principal) |
| 3 | Almacenamiento dinámico nativo (espacio en el que se ha ejecutado malloc) |
| 4-C | Almacenamiento dinámico nativo (espacio en el que se ha ejecutado malloc) o espacio correlacionado de memoria (mmap/shmat) |
| D | Código de biblioteca compartida |
| E | Espacio correlacionado de memoria (mmap/shmat) |
| F | Datos de biblioteca compartida |
Los segmentos 0 y 1 tienen un uso fijo; el segmento 0 siempre se utiliza para el kernel de AIX y el segmento 1 siempre se utiliza para el código de programa de aplicación. En este caso, el código de programa de aplicación es normalmente el ejecutable de java.
- El segmento 2 se utiliza para la pila del programa de aplicación.
- Los segmentos del 3 al C están disponibles al almacenamiento dinámico nativo, aunque inicialmente sólo el segmento 3 está reservado para el almacenamiento dinámico nativo. Debido a que la JVM y JIT asignan espacio desde el almacenamiento dinámico nativo, se puede ampliar para consumir segmentos contiguos adicionales.
- El almacenamiento dinámico de Java se asigna en espacio contiguo en el segmento E, o desde el segmento C y segmentos inferiores. Es decir, un almacenamiento dinámico de Java de 256 MB o menos utiliza sólo el segmento E. Un almacenamiento dinámico de Java de más de 256 MB utiliza los segmentos C, B, ... según sea necesario, hasta un tamaño máximo de 2,25 GB utilizando todos los C-4. Con un tamaño máximo de 2.25 GB, el almacenamiento dinámico nativo no puede ampliarse más allá del segmento 3.
- El segmento D lo ha asignado el sistema operativo para el código de biblioteca compartida, el segmento F se utiliza para los datos de biblioteca compartida. La JVM y JIT están contenidos principalmente en bibliotecas compartidas que se cargan en estos segmentos.
De este diseño de memoria se desprende que algunas aplicaciones Java pueden tener problemas al utilizar grandes almacenamientos dinámicos de Java. Si se utiliza un almacenamiento dinámico de Java de 2.25 GB, el almacenamiento dinámico nativo está restringido a un único segmento de 256 MB. Si la aplicación Java ha creado muchas hebras, por ejemplo, puede consumir una gran fracción del almacenamiento dinámico nativo para pilas de hebras, lo que puede hacer que la JVM o JIT se quedan sin espacio de almacenamiento dinámico nativo. Esta situación requiere una consideración más cuidadosa del tamaño del almacenamiento dinámico de Java que se debe utilizar y puede motivar el uso de un valor MAXDATA explícito.
Para un almacenamiento dinámico de Java mayor que 2.25 GB, se necesita un valor de MAXDATA diferente para liberar segmentos adicionales para un área contigua lo suficientemente grande para el almacenamiento dinámico. Con el valor automático de MAXDATA=0xB0000000@DSA, la distribución de memoria cambia a:
| Segmento | Contenido |
|---|---|
| 0 | Kernel de AIX |
| 1 | Programa Java |
| 2 | Pila primordial (pila de hebra de programa principal) |
| 3 | Almacenamiento dinámico nativo (espacio en el que se ha ejecutado malloc) |
| 4-D | Almacenamiento dinámico nativo (espacio en el que se ha ejecutado malloc) o espacio correlacionado de memoria (mmap/shmat) |
| E-F | Espacio correlacionado de memoria (mmap/shmat) |
- El segmento 2 se utiliza para la pila del programa de aplicación.
- Los segmentos del 3 al D están disponibles para el almacenamiento dinámico nativo, aunque inicialmente sólo el segmento 3 está reservado para el almacenamiento dinámico nativo. Debido a que la JVM y JIT asignan espacio desde el almacenamiento dinámico nativo, se puede ampliar para consumir segmentos contiguos adicionales. Las bibliotecas compartidas también se deben cargar de manera privada en este rango de segmentos porque los segmentos D y F no están reservados para bibliotecas compartidas.
- El almacenamiento dinámico de Java se asigna en espacio contiguo desde el segmento F y los segmentos inferiores, hasta un tamaño máximo de 3 GB utilizando todos los F-4.
Para un almacenamiento dinámico de Java de más de 3 GB, la única opción es utilizar MAXDATA=0@DSA, lo que da como resultado un diseño de memoria como el siguiente:
| Segmento | Contenido |
|---|---|
| 0 | Kernel AIX |
| 1 | Programa Java |
| 2 | Almacenamiento intermedio nativo (espacio en el que se ha ejecutado malloc) y pila primordial (pila de invocación principal) |
| 3-F | Espacio correlacionado de memoria (mmap/shmat) |
El almacenamiento dinámico de Java en este caso consume todos los segmentos de 3 a F, para un tamaño máximo de 3.25 GB. La pila primordial, el almacenamiento dinámico nativo y las bibliotecas compartidas se empaquetan todas en el segmento 2. Es poco probable que muchas aplicaciones Java se puedan ejecutar correctamente en esta configuración.