Java >> Java tutorial >  >> JVM

En introduktion til den konstante pool i JVM

1. Introduktion

Når vi kompilerer en .java fil, får vi en separat klassefil med en .class udvidelse. .klassen fil består af flere sektioner og en konstant pulje er en af ​​dem.

I denne hurtige tutorial skal vi udforske detaljerne i en konstant pool. Vi vil også se, hvilke typer den understøtter, og hvordan den formaterer oplysningerne.

2. Konstant pool i Java

Kort sagt indeholder en konstant pulje de konstanter, der er nødvendige for at køre koden for en bestemt klasse. Dybest set er det en runtime-datastruktur, der ligner symboltabellen. Det er en runtime-repræsentation pr. klasse eller pr. interface i en Java-klassefil.

Indholdet af konstantpuljen består af symbolske referencer genereret af compileren. Disse referencer er navne på variabler, metoder, grænseflader og klasser, der refereres til fra koden. JVM'en bruger dem til at forbinde koden med andre klasser, den afhænger af.

Lad os forstå strukturen af ​​en konstant pool ved hjælp af en simpel Java-klasse:

public class ConstantPool {
    
    public void sayHello() {
        System.out.println("Hello World");
    }
}

For at se indholdet af konstantpuljen skal vi først kompilere filen og derefter køre kommandoen:

javap -v name.class

Ovenstående kommando vil give:

   #1 = Methodref          #6.#14         // java/lang/Object."<init>":()V
   #2 = Fieldref           #15.#16        // java/lang/System.out:Ljava/io/PrintStream;
   #3 = String             #17            // Hello World
   #4 = Methodref          #18.#19        // java/io/PrintStream.println:(Ljava/lang/String;)V
   #5 = Class              #20            // com/baeldung/jvm/ConstantPool
   #6 = Class              #21            // java/lang/Object
   #7 = Utf8               <init>
   #8 = Utf8               ()V
   #9 = Utf8               Code
  #10 = Utf8               LineNumberTable
  #11 = Utf8               sayHello
  #12 = Utf8               SourceFile
  #13 = Utf8               ConstantPool.java
  #14 = NameAndType        #7:#8          // "<init>":()V
  #15 = Class              #22            // java/lang/System
  #16 = NameAndType        #23:#24        // out:Ljava/io/PrintStream;
  #17 = Utf8               Hello World
  #18 = Class              #25            // java/io/PrintStream
  #19 = NameAndType        #26:#27        // println:(Ljava/lang/String;)V
  #20 = Utf8               com/baeldung/jvm/ConstantPool
  #21 = Utf8               java/lang/Object
  #22 = Utf8               java/lang/System
  #23 = Utf8               out
  #24 = Utf8               Ljava/io/PrintStream;
  #25 = Utf8               java/io/PrintStream
  #26 = Utf8               println
  #27 = Utf8               (Ljava/lang/String;)V

#n angiver referencerne til konstantpuljen. #17 er en symbolsk reference til "Hello World"-strengen , #18 er System.out , og #19 er et println. Tilsvarende, #8 fremhæver, at returmetoden er ugyldig og #20 er et fuldt kvalificeret klassenavn.

Det er vigtigt at bemærke, at den konstante pool-tabellen starter fra indeks 1. Indeksværdien 0 betragtes som et ugyldigt indeks.

2.1. Typer

Den konstante pool understøtter flere typer:

  • Heltal , Flyd :med 32-bit konstanter
  • Dobbelt , Lang :med 64-bit konstanter
  • Streng :en 16-bit strengkonstant, der peger på en anden indgang i puljen, som indeholder de faktiske bytes
  • Klasse :indeholder det fuldt kvalificerede klassenavn
  • Utf8 :en strøm af bytes
  • NameAndType :et kolonsepareret værdipar, første indgang repræsenterer navnet, mens den anden indtastning angiver typen
  • Feltref , Metoderef , InterfaceMethoderf :et prik-separeret par værdier, første værdi peger på Klasse indtastning, mens den anden værdi peger på NameAndType indgang

Hvad med de andre typer som boolesk , kort og byte ? Disse typer er repræsenteret som Heltal konstant i poolen.

2.2. Formater

Hver post i tabellen adlyder et generelt format:

cp_info {
    u1 tag;
    u1 info[];
}

Det indledende 1-byte-tag angiver typen af ​​konstant. Når en JVM griber og opsnapper mærkerne, ved den, hvad der følger efter mærket. Normalt efterfølges tagget af to eller flere bytes for at bære informationen om denne konstant.

Lad os se på nogle af typerne og deres tag-indekser:

  • Utf8 :1
  • Heltal :3
  • Flyd :4
  • Lang :5
  • Dobbelt :6
  • Klassereference:7
  • Streng reference:8

Den konstante pulje af enhver klasse eller grænseflade oprettes kun, når JVM'en har fuldført sin indlæsning.

3. Konklusion

I denne hurtige artikel lærte vi om den konstante pulje i JVM. Vi har set, at den indeholder symbolske referencer, der bruges til at lokalisere de faktiske objekter. Vi ser også på, hvordan puljen formaterer informationen om konstanter og deres typer.

Som altid kan kodestykket findes på Github.


Java tag