¿Cuál es el propósito de Java Constant Pool?
vm-implementation class-constants (4)
¿Cuál es el propósito de Constant Pool, en inglés simple?
El CP es un área de memoria con valores constantes únicos que se almacenan para reducir la redundancia:
System.err.println("Hello");
System.out.println("Hello");
En el CP solo hay un objeto String "Hello" y el compilador sustituye en ambas líneas a la misma referencia. Su archivo .class solo contiene una cadena Hello. (Lo mismo para otros tipos).
¿Está CP ubicado en el archivo .Class para cada tipo?
Sí, mira aquí: http://en.wikipedia.org/wiki/Java_class_file
Actualmente estoy tratando de profundizar en la especificación de la Máquina Virtual de Java. He estado leyendo el libro de Inside the JVM en línea y hay una abstracción confusa que parece que no entiendo: Constant Pool. aquí está el extracto del libro:
Para cada tipo que se carga, una máquina virtual Java debe almacenar un grupo constante. Un conjunto constante es un conjunto ordenado de constantes utilizadas por el tipo, que incluye literales (cadena, entero y constantes de coma flotante) y referencias simbólicas a tipos, campos y métodos. Las entradas en el grupo constante se referencian por índice, al igual que los elementos de un conjunto. Debido a que contiene referencias simbólicas a todos los tipos, campos y métodos utilizados por un tipo, el conjunto constante desempeña un papel central en la vinculación dinámica de los programas Java
Tengo varias preguntas sobre lo anterior y CP en general:
- ¿El CP se encuentra en el archivo
.class
para cada tipo? - ¿Qué quiere decir el autor con "referencia simbólica"?
- ¿Cuál es el propósito de Constant Pool, en inglés simple?
Creo que sería útil comprender cómo se construye el marco usando un diagrama.
El marco es donde residen los operandos (instrucciones de operación) y es allí donde se produce la vinculación dinámica. Es una forma abreviada, por así decirlo, utilizando el grupo constante para realizar un seguimiento de la clase y sus miembros.
Cada cuadro contiene una referencia al grupo de constante de tiempo de ejecución. La referencia apunta al grupo constante para la clase del método que se está ejecutando para ese marco. Esta referencia ayuda a admitir enlaces dinámicos.
El código C / C ++ normalmente se compila en un archivo de objetos y luego se unen múltiples archivos de objetos para producir un artefacto utilizable, como un archivo ejecutable o dll. Durante la fase de enlace, las referencias simbólicas en cada archivo de objeto se reemplazan por una dirección de memoria real relativa al ejecutable final. En Java, esta fase de enlace se realiza dinámicamente en tiempo de ejecución.
Cuando se compila un archivo Java, todas las referencias a variables y métodos se almacenan en el conjunto constante de la clase como referencia simbólica. Una referencia simbólica es una referencia lógica, no una referencia que apunta a una ubicación de memoria física.
Aquí hay un enlace a James Blooms JVM Internals para más detalles.
Dejemos que Example First entienda qué significa el conjunto constante de cadenas
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 salida será
true
true
qué pasa aquí paso a paso
1- La clase se carga cuando se invoca JVM.
2- JVM buscará todos los literales de cadena en el programa.
3- Primero, encuentra la variable s que se refiere al literal "prasad" y se creará en la memoria
4- Se colocará una referencia para el literal "prasad" en la memoria de grupo de constante de cadena.
5- Luego encuentra otra variable s2 que se refiere a la misma cadena literal "prasad" .
Ahora que JVM ya ha encontrado una cadena literal "prasad" , ambas variables, s y s2, se referirán al mismo objeto, es decir, "prasad" .
Espero que esto sea útil
leer más http://www.journaldev.com/797/what-is-java-string-pool
El grupo constante es una parte del archivo .class
(y su representación en memoria) que contiene las constantes necesarias para ejecutar el código de esa clase.
Estas constantes incluyen literales especificados por el programador y referencias simbólicas generadas por el compilador. Las referencias simbólicas son básicamente nombres de clases, métodos y campos a los que se hace referencia desde el código. Estas referencias son utilizadas por la JVM para vincular su código a otras clases de las que depende.
Por ejemplo, el siguiente código
System.out.println("Hello, world!");
produce el siguiente bytecode (salida javap
)
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
aquí hay referencias al grupo constante. #2
es una referencia simbólica al campo System.out
, #3
es un Hello, world!
string y #4
es una referencia simbólica al PrintStream.println(String)
.
Como puede ver, las referencias simbólicas no son solo nombres; por ejemplo, la referencia simbólica al método también contiene información sobre sus parámetros ( Ljava/lang/String;
) y el tipo de retorno ( V
significa void
).
Puede inspeccionar el grupo constante de una clase ejecutando javap -verbose
para esa clase.