Está en la página 1de 12

Sesión de

laboratorio:
VisualJVM
Proceso de programación
• Primero se escribe el programa en un
Inicio lenguaje de alto nivel (código fuente).
1 Tecn. Java
Estructura de una 2 Estruct. JVM • Este código se traduce a instrucciones
3 Estruct. .class
Máquina Virtual Java (JVM) 4 Opcodes
que una máquina específica puede
Final ejecutar (código ejecutable). Para ello
Sesión de laboratorio: VisualJVM se han inventado varias estrategias:
– Ensambladores (ASM Æ Código nativo)
Autor: Pedro Pablo Garrido Abenza
– Compiladores (SRC Æ Código nativo)
pgarrido@umh.es
– Intérpretes
Estructura de una Java Virtual
Machine (JVM)
1 Estructura de una Java Virtual Machine (JVM) 2

Sesión de Sesión de
laboratorio:
VisualJVM
Problema laboratorio:
VisualJVM
Lenguajes tradicionales
• Durante mucho tiempo un problema
Hola.c Compilación
Compilación Hola.obj Enlazado
Enlazado Hola.exe
Inicio común ha sido la necesidad de poder Inicio
Hola.c (bcc)
(bcc)
Hola.obj (link)
(link)
Hola.exe

1 Tecn. Java 1 Tecn. Java


2 Estruct. JVM
ejecutar un mismo programa en 2 Estruct. JVM
3 Estruct. .class diferentes plataformas (sistemas 3 Estruct. .class
CCAPI
4 Opcodes 4 Opcodes API
Final operativos, hardware, etc.). Final

Compilación
Compilación Hola.o Enlazado
Enlazado Hola
(gcc) Hola.o (ld) Hola
(gcc) (ld)

CCAPI
API

Estructura de una Java Virtual Machine (JVM) 3 Estructura de una Java Virtual Machine (JVM) 4
Sesión de Sesión de
laboratorio:
VisualJVM
Java - Una nueva idea laboratorio:
VisualJVM
Java - Una nueva idea
• La tecnología Java es: • Esto se consiguió gracias al uso de un
– Un lenguaje de programación código intermedio: bytecodes.
Inicio Inicio
1 Tecn. Java 1 Tecn. Java
2 Estruct. JVM
– Un conjunto plataformas especializadas 2 Estruct. JVM
3 Estruct. .class 3 Estruct. .class
– En tiempo de compilación se generan
4 Opcodes 4 Opcodes bytecodes independientes de la
Final Final plataforma.
J2EE J2SE J2ME

– En tiempo de ejecución se ejecutan


(interpretan) los bytecodes utilizando un
• Java fué diseñado específicamente para ser: programa llamado Java Virtual Machine
(JVM) sobre una plataforma específica.
“Write Once, Run Anywhere”

Estructura de una Java Virtual Machine (JVM) 5 Estructura de una Java Virtual Machine (JVM) 6

Sesión de Sesión de
laboratorio:
VisualJVM
Tecnología Java laboratorio:
VisualJVM
Tecnología Java
Hola.class
• Ventajas:
Hola.java Compilación
Compilación Hola.class
Hola.java
Inicio (javac)
(javac)
bytecodes
bytecodes Inicio – Multiplataforma
1 Tecn. Java 1 Tecn. Java
2 Estruct. JVM 2 Estruct. JVM – Código compacto: bytecodes
3 Estruct. .class 3 Estruct. .class
4 Opcodes
Java
JavaAPI
API 4 Opcodes
– Aplicaciones convencionales y applets
Final Final
– Paradigma POO
(Código independiente de la plataforma: .class)
• Inconvenientes:
JVM JVM JVM
JVM11
(java)
JVM22
(java)
JVM33
(java)
– Velocidad de ejecución lenta
(java) (java) (java)

Plataforma
Plataforma11 Plataforma
Plataforma22 Plataforma
Plataforma33
Estructura de una Java Virtual Machine (JVM) 7 Estructura de una Java Virtual Machine (JVM) 8
Sesión de Sesión de
laboratorio:
VisualJVM
Tecnología Java laboratorio:
VisualJVM
Tecnología Java
• Ventajas: • Comparando Java con los lenguajes
Inicio – Multiplataforma Inicio tradicionales:
1 Tecn. Java 1 Tecn. Java
2 Estruct. JVM – Código compacto: bytecodes 2 Estruct. JVM Prog. Java Clases Java
3 Estruct. .class 3 Estruct. .class (bytecodes) (bytecodes)
– Aplicaciones convencionales y applets
4 Opcodes 4 Opcodes Programas Máquina Virtual
Final
– Paradigma POO Final (código nativo) (bytecodes => código nativo)

• Inconvenientes: Sistema Operativo Sistema Operativo


– Velocidad de ejecución lenta Hardware Hardware
(interpretado)
Lenguajes tradicionales Tecnología Java

