8 votes

lorsque java jvm compile le bytecode, où va ce code dans l'espace processus ?

Lorsque le jvm (hotspot dans mon cas) compile de manière permanente certains chemins de code en code machine, où ce code machine est-il stocké ? dans le segment .text de la mémoire du processus ? dans le heap du processus ? ?

Je ne parle pas de JITing. D'après ce que je comprends, le JIT compile et exécute le bytecode sans jamais sauvegarder le code compilé. Mais qu'en est-il lorsque le jvm es en sauvegardant ce code où dans l'espace processus le sauvegarde-t-il ? ... comme le soulignent les commentaires et les réponses, tout ce que je demandais fait en fait partie du JAT.

EDIT:

comme indiqué dans mon commentaire ci-dessous, la situation à laquelle je fais spécifiquement référence est documentée ici sous le nom d'"optimisation adaptative" : http://www.oracle.com/technetwork/java/whitepaper-135217.html#hotspot

4voto

EarlGray Points 3228

Je n'ai pas travaillé avec des VM de qualité production, mais voici mes cinq centimes.

.text dans les exécutables Unix appartiennent à la section fichier qui stocke le code exécutable ; au moment de l'exécution, cette section de fichier est mappée sur une zone de mémoire allouée par l'éditeur de liens du système lors de l'initialisation du programme, c'est tout (sous Linux, vous pouvez voir la disposition des sections en mémoire dans le fichier /proc/$PID/maps ).

En ce qui concerne la compilation JIT sur les systèmes de type Unix, je ne peux penser qu'aux zones de mémoire qui ont été attribuées par mmap appel système con PROT_EXEC activé. Cet appel est spécifié par les standards POSIX et utilisé par l'éditeur de liens système de Linux, ld.so pour charger en mémoire tout fichier exécutable natif. Cet appel peut également être utilisé pour allouer de nouvelles zones de mémoire exécutable au moment de l'exécution.

Le tas habituel est souvent protégé par les OS/ MMU d'être exécuté, comme tout /proc/$PID/maps suggère :

00dd4000-01292000 rw-p 00000000 00:00 0                  [heap]

aquí rw-p signifie qu'aucune donnée dans [heap] peuvent être exécutées (bien que, par exemple, ce ne soit pas le cas des CPU x86 32 bits sans PAE, ils n'ont pas la capacité matérielle d'empêcher l'exécution de certaines données de la mémoire en tant que code), mais peuvent être lues/écrites.

Une VM a donc besoin d'une zone de mémoire dédiée avec une autorisation d'exécution de code. En effet, cherchons rwx des zones de mémoire dans la disposition de la mémoire d'un processus java :

# cat /proc/12929/maps | grep rwx        # I run a Java VM with PID 12929
f3700000-f3940000 rwxp 00000000 00:00 0  # - an unnamed executable & writable region

L'exécution du code natif consiste alors à assembler le code natif compilé par JIT, soit indépendamment de la position (comme le code des objets partagés est compilé, avec gcc option -fPIC ) ou en utilisant l'adresse renvoyée par mmap() .

3voto

selig Points 2053

Tout d'abord, ce que vous décrivez est le JIT - spécifiquement comment il fonctionne dans Hotspot

Pour répondre à votre question sur l'endroit où le code est sauvegardé au moment de l'exécution - il est dans le tas du processus et les pointeurs vers le code de la méthode dans le fichier Klass de l'objet sont mis à jour pour pointer vers lui. Il y a aussi quelque chose appelé OSR (on stack replacement) pour compiler les longues boucles directement sur la pile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X