소스코드 -컴파일러-> 바이트 코드 -클래스 로더-> 메모리 -Execution 엔진-> 실행
| 단계 | 구성 요소 | 역할 | 결과물 / 설명 |
|---|---|---|---|
| 1. 소스 코드 | .java 파일 | 개발자가 작성한 자바 코드 | 사람이 읽을 수 있는 텍스트 형태의 코드 |
| 2. 컴파일러 (javac) | Java Compiler | .java 파일을 바이트코드로 변환 | .class 파일 생성 (JVM이 이해할 수 있는 중간 언어) |
| 3. 바이트코드 (Bytecode) | .class 파일 | JVM이 실행할 명령어 집합 (플랫폼 독립적) | 기계어와 비슷하지만, 실제 CPU가 아니라 JVM이 해석함 |
| 4. 클래스 로더 (Class Loader) | JVM 내부 구성 요소 | 필요한 .class 파일(바이트코드)을 메모리에 적재 | 메모리에 클래스 정보가 로드됨 |
| 5. 메모리 (Runtime Data Area) | JVM 메모리 구조 | 프로그램 실행 중 사용하는 데이터 저장 | Method Area, Heap, Stack 등으로 구분 |
| 6. 실행 엔진 (Execution Engine) | Interpreter / JIT Compiler | 메모리에 적재된 바이트코드를 실제로 실행 | 바이트코드를 CPU가 이해하는 기계어로 변환 후 실행 |
함 바이트 코드를 열어서 확인해보자
gitBash로 다음을 입력
파일 생성하여 소스 작성:vi Main.java
입력 코드 예시
public class Main {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
+) 저장 후 종료 → :wq
컴파일
javac Main.java
→ 같은 폴더에 Main.class 생성됨
바이트코드 보기
cat Main.class
또는
javap -c Main
javap 쪽은 바이트코드를 해석한 명령어 형태로 출력됨
출력 예시
$ javap -c Main
Compiled from "Main.java"
public class Main {
public Main();
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 #7 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #13 // String Hello bytecode
5: invokevirtual #15 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
그렇다면 JVM이란??
-> 즉, 실제 CPU나 OS에 상관없이,
JVM이 설치되어 있으면 어디서든 같은 바이트코드를 실행할 수 있음
그럼 JVM 언어란??
-> 즉, 다른 언어로 작성해도, 결국 JVM이 이해하는 바이트코드로 컴파일되면 실행 가능!
예시 : java, kotlin