Estructura de una Java Virtual Machine (JVM) 9 Estructura de una Java Virtual Machine (JVM) 10

Sesión de Sesión de
laboratorio:
VisualJVM
¿Por qué estudiar la JVM? laboratorio:
VisualJVM
Implementaciones JVM
• Comprender aspectos sobre la • Intérpretes desarrollados:
Inicio portabilidad de los programas Java. Inicio – Sun Microsystems
1 Tecn. Java 1 Tecn. Java
2 Estruct. JVM • Distinguir el funcionamiento de un 2 Estruct. JVM – Microsoft, Borland, IBM
3 Estruct. .class 3 Estruct. .class
4 Opcodes
intérprete frente al de un compilador. 4 Opcodes
– Otros: Kaffe, LaTTe, Kissme, SableVM,
Final “If you don't understand interpreters, you can still write Final Wonka, ...,VisualJVM.
programs; you can even be a competent programmer. But you
can't be a master” (Friedman). • Todos deben ser compatibles:
• Implementar nuestra propia JVM. – The Java Virtual Machine Specification
• Analizar la salida de los compiladores – Otras especificaciones (JNI, ...).
Java para optimizarlos.

Estructura de una Java Virtual Machine (JVM) 11 Estructura de una Java Virtual Machine (JVM) 12
Sesión de Sesión de
laboratorio:
VisualJVM
Implementaciones JVM laboratorio:
VisualJVM
Estructura de la JVM
• Una JVM contiene básicamente:
Java Language Specification
Inicio Inicio 1. Zona de memoria dinámica (heap)
1 Tecn. Java Programas Librería 1 Tecn. Java
2 Estruct. JVM
Java clases Java Java API Specification 2 Estruct. JVM 2. Zona de métodos
3 Estruct. .class 3 Estruct. .class
3. Hilos de ejecución (threads)
4 Opcodes JVM JVM Specification
4 Opcodes
Final Final
JVM - JNI Memoria dinámica
(awt.dll, net.dll, ...) JNI Specification (Heap)

Sistema Operativo
Zona de métodos
Hilos (Threads)
Hardware

La torre de especificaciones

Estructura de una Java Virtual Machine (JVM) 13 Estructura de una Java Virtual Machine (JVM) 14

Sesión de Sesión de
laboratorio:
VisualJVM
Estructura de la JVM – 1/3 laboratorio:
VisualJVM
Estructura de la JVM – 2/3
1. Zona de memoria dinámica (heap): 2. Zona de métodos:
Inicio – Es una zona de memoria reservada por Inicio – Es una zona de memoria utilizada para
1 Tecn. Java 1 Tecn. Java
2 Estruct. JVM
la JVM para almacenar las instancias 2 Estruct. JVM
almacenar el código de los métodos de
3 Estruct. .class de las clases (objetos) que se crean. 3 Estruct. .class todas las clases Java cargadas
4 Opcodes 4 Opcodes
Final – Periódicamente se ejecuta el algoritmo Final
(bytecodes).
de Garbage Collection (GC) para – Zona compartida por todos los hilos.
liberar memoria ocupada por objetos
Zona
Zonamétodos
métodos
Objeto
eliminados, y compactar huecos libres. print
public
public static
static void
void main
main
(java.lang.String[]);
(java.lang.String[]);
Code:
Amarillo aun Heap Code:
Heap Heap
Heap 0:
0: getstatic
getstatic #2;
#2;
vigente 3: ldc #3;
factorial exit 3: ldc #3;
5:
5: invokevirtual
invokevirtual #4;
#4;
GC 8: return
8: return
Objeto }}
Amarillo
eliminado

Estructura de una Java Virtual Machine (JVM) 15 Estructura de una Java Virtual Machine (JVM) 16
Sesión de Sesión de
laboratorio:
VisualJVM
Estructura de la JVM – 3/3 laboratorio:
VisualJVM
Estructura de la JVM – 3/3
3. Hilos de ejecución (threads): 3. Elementos de un marco (Frame):
Inicio – Sólo uno estará activo en un instante. Inicio Zona
Zonapara
paralas
lasvariables
variableslocales;
locales; Los
Losopcodes
opcodeslalautilizan
utilizanpara
para
las
lasprimeras
primerassiempre
siempreson
sonlos
los extraer
1 Tecn. Java – Cada hilo contiene: 1 Tecn. Java
argumentos extraersus
susparámetros
parámetros(pop)
(pop)yy
2 Estruct. JVM 2 Estruct. JVM argumentosrecibidos
recibidospor
porelel dejar
dejarlos
losresultados
resultados(push).
(push).
3 Estruct. .class
• ID: un identificador único. 3 Estruct. .class
método.
método.
4 Opcodes • Stack JVM: pila de llamadas a métodos 4 Opcodes Args.=1 Vars. locales=2 Pila de operandos
Final – Cada elemento de la pila es un marco (Frame). Final
– Frame Pointer (FP): puntero que señala al marco de #0. args #0. args
la cima, el marco actual. #1. ...
Hilo
Hilo(Thread)
(Thread) Método asociado Marco llamador
main (String args[]) {
ID: Marco actual
FP ...
Marco 3 PC

Marco 2 }
Marco 1 Código
PC Program Counter Códigodeldelmétodo,
método,que
que
Marco 0 main () estará Puntero
Punteroalalmarco
marcoquequeleleha
estaráejecutando
ejecutandolala ha
Frame Pointer instrucción llamado,
llamado,para
pararetornarle
retornarlevalores.
SP Stack JVM
instrucciónindicada
indicadapor
porelelPC
PC valores.
Estructura de una Java Virtual Machine (JVM) 17 Estructura de una Java Virtual Machine (JVM) 18

