J'essaie actuellement de creuser plus profondément dans les spécifications de la machine virtuelle Java. J'ai lu à l'intérieur du livre JVM en ligne et il y a une abstraction déroutante que je peux ' t semble saisir: Constant Pool. voici l'extrait du livre:
Pour chaque type qu'il charge, une machine virtuelle Java doit stocker un pool constant. Un pool constant est un ensemble ordonné de constantes utilisées par le type, y compris des littéraux (chaîne, entier et constantes à virgule flottante) ) et des références symboliques aux types, champs et méthodes. Les entrées du pool de constantes sont référencées par index, tout comme les éléments d'un tableau. Comme il contient des références symboliques à tous les types, champs et méthodes utilisés par un type, la constante pool joue un rôle central dans la liaison dynamique des programmes Java
J'ai plusieurs questions sur ce qui précède et CP en général:
.class
fichier pour chaque type?Je pense qu'il serait utile de comprendre comment le cadre est construit à l'aide d'un diagramme.
Le cadre est l'endroit où résident les opérandes (instructions d'opération) et c'est là que la liaison dynamique se produit. C'est un raccourci, pour ainsi dire, en utilisant le pool constant pour garder une trace de la classe et de ses membres.
Chaque trame contient une référence au pool de constantes d'exécution. La référence pointe vers le pool constant pour la classe de la méthode en cours d'exécution pour cette trame. Cette référence permet de prendre en charge la liaison dynamique.
Le code C/C++ est généralement compilé dans un fichier objet, puis plusieurs fichiers objet sont liés ensemble pour produire un artefact utilisable tel qu'un exécutable ou une DLL. Pendant la phase de liaison, les références symboliques dans chaque fichier objet sont remplacées par une adresse mémoire réelle par rapport à l'exécutable final. Dans Java cette phase de liaison est effectuée dynamiquement lors de l'exécution.
Lorsqu'un fichier Java est compilé, toutes les références aux variables et aux méthodes sont stockées dans le pool constant de la classe en tant que référence symbolique. Une référence symbolique est une référence logique et non une référence qui pointe réellement vers un physique emplacement de la mémoire.
Voici un lien vers James Blooms JVM Internals pour plus de détails.
Le pool de constantes fait partie du fichier .class
(Et sa représentation en mémoire) qui contient les constantes nécessaires pour exécuter le code de cette classe.
Ces constantes incluent les littéraux spécifiés par le programmeur et les références symboliques générées par le compilateur. Les références symboliques sont essentiellement des noms de classes, de méthodes et de champs référencés à partir du code. Ces références sont utilisées par la JVM pour lier votre code à d'autres classes dont il dépend.
Par exemple, le code suivant
System.out.println("Hello, world!");
produit le bytecode suivant (javap
sortie)
0: getstatic #2; //Field Java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3; //String Hello, world!
5: invokevirtual #4; //Method Java/io/PrintStream.println:(Ljava/lang/String;)V
#n
Voici des références au pool constant. #2
Est une référence symbolique au champ System.out
, #3
Est une chaîne Hello, world!
Et #4
Est une référence symbolique à PrintStream.println(String)
méthode.
Comme vous pouvez le voir, les références symboliques ne sont pas seulement des noms - par exemple, la référence symbolique à la méthode contient également des informations sur ses paramètres (Ljava/lang/String;
) Et le type de retour (V
signifie void
).
Vous pouvez inspecter le pool constant d'une classe en exécutant javap -verbose
Pour cette classe.
Quel est l'objectif de Constant Pool, en anglais simple?
Le CP est une zone mémoire des valeurs constantes très uniques sont stockées pour réduire la redondance:
System.err.println("Hello");
System.out.println("Hello");
Dans le CP, il n'y a qu'un seul objet String "Hello" et le compilateur se substitue dans les deux lignes à la même référence. Votre fichier .class ne contient qu'une seule chaîne Hello. (Idem pour les autres types).
Le CP se trouve-t-il dans le fichier .Class pour chaque type?
Oui, regardez ici: http://en.wikipedia.org/wiki/Java_class_file
Donnons l'exemple d'abord pour comprendre ce que signifie le pool constant de chaînes
public class StringConstantPool {
public static void main(String[] args) {
String s = "prasad";
String s2 = "prasad";
System.out.println(s.equals(s2));
System.out.println(s == s2);
}
}
la sortie sera
true
true
ce qui se passe ici étape par étape
1- La classe est chargée lorsque JVM est invoquée.
2- JVM recherchera tous les littéraux de chaîne dans le programme.
3- Premièrement, il trouve la variable s qui fait référence au littéral "prasad" et il sera créé dans la mémoire
4- Une référence pour le littéral “prasad” sera placée dans la mémoire du pool de chaînes de constantes.
5- Puis il en trouve un autre variable s2 qui fait référence à la même chaîne littérale "prasad" .
Maintenant que JVM a déjà trouvé un littéral de chaîne “prasad“, les variables s et s2 feront référence à la même objet ie “prasad“.
J'espère que cela vous sera utile
en savoir plus http://www.journaldev.com/797/what-is-Java-string-pool