동작 구조도

- JVM은 OS로부터 메모리를 할당 받는다.
- 자바 컴파일러 jvav는 자바 소스코드(.java)를 자바 바이트코드(.class)로 컴파일
- ClassLoader는 컴파일된 자바 바이트코드를 Runtime Data Area영역에 로드
- 로딩된 바이트코드는 Execution Engine을 통해 해석된다.
- 해석된 바이트 코드는 Runtime Data Area의 각 영역에 배치되고, 실행되는데, 이 과정에서 Execution Engine에 의해 GC와 쓰레드 동기화가 이뤄짐
ClassLoader

- 자바는 동적으로 클래스를 읽어 오는데, 자바의 모든 소스코드는 JVM과 연결이 되는데, 이렇게 동적으로 바이트코드를 로딩해주는 역할을 함
- 자바 컴파일러가 컴파일을 하면 바이트코드(.class)파일이 생성이 되는데, ClassLoader는 바이트 코드 파일을 묶어서 JVM이 운영체제로 부터 할당받은 메모리 영역인 Runtime Data Area에 적재
Exection Engine

- ClassLoader에 의해 JVM으로 로드된 바이트코드들은 Runetime Data Area의 Method Area영역에 배치가 되는데, 배치된 이후 JVM은 Method Area의 바이트코드를 Exection Engine에 제공하여 정의된 바이트 코드를 실행 시킴
Garbage Collector

- JVM은 가비지 컬렉터를 이용하여 사용하지 않는 메모리를 자동 회수하며, 개발자는 따로 메모리를 관리하지 않아도 되므로 프로그래밍을 쉽게 할 수 있도록 도와줌
- Heap영역에 생성된 객체들 중에 참조되지 않은 객체들을 탐색하여 제거하는 역할을 하며, 해당 역할을 하는 시간은 정확히 알 수 없으며, GC역할이 수행되는 동안 해당 작업 쓰레드를 제외한 모든 쓰레드들은 일시 정지
됨
Runtime Data Area

- Runtime Data Area은 JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역
HEAP영역
- new 키워드로 생성된 객체 및 배열이 생성되는 영역(즉, 포인트형태로 주소레퍼런스를 가지는 데이터의 영역)
- 주가적으로 GC가 제거하는 영역

- HEAP 영역은 크게 Young Generation, Tenured Generation, Permanent Generation영역으로 나뉨
- Young Generation: 자바에서 객체가 생성되자마자 저장되며, HEAP영역에 객체가 생성이되면 최초로 Eden영역에 할당되고, 이 영역에 어느정도 쌓이게 되면 참조정도에 따라 Survivor의 빈 공간에 이동되거나 GC에 의해 해제
- Tenured Generation(OLD): Young Generation영역에 객체가 쌓일 경우 참조되는 정도에 따라 Old영역으로 이동됨.
- Young Generation과 Tenured Generation 에서의 GC를 Minor GC라고 불리며, Old영역에 할당된 메모리가 허용치를 넘게되면 Old영역에 있는 모든 객체들을 검사하여 참조되지 않는 객체들을 한꺼번에 삭제하느 GC가 실행되며 이 때 GC실행 쓰레드 외에 모든 쓰레드는 작업을 일시정지함
STACK영역
- 지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역
PC 레지스터
- 쓰레드가 생성될 때마다 생성되는 영역으로 프로그램의 카운터, 즉 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역
Native Method Stack
- 자바 이외에 언어로 작성된 네이티브 코드를 실행할 때 사용되는 메모리 영역
- 보통 C/C++ 등의 코드를 수행하기 위한 스택을 말하며, 자바 컨파일러에 의해 변환된 자바 바이트 코드를 읽고 해석하는 것이 자바 인터프리터임
이미지 참조: https://coding-factory.tistory.com/828