Aula 02 - 🖥️ Como o Java Funciona¶
Java é uma linguagem compilada e interpretada, combinando eficiência com portabilidade.
🔄 Arquitetura do Java¶
flowchart LR
A[Código Fonte .java] --> B[javac]
B --> C[Bytecode .class]
C --> D[JVM]
D --> E[Execução]
📌 Componentes Principais¶
1. Java Virtual Machine (JVM)¶
- Função: Interpreta o bytecode e o executa no sistema operacional.
- Recursos:
- Garbage Collector (gerencia memória).
- JIT Compiler (otimiza código em tempo de execução).
- Suporte a múltiplas plataformas (Windows, Linux, macOS).
2. Bytecode¶
- Formato intermediário: Resultado da compilação do
.java. - Vantagem: Portável ("Write Once, Run Anywhere").
3. Processo de Compilação¶
-
Compilação (
javac):
javac Programa.java # Gera Programa.class -
Execução (
java):
java Programa # Carrega a classe na JVM
🚀 Exemplo Prático em Java¶
Código Fonte: Hello.java¶
// Classe principal
public class Hello {
public static void main(String[] args) {
var mensagem = StringTemplate.STR."Bem-vindo(a) à POO com Java \{System.getProperty("java.version")}!";
System.out.println(mensagem);
}
}
Passo a Passo:¶
- Compilação:
javac Hello.java -
Gera
Hello.class(bytecode). -
Execução:
java Hello - Saída:
Bem-vindo(a) à POO com Java 25!
🔍 O Que Acontece nos Bastidores?¶
Fases da JVM:¶
-
Carregamento de Classes:
JVM lê.classe carrega a classeHello. -
Verificação de Bytecode:
Garante segurança (ex: sem acesso ilegal à memória). -
Compilação JIT (Just-In-Time):
Converte trechos de bytecode para código nativo da máquina. -
Execução:
-
Garbage Collection:
Limpa objetos não usados (ex: instâncias temporárias).
❓ Perguntas Frequentes¶
Por que o Java não é totalmente compilado para código nativo?¶
- Vantagem: Bytecode permite portabilidade. Compilação JIT equilibra performance e flexibilidade.
Como a JVM otimiza o código?¶
- Exemplo: Se um loop é executado muitas vezes, o JIT o compila para código nativo, acelerando execuções futuras.
Para ver o bytecode gerado, use:
javap -c HelloPOO.class
Compiled from "Hello.java"
public class Hello {
public Hello();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3 // String Ola Mundo
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}