Download Estructura de una Máquina Virtual Java (JVM) Proceso de

Document related concepts
no text concepts found
Transcript
Sesión de
laboratorio:
VisualJVM
1
2
3
4
Estructura de una
Máquina Virtual Java (JVM)
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Sesión de laboratorio: VisualJVM
Autor: Pedro Pablo Garrido Abenza
[email protected]
Estructura de una Java Virtual
Machine (JVM)
Sesión de
laboratorio:
VisualJVM
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Proceso de programación
• Primero se escribe el programa en un
lenguaje de alto nivel (código fuente).
• Este código se traduce a instrucciones
que una máquina específica puede
ejecutar (código ejecutable). Para ello
se han inventado varias estrategias:
– Ensambladores (ASM Æ Código nativo)
– Compiladores (SRC Æ Código nativo)
– Intérpretes
1
Estructura de una Java Virtual Machine (JVM)
Sesión de
laboratorio:
VisualJVM
Problema
• Durante mucho tiempo un problema
común ha sido la necesidad de poder
ejecutar un mismo programa en
diferentes plataformas (sistemas
operativos, hardware, etc.).
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
2
Lenguajes tradicionales
Hola.c
Hola.c
Compilación
Compilación
(bcc)
(bcc)
Hola.obj
Hola.obj
Enlazado
Enlazado
(link)
(link)
Hola.exe
Hola.exe
CCAPI
API
Compilación
Compilación
(gcc)
(gcc)
Hola.o
Hola.o
Enlazado
Enlazado
(ld)
(ld)
Hola
Hola
CCAPI
API
Estructura de una Java Virtual Machine (JVM)
3
Estructura de una Java Virtual Machine (JVM)
4
Sesión de
laboratorio:
VisualJVM
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Sesión de
laboratorio:
VisualJVM
Java - Una nueva idea
• La tecnología Java es:
– Un lenguaje de programación
– Un conjunto plataformas especializadas
J2EE
J2SE
1
2
3
4
J2ME
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
“Write Once, Run Anywhere”
Sesión de
laboratorio:
VisualJVM
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Compilación
Compilación
(javac)
(javac)
– En tiempo de compilación se generan
bytecodes independientes de la
plataforma.
Estructura de una Java Virtual Machine (JVM)
5
Sesión de
laboratorio:
VisualJVM
Tecnología Java
Hola.java
Hola.java
• Esto se consiguió gracias al uso de un
código intermedio: bytecodes.
– En tiempo de ejecución se ejecutan
(interpretan) los bytecodes utilizando un
programa llamado Java Virtual Machine
(JVM) sobre una plataforma específica.
• Java fué diseñado específicamente para ser:
Estructura de una Java Virtual Machine (JVM)
Java - Una nueva idea
6
Tecnología Java
• Ventajas:
Hola.class
Hola.class
bytecodes
bytecodes
1
2
3
4
Java
JavaAPI
API
(Código independiente de la plataforma: .class)
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
–
–
–
–
Multiplataforma
Código compacto: bytecodes
Aplicaciones convencionales y applets
Paradigma POO
• Inconvenientes:
JVM
JVM11
(java)
(java)
JVM
JVM22
(java)
(java)
JVM
JVM33
(java)
(java)
Plataforma
Plataforma11
Plataforma
Plataforma22
Plataforma
Plataforma33
Estructura de una Java Virtual Machine (JVM)
– Velocidad de ejecución lenta
7
Estructura de una Java Virtual Machine (JVM)
8
Sesión de
laboratorio:
VisualJVM
Sesión de
laboratorio:
VisualJVM
Tecnología Java
• Ventajas:
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
–
–
–
–
Multiplataforma
Código compacto: bytecodes
Aplicaciones convencionales y applets
Paradigma POO
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
• Inconvenientes:
– Velocidad de ejecución lenta
(interpretado)
Estructura de una Java Virtual Machine (JVM)
Sesión de
laboratorio:
VisualJVM
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Sesión de
laboratorio:
VisualJVM
• Comprender aspectos sobre la
portabilidad de los programas Java.
• Distinguir el funcionamiento de un
intérprete frente al de un compilador.
“If you don't understand interpreters, you can still write
programs; you can even be a competent programmer. But you
can't be a master” (Friedman).
• Implementar nuestra propia JVM.
• Analizar la salida de los compiladores
Java para optimizarlos.
Estructura de una Java Virtual Machine (JVM)
11
• Comparando Java con los lenguajes
tradicionales:
Prog. Java Clases Java
(bytecodes)
(bytecodes)
Programas
Máquina Virtual
(código nativo)
(bytecodes => código nativo)
Sistema Operativo
Sistema Operativo
Hardware
Hardware
Lenguajes tradicionales
Tecnología Java
Estructura de una Java Virtual Machine (JVM)
9
¿Por qué estudiar la JVM?
Tecnología Java
10
Implementaciones JVM
• Intérpretes desarrollados:
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
– Sun Microsystems
– Microsoft, Borland, IBM
– Otros: Kaffe, LaTTe, Kissme, SableVM,
Wonka, ...,VisualJVM.
• Todos deben ser compatibles:
– The Java Virtual Machine Specification
– Otras especificaciones (JNI, ...).
Estructura de una Java Virtual Machine (JVM)
12
Sesión de
laboratorio:
VisualJVM
Sesión de
laboratorio:
VisualJVM
Implementaciones JVM
Estructura de la JVM
•
Java Language Specification
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Programas Librería
Java
clases Java
Java API Specification
JVM
JVM Specification
JVM - JNI
(awt.dll, net.dll, ...)
JNI Specification
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Una JVM contiene básicamente:
1. Zona de memoria dinámica (heap)
2. Zona de métodos
3. Hilos de ejecución (threads)
Memoria dinámica
(Heap)
Sistema Operativo
Zona de métodos
Hilos (Threads)
Hardware
La torre de especificaciones
Estructura de una Java Virtual Machine (JVM)
Sesión de
laboratorio:
VisualJVM
Estructura de una Java Virtual Machine (JVM)
13
Estructura de la JVM – 1/3
Sesión de
laboratorio:
VisualJVM
1. Zona de memoria dinámica (heap):
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Objeto
Amarillo aun
vigente
Objeto
Amarillo
eliminado
–
–
Es una zona de memoria reservada por
la JVM para almacenar las instancias
de las clases (objetos) que se crean.
Periódicamente se ejecuta el algoritmo
de Garbage Collection (GC) para
liberar memoria ocupada por objetos
eliminados, y compactar huecos libres.
Heap
Heap
Estructura de la JVM – 2/3
2. Zona de métodos:
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
–
–
Es una zona de memoria utilizada para
almacenar el código de los métodos de
todas las clases Java cargadas
(bytecodes).
Zona compartida por todos los hilos.
Zona
Zonamétodos
métodos
print
Heap
Heap
factorial
exit
GC
Estructura de una Java Virtual Machine (JVM)
15
14
Estructura de una Java Virtual Machine (JVM)
public
public static
static void
void main
main
(java.lang.String[]);
(java.lang.String[]);
Code:
Code:
0:
getstatic
0:
getstatic #2;
#2;
3:
ldc
#3;
3:
ldc
#3;
5:
invokevirtual
5:
invokevirtual #4;
#4;
8:
return
8:
return
}}
16
Sesión de
laboratorio:
VisualJVM
Estructura de la JVM – 3/3
Sesión de
laboratorio:
VisualJVM
3. Elementos de un marco (Frame):
3. Hilos de ejecución (threads):
1
2
3
4
–
–
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Sólo uno estará activo en un instante.
Cada hilo contiene:
•
•
1
2
3
4
ID: un identificador único.
Stack JVM: pila de llamadas a métodos
–
–
Estructura de la JVM – 3/3
Cada elemento de la pila es un marco (Frame).
Frame Pointer (FP): puntero que señala al marco de
la cima, el marco actual.
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Zona
Zonapara
paralas
lasvariables
variableslocales;
locales;
las
lasprimeras
primerassiempre
siempreson
sonlos
los
argumentos
argumentosrecibidos
recibidospor
porelel
método.
método.
Hilo
Hilo(Thread)
(Thread)
ID:
PC
SP
FP
Frame Pointer
Marco actual
Marco 3
Marco 2
Marco 1
Marco 0
PC
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Stack JVM
Args.=1
Vars. locales=2
#0. args=...
#0. args=...
#1. n = ?
Método asociado
PC
Program Counter
FP
Frame Pointer
Sesión de
laboratorio:
VisualJVM
public
public class
class P1e
P1e {{
public
public static
static void
void main
main (String
(String args[])
args[]) {{
int
int nn == sumaNat
sumaNat (3,
(3, 4);
4);
}}
private
private int
int sumaNat
sumaNat (int
(int ini,
ini, int
int fin)
fin) {{
int
int i,
i, suma=0;
suma=0;
for
for (i=ini;
(i=ini; i<=fin;
i<=fin; i++)
i++) {{ suma+=i;
suma+=i; }}
return
return (suma);
(suma);
}}
}}
Frame 0
(main)
PC
public static void main
(String args[]) {
int n=sumaNat(3,4);
}
Estructura de una Java Virtual Machine (JVM)
1
2
3
4
Marco llamador
main (String args[]) {
...
}
18
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Llamador
19
Puntero
Punteroalalmarco
marcoque
queleleha
ha
llamado,
llamado,para
pararetornarle
retornarlevalores.
valores.
Invocaciones: args/return
Pila oper.
Null
Pila de operandos
Estructura de una Java Virtual Machine (JVM)
17
Invocaciones: args/return
FP
Vars. locales=2
#0. args
#1. ...
Código
Códigodel
delmétodo,
método,que
que
estará
estaráejecutando
ejecutandolala
instrucción
instrucciónindicada
indicadapor
porelelPC
PC
main ()
Estructura de una Java Virtual Machine (JVM)
1
2
3
4
Args.=1
#0. args
Método asociado
Program Counter
Sesión de
laboratorio:
VisualJVM
Los
Losopcodes
opcodeslalautilizan
utilizanpara
para
extraer
extraersus
susparámetros
parámetros(pop)
(pop)yy
dejar
dejarlos
losresultados
resultados(push).
(push).
Args.=1
Vars. locales=2
#0. args=...
#0. args=...
#1. n = ?
Método asociado
FP
PC
Program Counter
FP
Frame Pointer
Frame 0
(main)
public static void main
(String args[]) {
PC
int n=sumaNat(3,4);
}
Estructura de una Java Virtual Machine (JVM)
Pila oper.
3
4
Llamador
Null
20
Sesión de
laboratorio:
VisualJVM
1
2
3
4
Invocaciones: args/return
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
#0. ini = 3
#1. fin = 4
#2. i = ?
#3. suma = 0
Pila oper.
Frame 1
Frame 0
Program Counter
(main)
Frame Pointer
4
Llamador
1
2
3
4
Vars. locales=2
#0. args=...
#0. args=...
#1. n = ?
Método asociado
public static void main (String args[])
PC { int n=sumaNat(3,4); }
Llamador
FP
(sumaNat)
PC
FP
Program Counter
Frame Pointer
Args.=1
Vars. locales=2
#0. ini = 3
#1. fin = 4
#0. ini = 3
#1. fin = 4
#2. i = 5
#3. suma = 7
Pila oper.
Llamador
Frame 0
(main)
Args.=1
Vars. locales=2
#0. args=...
#0. args=...
#1. n = ?
Método asociado
public static void main (String args[])
PC { int n=sumaNat(3,4); }
Frame 1
Frame 0
Program Counter
(main)
#0. ini = 3
#1. fin = 4
#2. i = 5
#3. suma = 7
Frame Pointer
Args.=1
Vars. locales=2
#0. args=...
#0. args=...
#1. n = ?
Método asociado
public static void main (String args[])
PC { int n=sumaNat(3,4); }
Pila oper.
7
Llamador
Pila oper.
Llamador
Null
Estructura de una Java Virtual Machine (JVM)
Sesión de
laboratorio:
VisualJVM
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
7
FP
PC
Program Counter
Null
FP
22
Invocaciones: args/return
Pila oper.
Llamador
Vars. locales=2
#0. ini = 3
#1. fin = 4
private int sumaNat (int ini, int fin) {
int i, suma=0;
for (i=ini; i<=fin; i++) { suma+=i; }
PC return (suma); }
Null
private int sumaNat (int ini, int fin) {
int i, suma=0;
for (i=ini; i<=fin; i++) { suma+=i; }
PC return (suma); }
Frame 1
PC
Args.=1
Método asociado
(sumaNat)
21
Método asociado
FP
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Pila oper.
Invocaciones: args/return
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
1
2
3
4
FP
Args.=1
Estructura de una Java Virtual Machine (JVM)
Sesión de
laboratorio:
VisualJVM
Invocaciones: args/return
3
private int sumaNat (int ini, int fin) {
int i, suma=0;
PC
for (i=ini; i<=fin; i++) { suma+=i; }
return (suma); }
(sumaNat)
FP
Vars. locales=2
#0. ini = 3
#1. fin = 4
Método asociado
FP
PC
Args.=1
Sesión de
laboratorio:
VisualJVM
Frame 0
Args.=1
Vars. locales=2
#0. args=...
#0. args=...
#1. n = 7
Método asociado
(main)
public static void main (String args[])
{ int n=sumaNat(3,4); }
Frame Pointer
Pila oper.
Llamador
Null
PC
Estructura de una Java Virtual Machine (JVM)
23
Estructura de una Java Virtual Machine (JVM)
24
Sesión de
laboratorio:
VisualJVM
Sesión de
laboratorio:
VisualJVM
Clases - Procesado
• Fases para el procesado de clases Java antes
de su ejecución:
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Inicio
1
2
3
• Tareas:
1
2
3
4
Carga
Enlace
2.a Verificación
2.b Preparación
2.c Resolución
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Sesión de
laboratorio:
VisualJVM
Clases - Fase de carga
26
Clases - Fase de carga
• Estructura de una clase (.class):
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
1
2
3
4
Número
Númeromágico:
mágico:
0xCAFE
0xCAFEBABE
BABE
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
–
–
–
–
–
–
–
–
–
Versión:
Versión:
0x0000
0x00000031
0031==49.0
49.0
(J2SDK
(J2SDK1.5.0)
1.5.0)
Estructura de una Java Virtual Machine (JVM)
– Archivos .class empaquetados en los
archivos .ZIP o .JAR de Java:
Estructura de una Java Virtual Machine (JVM)
25
• Los archivos .class son archivos binarios:
1
2
3
4
• Almacenamiento de clases Java:
– Archivos .class en cualquier directorio
especificado en la variable CLASSPATH.
– Archivos .ZIP o .JAR especificados en la
variable CLASSPATH.
Final
Sesión de
laboratorio:
VisualJVM
– Búsqueda y carga de clases Java
C:\Archivos de programa\Java\jdk1.5.0\jre\lib\rt.jar
C:\WINDOWS\java\Packages\*.zip
Inicialización
Estructura de una Java Virtual Machine (JVM)
Clases - Fase de carga
27
Número mágico: 0xCAFEBABE
Versión Java: 49.0 Î J2SDK 1.5
Visibilidad: pública, privada, etc.
Nombre de la superclase
Constantpool: zona de constantes numeradas
(números, nombres de atributos y métodos,
Strings, …), utilizadas por los siguientes.
Fields: lista de campos.
Methods: lista de métodos.
Interfaces: lista de interfaces implementadas.
Attributes: información adicional.
Estructura de una Java Virtual Machine (JVM)
28
Sesión de
laboratorio:
VisualJVM
Sesión de
laboratorio:
VisualJVM
Clases - Fase de carga
• Se divide en 3 subfases:
• Lista de clases cargadas:
A
K
D
Q
1
2
3
4
NULL
– Tabla Hash de dispersión abierta:
8 cubetas
1
2
3
4
– Lista enlazada:
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
0
1
2
3
4
5
6
7
NULL
A
Q
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
NULL
NULL
K
D
NULL
NULL
NULL
NULL
NULL
Ejemplo: “A” ⇒ (65 % 8) = 1
Estructura de una Java Virtual Machine (JVM)
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Sesión de
laboratorio:
VisualJVM
Clases - Inicialización
– Ejecución de los constructores de clase
(Métodos <clinit>).
1
2
3
4
• Una vez procesada una clase
completamente, ya será posible ...
– Crear instancias de esa clase.
– Ejecutar los métodos que incluye.
Estructura de una Java Virtual Machine (JVM)
• Estática: se resuelven todas al principio (de forma
recursiva).
• Perezosa: se resuelven sólo cuando son realmente
utilizadas.
Sun
Microsoft
Estática
1398
917
Perezosa
186
58
Estructura de una Java Virtual Machine (JVM)
29
• Tareas:
1
2
3
4
– Verificación: formato correcto
– Preparación: creación de datos de clase
– Resolución de referencias simbólicas:
Resolución
Función dispersión: Σ (ASCII(nombre)) % cubetas
Sesión de
laboratorio:
VisualJVM
Clases - Fase de enlace
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
30
Repertorio de instrucciones
• Cada MV tiene su propio juego de
instrucciones, al igual que cualquier CPU.
• Tradicionalmente hay dos tipos de juegos
de instrucciones:
– Basados en pila: las instrucciones toman
los operandos de la pila de operandos Æ
Máquinas Virtuales (más sencillo).
– Basados en registros: los operandos se
toman de unos "registros" Æ CPUs.
• La JVM está basada en pila (CISC)
31
Estructura de una Java Virtual Machine (JVM)
32
Sesión de
laboratorio:
VisualJVM
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Repertorio de instrucciones
• La JVM tiene 200 opcodes: 00..FF
• A cada opcode se le asocia una
palabra fácil de recordar: mnemónico:
Sesión de
laboratorio:
VisualJVM
Repertorio de instrucciones
• Los opcodes se pueden agrupar por categorías:
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
–
–
–
–
–
–
–
Carga y almacenamiento (Load & Store),
Operaciones aritméticas,
Conversiones de tipo,
Creación y gestión de objetos,
Gestión de pila de operandos,
Control de flujo de ejecución,
Invocación a métodos y retorno.
• Código de los métodos: bytecodes. Un bytecode
consta de:
– Un código de operación (opcode): 1 byte
– Seguido de los argumentos (opcionales): 0..5 bytes
opcode
opcode
Estructura de una Java Virtual Machine (JVM)
Sesión de
laboratorio:
VisualJVM
Estructura de una Java Virtual Machine (JVM)
33
Repertorio de instrucciones
Sesión de
laboratorio:
VisualJVM
• Ejemplos – Load y Store:
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Vars. locales=2
#0. ini=3
#1. fin=4
#0. ini=3
#1. fin=4
#2. i = ?
PC
Program Counter
SP
Stack Pointer
Se compila como ...
Estructura de una Java Virtual Machine (JVM)
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Pila oper.
iload_0
istore_2
Método asociado
i = ini;
34
Repertorio de instrucciones
• Ejemplos - varios:
– La familia LOAD apila el valor de una variable
local en la cima de la pila de operandos.
– La familia STORE desapila el valor de la cima
de la pila y lo almacena en una variable local.
Args.=2
[arg1]
[arg1][arg2]
[arg2][arg3]
[arg3][arg4]
[arg4][arg5]
[arg5]
3
opcode
mnemónico
Finaliza la ejecución del método actual,
retornando al método llamador.
16
bipush 4
(0x10)
Apila en la pila de operandos el valor entero 4.
18
ldc #4
(0x12)
Apila en la pila de operandos el valor de la
constante nº 4 de la zona de constantes
(ConstantPool).
096
iadd
(0x60)
Sumar dos enteros. Los pasos son:
1.
Extraer operandos de la pila (pop)
2.
Realizar la operación (suma)
3.
Apilar el resultado en la pila (push)
Llamador
iload_0
istore_2
Operación
177
return
(0xB1)
Null
35
PC
Program Counter
SP
Stack Pointer
SP
Pila de operandos
4
3
Estructura de una Java Virtual Machine (JVM)
SP
3
SP
7
36
Sesión de
laboratorio:
VisualJVM
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
Repertorio de instrucciones
Sesión de
laboratorio:
VisualJVM
• Para obtener el código de un método
de una clase hay varias utilidades:
1
2
3
4
– javap (Java 2 SDK):
javap -c -verbose HelloWorld
– Jasper (& Jasmin):
VisualJVM
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
java -jar Jasper.jar HelloWorld
– jclasslib Bytecode Viewer
– Class Viewer for Java
– VisualJVM
Estructura de una Java Virtual Machine (JVM)
Sesión de
laboratorio:
VisualJVM
1
2
3
4
37
VisualJVM
Estructura de una Java Virtual Machine (JVM)
Ejemplo 1
//
// HelloWorld.java
HelloWorld.java
public
public class
class HelloWorld
HelloWorld {{
public
public static
static void
void main
main
(String
(String args[])
args[]) {{
System.out.println
System.out.println
("Hello
("Hello World!!");
World!!");
}}
}}
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
C:\> javap -c –verbose HelloWorld
C:\> javap -c –verbose HelloWorld
Compiled from HelloWorld.java
Compiled from HelloWorld.java
class HelloWorld extends Object{
class HelloWorld extends Object{
HelloWorld();
HelloWorld();
Code:
Code:
0:
aload_0
0:
aload_0
1:
invokespecial #1
1:
invokespecial #1
4:
return
4:
return
public
public static
static void
void main
main
(java.lang.String[]);
(java.lang.String[]);
Code:
Code:
0:
getstatic #2;
0:
getstatic #2;
3:
ldc
#3;
3:
ldc
#3;
5:
invokevirtual #4;
5:
invokevirtual #4;
8:
return
8:
return
}
}
Estructura de una Java Virtual Machine (JVM)
39
38
Constant
Constant pool:
pool:
const
#6.#15;
const ## 11 == Method
Method
#6.#15;
const
#
2
#16.#17;
const # 2 == Field
Field
#16.#17;
const
#
3
=
String
#18;
const # 3 = String
#18;
const
#
4
=
Method
#19.#20;
const # 4 = Method
#19.#20;
const
#
5
=
class
#21;
const # 5 = class
#21;
const
#
6
=
class
#22;
const # 6 = class
#22;
const
#
7
=
Asciz
<init>;
const # 7 = Asciz
<init>;
const
#
8
=
Asciz
()V;
const # 8 = Asciz
()V;
const
#
9
=
Asciz
Code;
const # 9 = Asciz
Code;
const
#10
=
Asciz
LineNumberTable;
const #10 = Asciz
LineNumberTable;
const
#11
=
Asciz
main;
const #11 = Asciz
main;
const
#12
=
Asciz
([Ljava/lang/String;)V;
const #12 = Asciz
([Ljava/lang/String;)V;
const
#13
=
Asciz
SourceFile;
const #13 = Asciz
SourceFile;
const
HelloWorld.java;
const #14
#14 == Asciz
Asciz
HelloWorld.java;
const
#15
=
NameAndType
#7:#8;
const #15 = NameAndType
#7:#8;
const
#16
=
class
#23;
const #16 = class
#23;
const
const #17
#17 == NameAndType
NameAndType #24:#25;
#24:#25;
const
#18
=
Asciz
Hello
const #18 = Asciz
Hello World!!;
World!!;
const
#26;
const #19
#19 == class
class
#26;
const
#20
=
NameAndType
#27:#28;
const #20 = NameAndType
#27:#28;
const
HelloWorld;
const #21
#21 == Asciz
Asciz
HelloWorld;
const
#22
=
Asciz
java/lang/Object;
const #22 = Asciz
java/lang/Object;
const
#23
=
Asciz
java/lang/System;
const #23 = Asciz
java/lang/System;
const
#24
=
Asciz
out;
const #24 = Asciz
out;
const
#25
=
Asciz
Ljava/io/PrintStream;;
const #25 = Asciz
Ljava/io/PrintStream;;
const
#26
=
Asciz
java/io/PrintStream;
const #26 = Asciz
java/io/PrintStream;
const
#27
=
Asciz
println;
const #27 = Asciz
println;
const
#28
=
Asciz
(Ljava/lang/String;)V;
const #28 = Asciz
(Ljava/lang/String;)V;
Estructura de una Java Virtual Machine (JVM)
40
Ejemplo 2: control de flujo
//
// Par.java
Par.java
public
public class
class Par
Par {{
public
public static
static void
void main
main
(String
(String args[])
args[]) {{
boolean
b
=
esPar(6);
boolean b = esPar(6);
}}
}}
public
public static
static boolean
boolean esPar
esPar
(int
(int n)
n) {{
if
((n
%
2)
==
0)
{
if ((n % 2) == 0) {
return
return (true);
(true);
}} else
else {{
return
(false);
return (false);
}}
Ejemplo 2: control de flujo
Constant
Constant pool:
pool:
const
#4.#15;
const ## 11 == Method
Method
#4.#15;
const
#
2
#3.#16;
const # 2 == Method
Method
#3.#16;
const
#
3
=
class
#17;
const # 3 = class
#17;
const
#
4
=
class
#18;
const # 4 = class
#18;
const
#
5
=
Asciz
<init>;
const # 5 = Asciz
<init>;
const
#
6
=
Asciz
()V;
const # 6 = Asciz
()V;
const
#
7
=
Asciz
Code;
const # 7 = Asciz
Code;
const
#
8
=
Asciz
LineNumberTable;
const # 8 = Asciz
LineNumberTable;
const
#
9
=
Asciz
main;
const # 9 = Asciz
main;
const
#10
=
Asciz
([Ljava/lang/String;)V;
const #10 = Asciz ([Ljava/lang/String;)V;
const
#11
=
Asciz
esPar;
const #11 = Asciz
esPar;
const
(I)Z;
const #12
#12 == Asciz
Asciz
(I)Z;
const
#13
=
Asciz
SourceFile;
const #13 = Asciz
SourceFile;
const
#14
=
Asciz
Par.java;
const #14 = Asciz
Par.java;
const
#15
=
NameAndType
#5:#6;
const #15 = NameAndType
#5:#6;
const
#16
=
NameAndType
#11:#12;
const #16 = NameAndType
#11:#12;
const
Par;
const #17
#17 == Asciz
Asciz
Par;
const
#18
=
Asciz
java/lang/Object;
const #18 = Asciz
java/lang/Object;
Estructura de una Java Virtual Machine (JVM)
public
public Par();
Par();
Code:
Code:
Stack=1,
Stack=1, Locals=1,
Locals=1, Args_size=1
Args_size=1
0:
aload_0
0:
aload_0
1:
invokespecial
1:
invokespecial #1;
#1;
// Method java/lang/Object."<init>":()V
// Method java/lang/Object."<init>":()V
4:
4:
public
public static
static void
void main
main
(java.lang.String[]);
(java.lang.String[]);
Code:
Code:
Stack=1,
Stack=1, Locals=2,
Locals=2, Args_size=1
Args_size=1
0:
bipush
0:
bipush 66
2:
invokestatic
#2;
2:
invokestatic #2;
//
// Method
Method esPar:(I)Z
esPar:(I)Z
5:
istore_1
5:
istore_1
6:
return
6:
return
public
public static
static boolean
boolean esPar(int);
esPar(int);
Code:
Code:
Stack=2,Locals=1,Args_size=1
Stack=2,Locals=1,Args_size=1
0:
0:
1:
1:
2:
2:
3:
3:
6:
6:
7:
7:
8:
8:
9:
9:
iload_0
iload_0
iconst_2
iconst_2
irem
irem
ifne
88
ifne
iconst_1
iconst_1
ireturn
ireturn
iconst_0
iconst_0
ireturn}
ireturn}
Estructura de una Java Virtual Machine (JVM)
42
Ejemplo 3: factorial iterativo
Constant
Constant pool:
pool:
const
#4.#15;
const ## 11 == Method
Method
#4.#15;
const
#
2
#3.#16;
const # 2 == Method
Method
#3.#16;
const
#
3
=
class
#17;
const # 3 = class
#17;
const
#
4
=
class
#18;
const # 4 = class
#18;
const
#
5
=
Asciz
<init>;
const # 5 = Asciz
<init>;
const
#
6
=
Asciz
()V;
const # 6 = Asciz
()V;
const
#
7
=
Asciz
Code;
const # 7 = Asciz
Code;
const
#
8
=
Asciz
LineNumberTable;
const # 8 = Asciz
LineNumberTable;
const
#
9
=
Asciz
main;
const # 9 = Asciz
main;
const
#10
=
Asciz
([Ljava/lang/String;)V;
const #10 = Asciz ([Ljava/lang/String;)V;
const
#11
=
Asciz
fact;
const #11 = Asciz
fact;
const
(I)I;
const #12
#12 == Asciz
Asciz
(I)I;
const
#13
=
Asciz
SourceFile;
const #13 = Asciz
SourceFile;
const
#14
=
Asciz
FactIter.java;
const #14 = Asciz
FactIter.java;
const
#15
=
NameAndType
#5:#6;
const #15 = NameAndType
#5:#6;
const
#16
=
NameAndType
#11:#12;
const #16 = NameAndType
#11:#12;
const
FactIter;
const #17
#17 == Asciz
Asciz
FactIter;
const
#18
=
Asciz
java/lang/Object;
const #18 = Asciz
java/lang/Object;
C:\>
C:\> javap
javap -c
-c –verbose
–verbose FactIter
FactIter
Compiled
Compiled from
from FactIter.java
FactIter.java
class
FactIter
extends
Object{
class FactIter extends Object{
public
public FactIter();
FactIter();
Code:
Code:
Stack=1,
Stack=1, Locals=1,
Locals=1, Args_size=1
Args_size=1
0:
aload_0
0:
aload_0
1:
invokespecial
#1;
1:
invokespecial #1;
//
// Method
Method java/lang/Object."<init>":()V
java/lang/Object."<init>":()V
4:
4:
43
return
return
public
public static
static void
void main
main
(java.lang.String[]);
(java.lang.String[]);
Code:
Code:
Stack=1,
Stack=1, Locals=2,
Locals=2, Args_size=1
Args_size=1
0:
iconst_3
0:
iconst_3
1:
invokestatic
#2;
1:
invokestatic #2;
// Method fact:(I)I
// Method fact:(I)I
4:
4:
5:
5:
Estructura de una Java Virtual Machine (JVM)
return
return
41
Ejemplo 3: factorial iterativo
//
// FactIter.java
FactIter.java
public
public class
class FactIter
FactIter {{
public
public static
static void
void main
main
(String
(String args[])
args[]) {{
int
n
=
fact(3);
int n = fact(3);
}}
public
public static
static int
int fact(int
fact(int n)
n) {{
int
int res;
res;
for
for (res=1;
(res=1; (n>=1);
(n>=1); n--)
n--) {{
res
res *=
*= n;
n;
}}
return
return (res);
(res);
}}
}}
C:\>
C:\> javap
javap -c
-c –verbose
–verbose Par
Par
Compiled
Compiled from
from Par.java
Par.java
class
class Par
Par extends
extends Object{
Object{
istore_1
istore_1
return
return
public
public static
static int
int fact
fact (int);
(int);
Code:
Code:
Stack=2,Locals=2,Args_size=1
Stack=2,Locals=2,Args_size=1
0:
0: iconst_1
iconst_1
1:
1: istore_1
istore_1
2:
2: iload_0
iload_0
3:
3: iconst_1
iconst_1
4:
4: if_icmplt
if_icmplt 17
17
7:
7: iload_1
iload_1
8:
8: iload_0
iload_0
9:
9: imul
imul
10:
10: istore_1
istore_1
11:
0,
11: iinc
iinc
0, -1
-1
14:
22
14: goto
goto
17:
17: iload_1
iload_1
18:
18: ireturn
ireturn
}}
Estructura de una Java Virtual Machine (JVM)
44
Ejemplo 4: factorial recursivo
//
// FactRecu.java
FactRecu.java
public
public class
class FactRecu
FactRecu {{
public
public static
static void
void main
main
(String
(String args[])
args[]) {{
int
n
=
fact(6);
int n = fact(6);
}}
public
public static
static int
int fact(int
fact(int n)
n) {{
if
if (n==1)
(n==1) {{
return
return (1);
(1);
}} else
else {{
return
(n*fact(n-1));
return (n*fact(n-1));
}}
}}
}}
Ejemplo 4: factorial recursivo
Constant
Constant pool:
pool:
const
#4.#15;
const ## 11 == Method
Method
#4.#15;
const
#
2
#3.#16;
const # 2 == Method
Method
#3.#16;
const
#
3
=
class
#17;
const # 3 = class
#17;
const
#
4
=
class
#18;
const # 4 = class
#18;
const
#
5
=
Asciz
<init>;
const # 5 = Asciz
<init>;
const
#
6
=
Asciz
()V;
const # 6 = Asciz
()V;
const
#
7
=
Asciz
Code;
const # 7 = Asciz
Code;
const
#
8
=
Asciz
LineNumberTable;
const # 8 = Asciz
LineNumberTable;
const
#
9
=
Asciz
main;
const # 9 = Asciz
main;
const
#10
=
Asciz
([Ljava/lang/String;)V;
const #10 = Asciz ([Ljava/lang/String;)V;
const
#11
=
Asciz
fact;
const #11 = Asciz
fact;
const
(I)I;
const #12
#12 == Asciz
Asciz
(I)I;
const
#13
=
Asciz
SourceFile;
const #13 = Asciz
SourceFile;
const
#14
=
Asciz
FactRecu.java;
const #14 = Asciz
FactRecu.java;
const
#15
=
NameAndType
#5:#6;
const #15 = NameAndType
#5:#6;
const
#16
=
NameAndType
#11:#12;
const #16 = NameAndType
#11:#12;
const
FactRecu;
const #17
#17 == Asciz
Asciz
FactRecu;
const
#18
=
Asciz
java/lang/Object;
const #18 = Asciz
java/lang/Object;
C:\>
C:\> javap
javap -c
-c –verbose
–verbose FactRecu
FactRecu
Compiled
Compiled from
from FactRecu.java
FactRecu.java
class
class FactRecu
FactRecu extends
extends Object{
Object{
public
public FactRecu();
FactRecu();
Code:
Code:
Stack=1,
Stack=1, Locals=1,
Locals=1, Args_size=1
Args_size=1
0:
aload_0
0:
aload_0
1:
invokespecial
1:
invokespecial #1;
#1;
//
// Method
Method java/lang/Object."<init>":()V
java/lang/Object."<init>":()V
4:
4:
return
return
public
public static
static void
void main
main
(java.lang.String[]);
(java.lang.String[]);
Code:
Code:
Stack=1,
Stack=1, Locals=2,
Locals=2, Args_size=1
Args_size=1
0:
bipush
0:
bipush 66
2:
invokestatic
2:
invokestatic #2;
#2;
//
// Method
Method fact:(I)I
fact:(I)I
5:
istore_1
5:
istore_1
6:
return
6:
return
public
public static
static int
int fact(int);
fact(int);
Code:
Code:
Stack=3,Locals=1,Args_size=1
Stack=3,Locals=1,Args_size=1
0:
0: iload_0
iload_0
1:
1: iconst_1
iconst_1
2:
2: if_icmpne
if_icmpne 77
5:
5: iconst_1
iconst_1
6:
6: ireturn
ireturn
7:
7: iload_0
iload_0
8:
8: iload_0
iload_0
9:
9: iconst_1
iconst_1
10:
10: isub
isub
11:
11: invokestatic
invokestatic #2;
#2;
//
// Method
Method fact:(I)I
fact:(I)I
14:
14: imul
imul
15:
15: ireturn
ireturn
}}
Estructura de una Java Virtual Machine (JVM)
Sesión de
laboratorio:
VisualJVM
1
2
3
4
Inicio
Tecn. Java
Estruct. JVM
Estruct. .class
Opcodes
Final
45
Estructura de una Java Virtual Machine (JVM)
46
Bibliografía y enlaces
• The Java API documentation
• Tim Lindholm, Frank Yellin, The JVM
Specification, Second Edition, Addison
Wesley, Java Series, April 1999.
• D. Friedman, M. Wand, and C. Haynes,
Essentials of Programming Languages, 2nd
ed. MIT Press, 2001.
• Bill Blunden, Virtual Machine Design and
Implementation in C/C++, Wordware
Publishing, March 2002
• JVM Instruction Reference (Quick refer.).
Estructura de una Java Virtual Machine (JVM)
47
Estructura de una
Máquina Virtual Java (JVM)
Sesión de laboratorio: VisualJVM
Autor: Pedro Pablo Garrido Abenza
[email protected]
Estructura de una Java Virtual
Machine (JVM)
48