JVM(Java Virtual Machine)
- 자바를 실행하기 위한 가상 기계
자바 가상 기계
: ‘기계'라는 표현이 있지만 하드웨어가 아니고, JDK에 포함되어 있는 소프트웨어
- 자바 바이트코드(.class파일)를 OS에 상관없이 동작하도록 기계어로 변환하여 전달한다 ⇒ 번역기 역할
OS (운영체제)
: Windows, Linux, Macintosh …
기계어
: 0,1로 이루어진 컴퓨터가 알아 들을 수 있는 언어

-
자바의 컴파일 동작 과정
- 자바의 프로그램이 실행되면 JVM은 OS로부터 프로그램이 필요로 하는 메모리를 요청하여 할당받는다 ⇒ JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다
- 자바 컴파일러(javac)명령어를 통해 자바 소스파일(.java)을 읽어 바이트코드 파일(.class)로 변환시킨다
- Class Loader를 통해 class파일들을 JVM 내부로 로딩한다
- 로딩된 바이트코드 파일(.class)들은 실행 엔진(Execute Engine)을 통해 기계어로 해석된다
- 해석된 바이트코드 파일(.class)은 메모리 상(Runtime Data Area)에 배치되어 실질적인 수행을 한다
- 이런 실행과정 중에 JVM은 Thread Synchronization 이나 Garbage Collection같은 작업을 수행한다
-
JVM의 구조 중 메모리 구조
- Method Area(메서드 영역) : 클래스 변수의 이름, 타입, 접근 제어자 등과 같은 클래스와 관련된 정보를 저장한다. 그 외에도 static 변수, 인터페이스 등이 저장된다
- Heap Area(힙 영역) : new생성자를 통해 생성된 객체와 배열의 인스턴스를 저장한다. 가비지 컬렉터는 힙 영역을 청소하며 메모리를 확보한다
- Stack Area(스택 영역) : 메서드가 실행되면 스택 영역에 메서드에 대한 영역이 생성된다. 이 영역에 지역변수, 매개변수, 리턴값 등이 저장된다
- PC Register(PC 레지스터) : 현재 스레드가 실행되는 부분의 주소와 명령을 저장한다
- Native Method Stack(네이티브 메서드 스택) : 자바 외의 언어로 자겅된 코드를 위한 메모리 영역
가비지 컬렉션(GC: Garbage Collection)
- JVM의 메모리 관리 기법 중 하나로 시스템에서 동적으로 할당됐던 메모리 영역 중에서 필요 없어진 영역을 회수하여 메모리를 관리해주는 기법
- 가비지 컬렉션은 언제 동작하는가?
- OS로부터 할당 받은 시스템의 메모리가 부족한 경우
- 관리하고 있는 Heap에서 사용되는 메모리가 허용된 임계값을 초과하는 경우
- 프로그래머가 직접 GC를 실행하는 경우(Java에서는 System.gc()라는 메서드가 있지만 가급적 안쓰는 것이 좋다)
- 가비지 컬렉션의 동작 원리
https://www.waitingforcode.com/off-heap/on-heap-off-heap-storage/read
-
Young Generation
- 새롭게 생성된 객체가 할당되는 영역이다
- 대부분의 객체는 도달할 수 없는 상태, 즉 참조되지 않는 상태가 되기 때문에 많은 객체가 이 곳에서 사라진다
- Eden 영역이 한번 가득 차면 Garbage Collector가 실행되는데 이 때 실행되는 가비지 컬렉션을
Minor GC
라고 한다
- Eden 영역에서 살아남은 객체는 Survval0 혹은 1로 가게 되고, Survival 0과 1 중 하나는 반드시 비어 있다
- Old Generation
- Young Generation에서 살아남은(참조값이 유지되는) 객체가 위치하는 영역이다
- Old Generation이 가득 차면 Garbage Collector가 실행되는데 이 때 실행되는 가비지 컬렉션을
Major GC
혹은 Full GC
라고 한다
-
가비지 컬렉션 동작 과정
-
새로운 객체가 Eden
영역에 할당 ⇒ 두 개의 Survival 중 하나는 반드시 비워진 상태로 시작된다
-
Eden 영역이 가득차면 Minor GC
가 발생한다
-
Minor GC에서 참조값이 유지된 객체는 Survival
영역으로 이동 ⇒ 참조값이 존재하지 않는 객체는 Minor GC 중 메모리에서 삭제된다
-
다음 Minor GC가 발생하는 시점에, Eden 영역에서는 3번의 과정이 반복된다 ⇒ 기존에 Survival 영역에 위치하던 객체들 중 참조값이 유지된 객체들은 다른 Survival 영역으로 이동하며, 이 때 객체의 age 값이 1 증가한다 ⇒ Survival 영역에서 참조값이 존재하지 않게 된 객체는 메모리에서 삭제된다
-
4번의 과정이 반복되며, 이 과정에서 지속적으로 살아 남은 객체 중 age 값이 특정 값 이상인 객체들은 Old Generation
으로 옮겨진다 ⇒ Young Generation에서 Old Generation으로 객체가 이동하는 단계를 Promotion
이라고 한다
-
Minor GC의 반복과 Promotion
작업의 반복이 계속 일어나다 보면 Old Generation이 가득차게 된다
-
이 때 Major GC
가 발생한다
-
가비지 컬렉션 동작 방식
Stop The World
- 가비지 컬렉션을 수행하기 위해 JVM이 애플리케이션의 실행을 일시 정지 하는 것
- 가비지 컬렉션이 실행되면 GC 작업을 맡은 스레드를 제외한 나머지 스레드는 모두 멈추고 GC 작업이 종료되면 재개된다
Mark and Sweep
- 애플리케이션이 일시 중지되면 GC는 참조되고 있는 객체와 연결된 객체를 타고 이동하며 접근 가능한 객체를 식별(Mark)하는데 이 과정을
Mark
라고 한다
- 모든 객체 탐색이 끝나면 식별(Mark)되지 않은 객체들을 메모리에서 해제시키는데 이것을
Sweep
이라고 한다
참고자료
도서: 혼자 공부하는 자바 - 신용권
블로그 :
신입 개발자 기술면접 질문 정리 - 자바
[기술면접 시리즈] 자바의 컴파일 과정(JVM 메모리 구조)
JVM의 Garbage Collector 동작 원리
[JAVA] GC(Garbage Collection)이란?