먼저 이 포스트에 간단하게 JVM을 소개 해보았다. 이 글은 JVM에 대해서 조금 더 자세히 다룰 예정이다.
핵심 역할
JVM은 .class 파일에 담긴 bytecode를 읽어들여서 현재 실행되고 있는 운영체제가 이해할 수 있는 기계어 (native machine code)로 번역하고 실행한다.
JVM은 크게 Class Loader, Execution Engine, Garbage Collector, Runtime Data Area로 구성되어있다.

Class loader
- 개발자가 쓴 .java파일은 컴파일러를 거치면 bytecode(.class)로 변환된다. Class Loader는 이 .class 파일들을 Runtime Data Areas에 적재한다
Execution Engine
- 클래스를 실행시키는 역할이다. Class Loader에 의해 Runtime Data Areas에 적재된 .class 파일들을 기계어로 변경한다
- 여기서 명령어 실행하는 방법은 Interpretor, JIT(Just-In-Time)이 두가지 방법이 있다.
- Interpretor: 명령어를 하나하나 실행한다 (한줄씩 수행하기 때문에 느리다는 단점이 있다)
- JIT: 인터프리터 방식으로 실행하다가 적절한 시점에 bytecode를 컴파일해서 기계어로 변경한다
Runtime Data Area
자바 프로그램을 실행할 때 사용되는 데이터들을 저장하는 OS에서 할당받은 메모리 공간이다.

영역은 Method(static) Area, Heap Area, Stack Area, PC Register, Native Method Stack이 있다.
하지만 메모리를 크게 보려면 Method, Heap, Stack으로 나뉜다.
- MethodArea(메소드 영역)
- JVM이 시작될 때 생성됨
- 클래스 단위의 정보를 저장함
- 클래스 정보 (이름, super 클래스 이름, 인터페이스 등), 필드 정보, 메소드 정보
- static variables, constants (final static), constant pool
- 클래스가 처음 로드될 때 생성되며, JVM 종료 시까지 유지
- 모든 thread에서 공유됨
- Head Area(힙 영역)
- new 키워드로 생성되는 객체와 배열이 생성되는 영역 (where ALL objects live)
- new 키워드로 생성된 객체 인스턴스 (Person p = new Person(); 여기서 new Person() 부분이 힙에 생성)
- new 키워드로 생성된 배열 (int[] arr = new int[5]; 여기서 new int[5] 부분이 힙에 생성)
- 메소드 영역에 적재된 클래스만 생성 가능함 ( = 클래스가 먼저 메모리에 로드되어야 함)
- GC(Garbage Collection)의 대상
- JVM에는 오직 하나의 힙만 존재
- new 키워드로 생성되는 객체와 배열이 생성되는 영역 (where ALL objects live)
- Stack Area(스택 영역)
- 메소드 호출 시마다 생성되는 각 메소드의 작업 공간
- 메소드가 호출될 때마다 해당 메소드를 위한 스택 프레임(Stack Frame)이 스택 영역에 쌓이고, 메소드 실행이 끝나면 해당 프레임이 스택에서 제거됨
- 메서드 종료 시 자동 제거 (LIFO 구조)
- 각 프레임에 저장되는 정보
- 지역 변수, 매개변수, 리턴 값, 메소드 호출 정보 (method invocations, local variables, etc)
- 참조형 변수의 경우
- Person p = new Person();과 같은 참조 타입(reference type) 변수는 스택 영역에 참조 변수(p)만 생성되고, 이 참조 변수는 힙 영역에 생성된 실제 객체 인스턴스의 메모리 주소를 저장하여 힙 영역의 객체를 '참조'하게 됨
- 메소드 호출 시마다 생성되는 각 메소드의 작업 공간

- PC Register
- Thread가 생성될때마다 생성되는 공간 (thread마다 하나씩 존재한다)
- 영역으로 현재 실행되는 쓰레드의 주소와 명령을 저장
- Native Method Stack Area
- 자바 외 언어로 작성된 네이티브 코드를 위한 영역
Garbage Collector
힙 영역에 생성된 객체들 중에서 더이상 사용되지 않는 객체들을 탐색 후 제거하는 역할을 한다.
자세한 포스팅은 여기에 있다.
출처
- https://cjw-awdsd.tistory.com/26
- https://blog.devgenius.io/what-is-garbage-collector-stack-heap-in-java-80c33c2a0234
'Java' 카테고리의 다른 글
| [Java] HashSet의 내부 동작 방식과 중복 제거 메커니즘 (1) | 2025.06.09 |
|---|---|
| [Java] Stream API의 map과 flatMap의 차이점 (1) | 2025.06.02 |
| [Java] JVM, JRE, JDK 노트정리 (0) | 2025.05.30 |
| [Java] Garbage Collection 노트정리 (1) | 2025.05.29 |