![[자바] 자바 프로그램의 실행 과정 정리](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog-custom%3Ftitle%3D%255B%25EC%259E%2590%25EB%25B0%2594%255D%2B%25EC%259E%2590%25EB%25B0%2594%2B%25ED%2594%2584%25EB%25A1%259C%25EA%25B7%25B8%25EB%259E%25A8%25EC%259D%2598%2B%25EC%258B%25A4%25ED%2596%2589%2B%25EA%25B3%25BC%25EC%25A0%2595%2B%25EC%25A0%2595%25EB%25A6%25AC%26tag%3DTemplate%2B1%26description%3D%26template%3D3%26backgroundImage%3Dhttps%253A%252F%252Fsource.inblog.dev%252Fog_image%252Fdefault.png%26bgStartColor%3D%2523723c3c%26bgEndColor%3D%2523723c3c%26textColor%3D%2523000000%26tagColor%3D%2523000000%26descriptionColor%3D%2523000000%26logoUrl%3D%26blogTitle%3DGyeongwon%2527s%2Bblog&w=2048&q=75)
1. 자바 실행 단계 요약
컴파일 단계
- .java → .class 로 변한
- 도구 :
javac
(자바 컴파일러)
- 결과 : 운영체제에 독립적인 바이트 코드를 생성
구성 요소 | 설명 |
소스 코드 ( .java ) | 개발자가 작성한 자바 코드 |
자바 컴파일러 ( javac ) | 소스 코드를 바이트 코드로 변환 |
바이트 코드 ( .class ) | JVM이 실행할 수 있는 중간 코드 |
런타임 단계
- .class → 실행
- 도구 :
JVM
(Java Virtual Machine)
구성 요소 | 설명 |
JVM | 바이트 코드를 실행하는 가상 머신 |
클래스 로더 | .class 파일을 JVM 메모리에 적재 |
실행 엔진 | 바이트 코드를 해석/실행 (JIT 컴파일 포함) |
런타임 메모리 영역 | 실행 중 필요한 메모리 공간 |
OS & 하드웨어 | 실제로 프로그램이 동작하는 기반 환경 |
자바 프로그램의 실행 흐름
Application (자바 코드) → JVM → OS → 하드웨어
- Application: 우리가 작성하는 코드 (Java, C 등)
- JVM (Java Virtual Machine): 자바 코드를 OS와 독립적으로 실행하게 해줌
- OS (운영체제): 하드웨어와 소통 (Shell 언어로 간접 제어), JVM 덕분에 OS 상관없이 실행 가능
- 하드웨어: 최종적으로 2진수로 명령을 받아 작동
2. JVM의 런타임 데이터 영역
자바 프로그램이 실행될 때 JVM 내부 메모리는 아래와 같은 다섯 영역으로 나뉜다.
구분 | 설명 | 특징 |
메서드 영역 | 클래스 정보, static 변수, 상수 등 | 모든 스레드 공유 |
힙 영역 | 객체와 배열 저장 공간 | new로 생성, 모든 스레드 공유 |
스택 영역 | 지역 변수, 매개변수, 호출 정보 등 | 스레드마다 개별 스택 프레임 존재 |
PC 레지스터 | 현재 실행 중인 명령 주소 추적 | 스레드별 존재 |
네이티브 메서드 스택 | C/C++ 등의 native 메서드 실행 공간 | native 키워드 사용 시 동작 |
메서드 영역
클래스 구조, 메서드 정보, 상수, 정적 변수 등 클래스 수준의 데이터를 저장한다. 모든 스레드가 공유하는 영역이다.
예시)
클래스 파일(.class)에서 읽어온 클래스 정보, static 변수, 상수 등
힙 영역
new 키워드를 사용하여 생성된 객체(인스턴스)와 배열이 저장되는 공간이다. 모든 스레드가 공유하고, 동적으로 크기가 변한다.
예시)
String str = new String("Hello");
와 같이 생성된 객체, 배열 등이 힙 영역에 저장된다. 스택 영역
각 스레드마다 독립적으로 할당되며, 메서드 호출 시 생성되는 스택 프레임을 저장한다. 지역 변수, 매개변수, 메서드 호출 정보 등을 저장한다.
예시)
메서드 내에서 선언된 기본 자료형 변수(int, double 등) 메서드 호출 시 생성되는 스택 프레임 등이 저장된다.

Share article