Sesión de Sesión de
laboratorio:
VisualJVM
Invocaciones: args/return laboratorio:
VisualJVM
Invocaciones: args/return
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);
}}
Inicio private
private int
int sumaNat
sumaNat (int
(int ini,
ini, int
int fin)
fin) {{ Inicio
1 Tecn. Java int
int i,
i, suma=0;
suma=0; 1 Tecn. Java
for
for (i=ini;
(i=ini; i<=fin;
i<=fin; i++)
i++) {{ suma+=i;
suma+=i; }}
2 Estruct. JVM return 2 Estruct. JVM
return (suma);
(suma);
3 Estruct. .class }} 3 Estruct. .class
4 Opcodes }} 4 Opcodes
Final Final

Args.=1 Vars. locales=2 Pila oper. Args.=1 Vars. locales=2 Pila oper.
#0. args=... #0. args=... #0. args=... #0. args=... 3
#1. n = ? #1. n = ? 4

Método asociado Llamador Método asociado Llamador


FP FP
Frame 0 PC public static void main Null Frame 0 public static void main Null
PC Program Counter (String args[]) { PC Program Counter (String args[]) {
(main) (main)
int n=sumaNat(3,4); PC int n=sumaNat(3,4);
FP Frame Pointer } FP Frame Pointer }
Estructura de una Java Virtual Machine (JVM) 19 Estructura de una Java Virtual Machine (JVM) 20
Sesión de Sesión de
laboratorio:
VisualJVM
Invocaciones: args/return laboratorio:
VisualJVM
Invocaciones: args/return
Args.=1 Vars. locales=2 Pila oper. Args.=1 Vars. locales=2 Pila oper.
#0. ini = 3 #0. ini = 3 #0. ini = 3 #0. ini = 3
3
#1. fin = 4 #1. fin = 4 #1. fin = 4 #1. fin = 4
Inicio 4 Inicio 7
#2. i = ? #2. i = 5
1 Tecn. Java 1 Tecn. Java
2 Estruct. JVM #3. suma = 0 2 Estruct. JVM #3. suma = 7
3 Estruct. .class Método asociado Llamador 3 Estruct. .class Método asociado Llamador
4 Opcodes private int sumaNat (int ini, int fin) { 4 Opcodes private int sumaNat (int ini, int fin) {
Final PC int i, suma=0; Final int i, suma=0;
for (i=ini; i<=fin; i++) { suma+=i; } for (i=ini; i<=fin; i++) { suma+=i; }
return (suma); } PC return (suma); }

FP FP
Frame 1 Args.=1 Vars. locales=2 Pila oper. Frame 1 Args.=1 Vars. locales=2 Pila oper.
(sumaNat) (sumaNat)
#0. args=... #0. args=... #0. args=... #0. args=...
#1. n = ? #1. n = ?
Frame 0 Método asociado Llamador Frame 0 Método asociado Llamador
PC Program Counter PC Program Counter
(main) (main)
public static void main (String args[]) Null public static void main (String args[]) Null
FP Frame Pointer FP Frame Pointer
PC { int n=sumaNat(3,4); } PC { int n=sumaNat(3,4); }

Estructura de una Java Virtual Machine (JVM) 21 Estructura de una Java Virtual Machine (JVM) 22

Sesión de Sesión de
laboratorio:
VisualJVM
Invocaciones: args/return laboratorio:
VisualJVM
Invocaciones: args/return
Args.=1 Vars. locales=2 Pila oper.
#0. ini = 3 #0. ini = 3
#1. fin = 4 #1. fin = 4
Inicio Inicio
#2. i = 5
1 Tecn. Java 1 Tecn. Java
2 Estruct. JVM #3. suma = 7 2 Estruct. JVM
3 Estruct. .class Método asociado Llamador 3 Estruct. .class
4 Opcodes private int sumaNat (int ini, int fin) { 4 Opcodes
Final int i, suma=0; Final
for (i=ini; i<=fin; i++) { suma+=i; }
PC return (suma); }

