Untitled

1. 자바로 개발된 프로그램을 실행하면 JVM은 OS로부터 메모리를 할당합니다.

2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 자바 바이트코드(.class)로 컴파일합니다.

3. Class Loader를 통해 JVM Runtime Data Area로 로딩합니다.

4. Runtime Data Area에 로딩 된 .class들은 Execution Engine을 통해 해석합니다.

5. 해석된 바이트 코드는 Runtime Data Area의 각 영역에 배치되어 수행하며 이 과정에서 Execution Engine에 의해 GC의 작동과 스레드 동기화가 이루어집니다.

⭐️ 실행 엔진(Execution Engine)

로드된 바이트코드를 실행하는 런타임 모듈

  1. 클래스 로더에 의해 JVM으로 로드된 .class 파일(바이트코드)들은 Runtime Data Areas의 Method Area에 배치

  2. 배치된 이후에 JVM은 Method Area의 바이트 코드를 실행 엔진(Execution Engine)에 제공하여, 정의된 내용대로 바이트 코드를 실행

  3. 실행 엔진은 바이트코드를 명령어 단위로 읽어서 실행

⭐️ 가비지 컬렉터(Garbage Collector)

객체가 Unreachable(참조되고 있지 않은 상태)하다면 GC에서 메모리를 자동으로 회수한다.

Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않은 객체들을 탐색 후 제거하는 역할을 하며 해당 역할을 하는 시간은 정확히 언제인지를 알 수 없습니다. GC역할을 수행하는 스레드를 제외한 나머지 모든 스레드들은 일시정지 상태 됩니다.

장점

C나 C++에서는 이러한 가비지 컬렉션이 없어 프로그래머가 수동으로 메모리 할당과 해제를 일일이 해줘야 하는 반면 Java는 JVM에 탑재되어 있는 가비지 컬렉터가 메모리 관리를 대행해주기 때문에 개발자 입장에서 메모리 관리, 메모리 누수(Memory Leak) 문제에 완벽하게 관리하지 않아도 되어 오롯이 개발에만 집중할 수 있다.