2012-04-18 8 views
49

Actualmente estoy tratando de profundizar en la especificación de la Máquina Virtual de Java. He estado leyendo Inside the JVM book online y hay una abstracción confusa que no puedo entender: Constant Pool. aquí está el extracto del libro:¿Cuál es el propósito de Java Constant Pool?

Para cada tipo que carga, una máquina virtual Java debe almacenar un conjunto 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 el CP en general:

  1. ¿Está el CP ubicado en el archivo .class para cada tipo?
  2. ¿Qué quiere decir el autor con "referencia simbólica"?
  3. ¿Cuál es el propósito de Constant Pool, en inglés simple?

Respuesta

51

Creo que entender cómo se construye el marco usando un diagrama ayudaría.

enter image description here

El marco es donde los operandos (instrucciones de operación) residen y que es 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 conjunto de la 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++ se compila típicamente en un archivo de objeto y luego se vinculan varios archivos de objeto para generar 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.

+0

"Cuando se compila una clase Java ..."? ¿No es un archivo .class un código Java compilado? –

+1

Sí, un archivo .java se convierte en un archivo .class cuando se compila. –

+0

el enlace está roto –

6

¿Cuál es el propósito de Constant Pool, en inglés simple?

El CP es un área de memoria de valores constantes muy singulares son almacenados para reducir la redundancia:

System.err.println("Hello"); 
System.out.println("Hello"); 

En el CP sólo hay sustitutos uno de Cuerda objeto "Hola" y el compilador de ambas líneas a la misma referencia. Su archivo .class solo contiene una cadena Hello. (Lo mismo para otros tipos).

¿Está el CP ubicado en el archivo .Class para cada tipo?

Sí, mira aquí: http://en.wikipedia.org/wiki/Java_class_file

+0

¿Quieres que ampliar un poco más en los enlaces simbólicos tal vez? Creo que estas son las partes más importantes de CP – Bober02

63

piscina constante es una parte de .class archivo (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 código siguiente

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

produce el siguiente código de bytes (javap salida)

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í son referencias a la piscina constante. #2 es una referencia simbólica al campo System.out, #3 es una cadena Hello, world! y #4 es una referencia simbólica al método PrintStream.println(String).

Como se puede ver, las referencias simbólicas no son sólo 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.

+0

@ axtavt- wow! buena explicación. parece un pequeño error tipográfico cerca de "# 3 es una referencia simbólica a PrintStream ..." no debería ser # 4 –

+0

@mashit: Sí, corregido. – axtavt

+0

Pero, ¿qué significa "L" en "Ljava/lang/String"? ? – JackWM

1

Vamos a dar el Ejemplo Primero para entender lo que significa serie de conjunto de constantes

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 

lo que sucede aquí paso a paso

1- El la clase se carga cuando se invoca JVM.

2- JVM buscará todos los literales de cadena en el programa.

3- primer lugar, se encuentra el variable de s que se refiere al literal “Prasad” y se creará en la memoria

4- Una referencia para el literal “Prasad” se colocará en la memoria de grupo constante de cadena.

5- A continuación, se encuentra otra variables s2 que se refería a la misma cadena literal “Prasad”.

Ahora que JVM ya ha encontrado una cadena literal “Prasad”, tanto los las variables s y s2 Wil se refieren al mismo objeto, es decir “Prasad”.

enter image description here

espero que esto sea útil

leer más http://www.journaldev.com/797/what-is-java-string-pool

+2

No existe el "conjunto constante de cadenas". Existe un "grupo constante" que existe en cada archivo de clase y existe un "conjunto de cadenas" de cadenas internas que existen para JVM. – Keenle

+0

sí, aquí quise decir String pool, gracias por tu comentario –

Cuestiones relacionadas