What is the purpose of the Java Constant Pool?

Constant pool is a part of .class file (and its in-memory representation) that contains constants needed to run the code of that class.

These constants include literals specified by the programmer and symbolic references generated by compiler. Symbolic references are basically names of classes, methods and fields referenced from the code. These references are used by the JVM to link your code to other classes it depends on.

For example, the following code

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

produces the following bytecode (javap output)

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 here are references to the constant pool. #2 is a symbolic reference to System.out field, #3 is a Hello, world! string and #4 is a symbolic reference to PrintStream.println(String) method.

As you can see, symbolic references are not just names – for example, symbolic reference to the method also contains information about its parameters (Ljava/lang/String;) and return type (V means void).

You can inspect constant pool of a class by running javap -verbose for that class.

Leave a Comment