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.
// 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 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.
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.
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.
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.
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.