FP
Frame 1 Args.=1 Vars. locales=2 Pila oper. Args.=1 Vars. locales=2 Pila oper.
(sumaNat)
#0. args=... #0. args=... #0. args=... #0. args=...
#1. n = ? 7 #1. n = 7
Frame 0 Método asociado Llamador FP Frame 0 Método asociado Llamador
PC Program Counter PC Program Counter
(main) (main)
public static void main (String args[]) Null public static void main (String args[]) Null
FP Frame Pointer FP Frame Pointer
PC { int n=sumaNat(3,4); } { int n=sumaNat(3,4); }
PC
Estructura de una Java Virtual Machine (JVM) 23 Estructura de una Java Virtual Machine (JVM) 24
Sesión de Sesión de
laboratorio:
VisualJVM
Clases - Procesado laboratorio:
VisualJVM
Clases - Fase de carga
• Fases para el procesado de clases Java antes • Tareas:
de su ejecución:
Inicio Inicio – Búsqueda y carga de clases Java
1 Tecn. Java Inicio 1 Tecn. Java
2 Estruct. JVM 2 Estruct. JVM • Almacenamiento de clases Java:
3 Estruct. .class 1 Carga 3 Estruct. .class
4 Opcodes 4 Opcodes – Archivos .class empaquetados en los
2 Enlace
Final Final archivos .ZIP o .JAR de Java:
2.a Verificación C:\Archivos de programa\Java\jdk1.5.0\jre\lib\rt.jar
2.b Preparación C:\WINDOWS\java\Packages\*.zip

2.c Resolución – Archivos .class en cualquier directorio


3 Inicialización especificado en la variable CLASSPATH.
Final
– Archivos .ZIP o .JAR especificados en la
variable CLASSPATH.
Estructura de una Java Virtual Machine (JVM) 25 Estructura de una Java Virtual Machine (JVM) 26

Sesión de Sesión de
laboratorio:
VisualJVM
Clases - Fase de carga laboratorio:
VisualJVM
Clases - Fase de carga
• Los archivos .class son archivos binarios: • Estructura de una clase (.class):
– Número mágico: 0xCAFEBABE
Inicio Inicio
1 Tecn. Java 1 Tecn. Java – Versión Java: 49.0 Î J2SDK 1.5
2 Estruct. JVM 2 Estruct. JVM – Visibilidad: pública, privada, etc.
3 Estruct. .class 3 Estruct. .class
4 Opcodes 4 Opcodes
– Nombre de la superclase
Final Final – Constantpool: zona de constantes numeradas
(números, nombres de atributos y métodos,
Número
Númeromágico:
mágico:
0xCAFE
Strings, …), utilizadas por los siguientes.
0xCAFEBABE
BABE
– Fields: lista de campos.
Versión:
Versión: – Methods: lista de métodos.
0x0000
0x00000031
0031==49.0
49.0 – Interfaces: lista de interfaces implementadas.
(J2SDK
(J2SDK1.5.0)
1.5.0)
– Attributes: información adicional.

Estructura de una Java Virtual Machine (JVM) 27 Estructura de una Java Virtual Machine (JVM) 28
Sesión de Sesión de
laboratorio:
VisualJVM
Clases - Fase de carga laboratorio:
VisualJVM
Clases - Fase de enlace
• Lista de clases cargadas: • Se divide en 3 subfases:
Inicio – Lista enlazada: Inicio
– Verificación: formato correcto
1 Tecn. Java
A K D Q NULL
1 Tecn. Java – Preparación: creación de datos de clase
2 Estruct. JVM 2 Estruct. JVM
3 Estruct. .class 3 Estruct. .class
– Resolución de referencias simbólicas:
4 Opcodes – Tabla Hash de dispersión abierta: 4 Opcodes • Estática: se resuelven todas al principio (de forma
Final 0 NULL Final recursiva).
1 A Q NULL
8 cubetas

• Perezosa: se resuelven sólo cuando son realmente


2 NULL
3 K NULL utilizadas.
4 D NULL
5 NULL
6 NULL Resolución Sun Microsoft
7 NULL

Función dispersión: Σ (ASCII(nombre)) % cubetas


Estática 1398 917
Ejemplo: “A” ⇒ (65 % 8) = 1 Perezosa 186 58
Estructura de una Java Virtual Machine (JVM) 29 Estructura de una Java Virtual Machine (JVM) 30

Sesión de Sesión de
laboratorio:
VisualJVM
Clases - Inicialización laboratorio:
VisualJVM
Repertorio de instrucciones
• Tareas: • Cada MV tiene su propio juego de
Inicio – Ejecución de los constructores de clase Inicio
instrucciones, al igual que cualquier CPU.
1 Tecn. Java
(Métodos <clinit>). 1 Tecn. Java • Tradicionalmente hay dos tipos de juegos
2 Estruct. JVM 2 Estruct. JVM
3 Estruct. .class 3 Estruct. .class de instrucciones:
4 Opcodes 4 Opcodes
Final Final
– Basados en pila: las instrucciones toman
los operandos de la pila de operandos Æ
• Una vez procesada una clase Máquinas Virtuales (más sencillo).
completamente, ya será posible ... – Basados en registros: los operandos se
– Crear instancias de esa clase. toman de unos "registros" Æ CPUs.
– Ejecutar los métodos que incluye. • La JVM está basada en pila (CISC)

