SLIDE 1 / 5

1. El Lema: Write Once, Run Anywhere

En lenguajes compilados tradicionales como C, el compilador genera código máquina atado a un procesador específico. En Java, el código fuente se compila a Bytecode (.class): un conjunto de instrucciones universal que cualquier máquina virtual (JVM) puede ejecutar en cualquier sistema operativo.

Hola.java Código Fuente javac Hola.class 0xCAFEBABE aload_0 invokespecial Bytecode Universal JVM Windows (x86) Intel / AMD instructions JVM macOS (ARM64) Apple Silicon M-Series JVM Linux Server ELF binaries & cloud kernel Un solo archivo .class corre inalterado en todas las plataformas gracias a su JVM local.
Simulador de Bytecode Seleccioná la arquitectura
JVM Windows (x86_64)
// Bytecode (.class) es IDÉNTICO:
0: getstatic #2 // System.out
3: ldc #3       // "Hola Mundo"
5: invokevirtual #4 // println

// Instrucciones emitidas por la JVM nativa:
mov eax, [rcx+0x10]
lea rdx, [rel str_hola]
call qword ptr [rax+0x28]

El compilador javac nunca interactúa con la arquitectura final: la JVM nativa traduce el bytecode en caliente.

2. Anatomía Interna de la JVM

La Máquina Virtual de Java se divide en tres subsistemas fundamentales: Carga de Clases (ClassLoader), Áreas de Memoria en Tiempo de Ejecución (Runtime Data Areas) y el Motor de Ejecución (Execution Engine).

ClassLoader 1. Loading (.class) 2. Linking / Verifier 3. Initialization Valida seguridad de bytecode Runtime Memory Method Area (Clases) HEAP Objetos vivos JVM Stacks Hilos y métodos PC Registers Execution Engine Intérprete Línea a línea JIT Compiler Compila código caliente a velocidad C++ Garbage Collector Libera memoria huérfana
Explorador de Componentes Seleccioná un bloque

ClassLoader Subsystem

Se encarga de localizar y cargar los archivos .class en memoria. El Bytecode Verifier analiza la estructura binaria para asegurar que no contenga punteros ilegales, accesos prohibidos ni desbordamientos de pila antes de permitir su ejecución.

✓ Garantía de Seguridad de Java

3. Anatomía de public static void main(String[] args)

Cada palabra en la firma del método de entrada tiene una razón técnica indiscutible en la arquitectura de Java.

public Visible para el cargador de la JVM desde cualquier parte fuera de la clase.
static La JVM puede ejecutarlo directamente sin necesidad de crear un objeto previo con new.
void No devuelve ningún valor. Los errores se señalan mediante excepciones o códigos de salida.
main Nombre canónico e identificador reservado por convención que busca el runtime para arrancar.
String[] args Arreglo de cadenas de texto con los argumentos pasados por consola al iniciar.
Simulador de Argumentos CLI Probá pasar parámetros
$ java MiApp
Memoria del arreglo args en Stack/Heap:
args[0] = "servidor.cfg"
args[1] = "8080"
args[2] = "--debug"
args.length = 3

4. Flujos de Entrada y Salida (I/O) y Scanner

La clase System conecta el programa con los tres descriptores estándar del sistema operativo: entrada estándar (in), salida estándar (out) y salida de error (err). Scanner envuelve el stream de bytes y lo parsea en tipos tipados.

Terminal "42 Juan\n" Teclado / Consola System.in Scanner nextInt() → 42 next() → "Juan" System.out Display println() Salida limpia
Laboratorio Scanner Paso a paso de lectura
Buffer: 19 3.1415 true
Método usado: scanner.nextDouble()
Variable Java asignada: double pi = 3.1415;

5. Stack vs Heap: Primer Vistazo a la Memoria

Toda variable en Java vive en el Stack o en el Heap. En este primer nivel, las variables primitivas del método main residen directamente en el marco de la Pila (Stack Frame), de acceso instantáneo y liberación automática al finalizar el bloque.

Call Stack (Hilos) Frame: main() int edad = 25 double saldo = 1500.0 boolean activo = true HEAP (Montón Global) Aún sin objetos instanciados (Reservado para "new" y Objetos en lecciones 07+)

Puntos Clave para Recordar

  • Write Once, Run Anywhere: El compilador javac crea .class (bytecode); la JVM nativa de cada OS lo ejecuta.
  • Arquitectura JVM: ClassLoader carga y verifica seguridad; JIT compila bucles calientes a velocidad C++.
  • Firma de main(): public para acceso externo, static para arrancar sin new, void porque no retorna valor.
  • Memoria Stack: Las variables locales primitivas de main viven directamente en el frame de la pila.