Quel est le but du pool constant Java?

Je suis en train d’essayer de creuser plus profondément dans la spécification de la machine virtuelle Java. J’ai lu en ligne le livre de JVM et il me semble impossible de comprendre une abstraction déroutante: Constant Pool. voici l’extrait du livre:

Pour chaque type chargé, 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 les littéraux (chaîne, entier et constantes à virgule flottante) et les références symboliques aux types, champs et méthodes. Les entrées du pool constant 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, le pool constant joue un rôle central dans la liaison dynamic des programmes Java.

J’ai plusieurs questions à propos de ce qui précède et du CP en général:

  1. Le CP est-il situé dans le fichier .class pour chaque type?
  2. Que veut dire l’auteur par “référence symbolique”?
  3. Quel est le but de Constant Pool, en anglais simple?

Je pense que la compréhension de la construction du cadre à l’aide d’un diagramme serait utile.

entrer la description de l'image ici

Le cadre est l’endroit où les opérandes (instructions d’opération) résident et c’est là que la liaison dynamic se produit. Il s’agit d’une manière abrégée, pour ainsi dire, d’utiliser le pool constant pour suivre la classe et ses membres.

Chaque image contient une référence au pool de temps 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 image. Cette référence aide à prendre en charge la liaison dynamic.

Le code C / C ++ est généralement compilé dans un fichier object, puis plusieurs fichiers objects sont liés pour créer un artefact utilisable tel qu’un exécutable ou une DLL. Pendant la phase de liaison, les références symboliques dans chaque fichier object sont remplacées par une adresse mémoire réelle par rapport à l’exécutable final. En Java, cette phase de liaison est effectuée dynamicment à 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 vers un emplacement de mémoire physique.

Voici un lien vers les internes JVM de James Blooms pour plus de détails.

Le pool constant est une 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, méthodes et champs référencés à partir du code. Ces références sont utilisées par la JVM pour lier votre code aux autres classes dont il dépend.

Par exemple, le code suivant

 System.out.println("Hello, world!"); 

produit le bytecode suivant (sortie javap )

 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 3: ldc #3; //Ssortingng Hello, world! 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/Ssortingng;)V 

#n ici sont des références au pool constant. #2 est une référence symbolique au champ System.out , #3 est un Hello, world! ssortingng et #4 est une référence symbolique à la PrintStream.println(Ssortingng) .

Comme vous pouvez le voir, les références symboliques ne sont pas que des noms – par exemple, la référence symbolique à la méthode contient également des informations sur ses parameters ( Ljava/lang/Ssortingng; ) 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 le but de Constant Pool, en anglais simple?

Le CP est une zone mémoire dont les 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 object Ssortingng “Hello” et le compilateur se substitue aux deux lignes à la même référence. Votre fichier .class ne contient qu’une seule chaîne Hello. (La même chose pour les autres types).

Le CP est-il situé dans le fichier .Class pour chaque type?

Oui, regardez ici: http://en.wikipedia.org/wiki/Java_class_file

Laissons Exemple Premier pour comprendre ce que signifie un pool de constantes Ssortingng

  public class SsortingngConstantPool { public static void main(Ssortingng[] args) { Ssortingng s = "prasad"; Ssortingng 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 la machine virtuelle Java est appelée.

2- JVM recherchera toutes les chaînes de caractères du programme.

3- D’abord, il trouve la variable s qui fait référence au littéral «prasad» et qui sera créé dans la mémoire

4- Une référence au littéral «prasad» sera placée dans la mémoire de pool de constantes de chaîne.

5- Ensuite, il trouve une 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 se réfèrent toutes deux au même object, à savoir «prasad» .

entrer la description de l'image ici

J’espère que cela sera utile

lire plus http://www.journaldev.com/797/what-is-java-ssortingng-pool