Estructura de una Java Virtual Machine (JVM) 31 Estructura de una Java Virtual Machine (JVM) 32
Sesión de Sesión de
laboratorio:
VisualJVM
Repertorio de instrucciones laboratorio:
VisualJVM
Repertorio de instrucciones
• La JVM tiene 200 opcodes: 00..FF • Los opcodes se pueden agrupar por categorías:
– Carga y almacenamiento (Load & Store),
Inicio • A cada opcode se le asocia una Inicio – Operaciones aritméticas,
1 Tecn. Java 1 Tecn. Java – Conversiones de tipo,
2 Estruct. JVM palabra fácil de recordar: mnemónico: 2 Estruct. JVM
– Creación y gestión de objetos,
3 Estruct. .class 3 Estruct. .class
4 Opcodes 4 Opcodes
– Gestión de pila de operandos,
Final Final – 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 [arg1]
[arg1][arg2]
[arg2][arg3]
[arg3][arg4]
[arg4][arg5]
[arg5]
Estructura de una Java Virtual Machine (JVM) 33 Estructura de una Java Virtual Machine (JVM) 34

Sesión de Sesión de
laboratorio:
VisualJVM
Repertorio de instrucciones laboratorio:
VisualJVM
Repertorio de instrucciones
• Ejemplos – Load y Store: • Ejemplos - varios:
Inicio
– La familia LOAD apila el valor de una variable Inicio
opcode mnemónico Operación

local en la cima de la pila de operandos. 177 return Finaliza la ejecución del método actual,
1 Tecn. Java 1 Tecn. Java
(0xB1) retornando al método llamador.
2 Estruct. JVM 2 Estruct. JVM
– La familia STORE desapila el valor de la cima 16 bipush 4 Apila en la pila de operandos el valor entero 4.
3 Estruct. .class 3 Estruct. .class
4 Opcodes
de la pila y lo almacena en una variable local. 4 Opcodes
(0x10)
18 ldc #4 Apila en la pila de operandos el valor de la
Final Final
(0x12) constante nº 4 de la zona de constantes
Args.=2 Vars. locales=2 Pila oper. (ConstantPool).
#0. ini=3 #0. ini=3 iload_0
096 iadd Sumar dos enteros. Los pasos son:
#1. fin=4 #1. fin=4 (0x60) 1. Extraer operandos de la pila (pop)
istore_2 3
#2. i = ? 2. Realizar la operación (suma)
Método asociado Llamador 3. Apilar el resultado en la pila (push)
i = ini; Se compila como ... iload_0 Null
PC Program Counter istore_2 PC Program Counter SP
4
SP Stack Pointer SP Stack Pointer Pila de operandos 3 SP 3 SP 7

Estructura de una Java Virtual Machine (JVM) 35 Estructura de una Java Virtual Machine (JVM) 36
Sesión de Sesión de
laboratorio:
VisualJVM
Repertorio de instrucciones laboratorio:
VisualJVM
VisualJVM
• Para obtener el código de un método
Inicio de una clase hay varias utilidades: Inicio
1 Tecn. Java 1 Tecn. Java
2 Estruct. JVM – javap (Java 2 SDK): 2 Estruct. JVM
3 Estruct. .class javap -c -verbose HelloWorld 3 Estruct. .class
4 Opcodes 4 Opcodes
Final – Jasper (& Jasmin): Final
java -jar Jasper.jar HelloWorld

– jclasslib Bytecode Viewer


– Class Viewer for Java
– VisualJVM

Estructura de una Java Virtual Machine (JVM) 37 Estructura de una Java Virtual Machine (JVM) 38

