Avec les options et -Xmx
, il est possible de définir la taille initiale et maximale du pool d'allocation de mémoire. En utilisant strace/truss sous Linux et AIX, j'ai découvert que la JVM utilise en interne l'appel système (k) mmap. L'adresse -Parameter étant NULL, le système d'exploitation décide à quelle adresse de mémoire virtuelle il mappe la mémoire.Spécifier l'adresse du pool d'allocation de mémoire Java
$ truss java -Xmx512M Hello 2>&1 | grep mmap
kmmap(0x00000000, 536870912, 3, 17, -1, 0x00000000, 0x00000000) = 0xB0000000
Est-il possible de spécifier cette adresse? Contexte: Je dois appeler du code hérité via l'interface JNI (Java Native Interface), qui nécessite d'énormes quantités de données non relocalisables (2 Go dans un espace d'adressage 32 bits) mappées à un emplacement spécifique en mémoire. Cette région chevauche l'emplacement du pool d'allocation de mémoire Javas.
Edit: Ceci est la mise en page de la mémoire réelle:
0x0... AIX
0x1... Text
0x2... Stack
0x3... Heap
0x4... Heap
...... Legacy Data (2 GB)
0xd... Shared Library Text
0xe... unused
0xf... Shared Library Data
Mon but est de déplacer le Java pool d'allocation mémoire de 0xb/0xc dans les segments 0x3/de 0x4, ce qui est également disponible dans la norme (non grand) modèle de mémoire.
Pouvez-vous modifier le code existant pour rendre son emplacement de mémoire configurable? –
«qui exige d'énormes quantités» toute estimation en mb ou gb? – Favonius