Sesión de Constant
Constant pool:
pool:
laboratorio:
VisualJVM
VisualJVM Ejemplo 1 const
const ## 11 == Method
const
const #
2
3 =
Method
const # 2 == Field
# Field
String
#6.#15;
#6.#15;
#16.#17;
#16.#17;
#18;
const # 3 = String #18;
// const # 4 = Method #19.#20;
// HelloWorld.java
HelloWorld.java const # 4 = Method #19.#20;
public const # 5 = class #21;
public class
class HelloWorld
HelloWorld {{ const # 5 = class #21;
public const # 6 = class #22;
public static
static void
void main
main const # 6 = class #22;
(String const # 7 = Asciz <init>;
(String args[])
args[]) {{ const # 7 = Asciz <init>;
Inicio System.out.println
System.out.println
const # 8 = Asciz
const # 8 = Asciz ()V;
()V;
("Hello const # 9 = Asciz Code;
1 Tecn. Java ("Hello World!!");
World!!"); const # 9 = Asciz Code;
}} const #10 = Asciz
const #10 = Asciz LineNumberTable;
LineNumberTable;
2 Estruct. JVM }} const #11 = Asciz main;
const #11 = Asciz main;
3 Estruct. .class const #12 = Asciz
const #12 = Asciz ([Ljava/lang/String;)V;
([Ljava/lang/String;)V;
const #13 = Asciz SourceFile;
4 Opcodes C:\> javap -c –verbose HelloWorld
C:\> javap -c –verbose HelloWorld const #13 = Asciz SourceFile;
Compiled from HelloWorld.java const
const #14
#14 == Asciz
Asciz HelloWorld.java;
HelloWorld.java;
Final Compiled from HelloWorld.java
class HelloWorld extends Object{
class HelloWorld extends Object{
const #15 = NameAndType
const #15 = NameAndType #7:#8;
#7:#8;
const #16 = class
const #16 = class #23;
#23;
HelloWorld(); const
HelloWorld();
Code: const #17
#17 == NameAndType
NameAndType #24:#25;
#24:#25;
Code: const #18 = Asciz
const #18 = Asciz Hello
Hello World!!;
World!!;
0: aload_0
0: aload_0 const
1:
1:
invokespecial #1
invokespecial #1 const #19
#19 == class
class #26;
#26;
4: return const #20 = NameAndType
const #20 = NameAndType #27:#28;
#27:#28;
4: return
const
const #21
#21 == Asciz
Asciz HelloWorld;
HelloWorld;
public
public static
static void
void main
main const #22 = Asciz
const #22 = Asciz java/lang/Object;
java/lang/Object;
(java.lang.String[]); const #23 = Asciz java/lang/System;
(java.lang.String[]); const #23 = Asciz java/lang/System;
Code:
Code: const #24 = Asciz
const #24 = Asciz out;
out;
0: getstatic #2;
0: getstatic #2; const #25 = Asciz Ljava/io/PrintStream;;
3:
3:
ldc
ldc
#3;
#3; const #25 = Asciz Ljava/io/PrintStream;;
5: invokevirtual #4; const #26 = Asciz
const #26 = Asciz java/io/PrintStream;
java/io/PrintStream;
5: invokevirtual #4;
8:
8:
return
return
const #27 = Asciz
const #27 = Asciz println;
println;
} const #28 = Asciz (Ljava/lang/String;)V;
} const #28 = Asciz (Ljava/lang/String;)V;
Estructura de una Java Virtual Machine (JVM) 39 Estructura de una Java Virtual Machine (JVM) 40
Ejemplo 2: control de flujo Ejemplo 2: control de flujo
Constant
Constant pool:
pool:
// C:\>
C:\> javap
javap -c
-c –verbose
–verbose Par
// Par.java
Par.java const
const ## 11 == Method
Method #4.#15;
#4.#15; Par public
public static
static boolean
boolean esPar(int);
esPar(int);
public Compiled
Compiled from
from Par.java
public class
class Par
Par {{ const
const # 2 == Method
# 2 Method #3.#16;
#3.#16; Par.java Code:
Code:
const # 3 = class #17; class
class Par
Par extends
extends Object{
Object{
const # 3 = class #17; Stack=2,Locals=1,Args_size=1
public
public static
static void
void main
main const # 4 = class
const # 4 = class #18;
#18; Stack=2,Locals=1,Args_size=1
(String public
public Par(); 0: iload_0
(String args[])
args[]) {{ const # 5 = Asciz
const # 5 = Asciz <init>;
<init>; Par(); 0: iload_0
boolean b = esPar(6); const # 6 = Asciz ()V; Code:
Code:
boolean b = esPar(6); const # 6 = Asciz ()V; 1:
1: iconst_2
iconst_2
}} const # 7 = Asciz Code; Stack=1,
Stack=1, Locals=1,
Locals=1, Args_size=1
Args_size=1
const # 7 = Asciz Code; 2: irem
const # 8 = Asciz LineNumberTable; 0:
0: aload_0
aload_0 2: irem
const # 8 = Asciz LineNumberTable;
public 1: invokespecial
invokespecial #1;
public static
static boolean
boolean esPar
esPar const # 9 = Asciz
const # 9 = Asciz main;
main; 1: #1; 3:
3: ifne
ifne 88
(int // Method java/lang/Object."<init>":()V
(int n)
n) {{ const #10 = Asciz ([Ljava/lang/String;)V;
const #10 = Asciz ([Ljava/lang/String;)V; // Method java/lang/Object."<init>":()V 6: iconst_1
if ((n % 2) == 0) { const #11 = Asciz esPar; 4:
4: return
return 6: iconst_1
if ((n % 2) == 0) { const #11 = Asciz esPar;
return 7: ireturn
return (true);
(true); const
const #12
#12 == Asciz
Asciz (I)Z;
(I)Z; 7: ireturn
}} else public
public static
static void
void main
else {{ const #13 = Asciz
const #13 = Asciz SourceFile;
SourceFile; main 8:
8: iconst_0
iconst_0
return (false); const #14 = Asciz Par.java; (java.lang.String[]);
(java.lang.String[]);
return (false); const #14 = Asciz Par.java; 9: ireturn}
}} const #15 = NameAndType #5:#6; Code:
Code: 9: ireturn}
const #15 = NameAndType #5:#6;
}} const #16 = NameAndType #11:#12; Stack=1,
Stack=1, Locals=2,
Locals=2, Args_size=1
Args_size=1
const #16 = NameAndType #11:#12;
const 0: bipush
bipush 66
const #17
#17 == Asciz
Asciz Par;
Par; 0:
const #18 = Asciz java/lang/Object; 2:
2: invokestatic #2;
invokestatic #2;
const #18 = Asciz java/lang/Object;
//
// Method
Method esPar:(I)Z
esPar:(I)Z
5:
5: istore_1
istore_1
6:
6: return
return

Estructura de una Java Virtual Machine (JVM) 41 Estructura de una Java Virtual Machine (JVM) 42

Ejemplo 3: factorial iterativo Ejemplo 3: factorial iterativo


Constant
Constant pool:
pool:
// C:\>
C:\> javap
javap -c
-c –verbose
–verbose FactIter
// FactIter.java
FactIter.java const
const ## 11 == Method
Method #4.#15;
#4.#15; FactIter public
public static
static int
int fact
fact (int);
(int);
public Compiled
Compiled from
from FactIter.java
public class
class FactIter
FactIter {{ const
const # 2 == Method
# 2 Method #3.#16;
#3.#16; FactIter.java Code:
Code:
public class FactIter extends Object{
public static
static void
void main
main const # 3 = class
const # 3 = class #17;
#17; class FactIter extends Object{ Stack=2,Locals=2,Args_size=1
Stack=2,Locals=2,Args_size=1
(String
(String args[])
args[]) {{ const # 4 = class
const # 4 = class #18;
#18;
public 0:
0: iconst_1
iconst_1
int n = fact(3);
int n = fact(3); const # 5 = Asciz
const # 5 = Asciz <init>;
<init>; public FactIter();
FactIter();
}} const # 6 = Asciz ()V; Code: 1:
1: istore_1
istore_1
const # 6 = Asciz ()V; Code:
public Stack=1,
Stack=1, Locals=1,
Locals=1, Args_size=1 2:
2: iload_0
public static
static int
int fact(int
fact(int n)
n) {{ const # 7 = Asciz
const # 7 = Asciz Code;
Code; Args_size=1 iload_0
0: aload_0 3:
int
int res;
res; const # 8 = Asciz
const # 8 = Asciz LineNumberTable;
LineNumberTable; 0: aload_0 3: iconst_1
iconst_1
for 1: invokespecial #1;
for (res=1;
(res=1; (n>=1);
(n>=1); n--)
n--) {{ const # 9 = Asciz
const # 9 = Asciz main;
main; 1: invokespecial #1; 4:
4: if_icmplt
if_icmplt 17 17
//
res
res *=
*= n; const #10 = Asciz ([Ljava/lang/String;)V; // Method
Method java/lang/Object."<init>":()V 7:
}}
n; const #10 = Asciz ([Ljava/lang/String;)V;
const #11 = Asciz fact; 4: return
java/lang/Object."<init>":()V
7: iload_1
iload_1
const #11 = Asciz fact; 4: return 8:
return 8: iload_0
iload_0
return (res);
(res); const
const #12
#12 == Asciz
Asciz (I)I;
(I)I; 9:
}} const #13 = Asciz
const #13 = Asciz SourceFile;
SourceFile;
public
public static
static void
void main
main 9: imul
imul
}} const #14 = Asciz FactIter.java; (java.lang.String[]);
(java.lang.String[]);
10:
10: istore_1
istore_1
const #14 = Asciz FactIter.java;
const #15 = NameAndType
const #15 = NameAndType #5:#6;
#5:#6;
Code:
Code: 11:
11: iinc
iinc 0,
0, -1
-1
Stack=1,
Stack=1, Locals=2,
Locals=2, Args_size=1 14:
const #16 = NameAndType
const #16 = NameAndType #11:#12;
#11:#12;
0: iconst_3
Args_size=1 14: goto
goto 22
const
const #17
#17 == Asciz FactIter; 17:
const #18 =
Asciz
Asciz
FactIter;
java/lang/Object;
0:
1:
iconst_3
invokestatic #2; 17: iload_1
iload_1
1: invokestatic #2; 18:
const #18 = Asciz java/lang/Object;
// Method fact:(I)I 18: ireturn
ireturn
// Method fact:(I)I }}
4:
4: istore_1
istore_1
5:
5: return
return

Estructura de una Java Virtual Machine (JVM) 43 Estructura de una Java Virtual Machine (JVM) 44
Ejemplo 4: factorial recursivo Ejemplo 4: factorial recursivo
Constant
Constant pool:
pool:
// C:\>
C:\> javap
javap -c
-c –verbose
–verbose FactRecu
// FactRecu.java
FactRecu.java const
const ## 11 == Method
Method #4.#15;
#4.#15; FactRecu public
public Compiled
Compiled from
from FactRecu.java public static
static int
int fact(int);
fact(int);
public class
class FactRecu
FactRecu {{ const
const # 2 == Method
# 2 Method #3.#16;
#3.#16; FactRecu.java
public
public static
static void
void main
main const # 3 = class
const # 3 = class #17;
#17;
class
class FactRecu
FactRecu extends
extends Object{
Object{ Code:
Code:
(String
(String args[])
args[]) {{ const # 4 = class
const # 4 = class #18;
#18; Stack=3,Locals=1,Args_size=1
public Stack=3,Locals=1,Args_size=1
int n = fact(6);
int n = fact(6); const # 5 = Asciz
const # 5 = Asciz <init>;
<init>; public FactRecu();
FactRecu();
}} const # 6 = Asciz ()V; Code: 0:
0: iload_0
iload_0
const # 6 = Asciz ()V; Code:
Stack=1,
Stack=1, Locals=1,
Locals=1, Args_size=1 1:
public
public static
static int
int fact(int
fact(int n)
n) {{ const # 7 = Asciz
const # 7 = Asciz Code;
Code;
0: aload_0
Args_size=1 1: iconst_1
iconst_1
if
if (n==1)
(n==1) {{ const # 8 = Asciz LineNumberTable; 0: aload_0 2:
return
const # 8 = Asciz LineNumberTable;
1: invokespecial
invokespecial #1;
2: if_icmpne
if_icmpne 77
return (1);
(1); const # 9 = Asciz
const # 9 = Asciz main;
main; 1: #1;
}} else //
// Method
Method java/lang/Object."<init>":()V 5:
5: iconst_1
else {{ const #10 = Asciz ([Ljava/lang/String;)V;
const #10 = Asciz ([Ljava/lang/String;)V; 4: return
java/lang/Object."<init>":()V iconst_1
return (n*fact(n-1)); const #11 = Asciz fact; 4: return 6:
}}
return (n*fact(n-1)); const #11 = Asciz
const
fact; 6: ireturn
ireturn
const #12
#12 == Asciz
Asciz (I)I;
(I)I; 7:
}} const #13 = Asciz
const #13 = Asciz SourceFile;
SourceFile;
public
public static
static void
void main
main 7: iload_0
iload_0
(java.lang.String[]); 8:
}} const #14 = Asciz
const #14 = Asciz FactRecu.java;
FactRecu.java; Code:
(java.lang.String[]); 8: iload_0
iload_0
const #15 = NameAndType #5:#6; Code: 9:
const #15 = NameAndType
const #16 = NameAndType
#5:#6;
#11:#12; Stack=1,
Stack=1, Locals=2,
Locals=2, Args_size=1
Args_size=1 9: iconst_1
iconst_1
const #16 = NameAndType #11:#12; 10:
const
const #17
#17 == Asciz
Asciz FactRecu;
FactRecu;
0:
0: bipush
bipush 66 10: isub
isub
const #18 = Asciz java/lang/Object; 2: invokestatic
invokestatic #2; 11:
const #18 = Asciz java/lang/Object; 2:
//
#2; 11: invokestatic
invokestatic #2;
#2;
// Method
Method fact:(I)I
fact:(I)I //
5:
5: istore_1
istore_1 // Method
Method fact:(I)I
fact:(I)I
6:
6: return
return
14:
14: imul
imul
15:
15: ireturn
ireturn
}}

Estructura de una Java Virtual Machine (JVM) 45 Estructura de una Java Virtual Machine (JVM) 46

Sesión de
laboratorio:
VisualJVM
Bibliografía y enlaces
• The Java API documentation
• Tim Lindholm, Frank Yellin, The JVM
1
Inicio
Tecn. Java Specification, Second Edition, Addison
Estructura de una
2
3
Estruct. JVM
Estruct. .class Wesley, Java Series, April 1999. Máquina Virtual Java (JVM)
4 Opcodes
Final
• D. Friedman, M. Wand, and C. Haynes,
Essentials of Programming Languages, 2nd
ed. MIT Press, 2001. Sesión de laboratorio: VisualJVM
• Bill Blunden, Virtual Machine Design and Autor: Pedro Pablo Garrido Abenza
Implementation in C/C++, Wordware pgarrido@umh.es
Publishing, March 2002
• JVM Instruction Reference (Quick refer.).
Estructura de una Java Virtual
Machine (JVM)
Estructura de una Java Virtual Machine (JVM) 47 48

También podría gustarte