면접때 답변을 제대로 하지 못한 질문중 하나이다.
JVM이라고 하면 그냥 가비지컬렉터가 대충 메모리 관리하는거 아닌가 라고 생각했다.
실제로 뭐 이걸 제대로 다룬적도 없고 자바공부할때도 자바의 특성중 하나로 알고있었다.
오늘은 JVM의 특징과 동작과정 동작원리를 한번 정리해보려고한다.

Java Virtual Machine의 줄임말이다.
자바 언어로 작성한 프로그램을 실행시키기 위한 가상머신이다.
자바로 코드를 작성하면 JVM위에서 동작한다.
가상머신은 프로그램 실행 등을 위해 물리적 머신과 비슷하게 소프트웨어로 구현한것이다.



(1) Class Loader
JVM 내로 클래스 파일을 로드, 링크를 통해 배치하는 작업을 수행하는 모듈, 런타임 시 동적으로 클래스를 로드한다.
(2)Excution Engine
클래스 로더를 통해 JVM 내 RuntimeDate Area에 배치된 바이트 코드들을 명령어 단위로 읽어서 실행한다. JIT컴파일러 방식으로 실행한다.
(3)Garbage Collector(GC)
GC는 힙 메모리 영역에 생성된 객체들 중 참조되지 않은 객체들을 탐색 후 제거하는 역할을 한다.
(4)Runtime Data Area
JVM메모리 영역, 자바 애플리케이션을 실행할때 사용되는 데이터들을 적재하는 영역이다.

(1)Method area
모든 쓰레드가 공유하는 메모리 영역, 메소드 영역은 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관한다.
(2)Heap area
모든 쓰레드가 공유, new 키워드로 생성된 객체와 배열이 생성되는 영역, 메소드 영역에 로드된 클래스만 생성이 가능, GC가 참조되지 않는 메모리를 확인하고 제거하는 영역이다.
(3)Stack area
메소드 호출 시마다 각각의 스택 프레임이 생성된다. 그리고 메서드 안에서 사용되는 값들을 저장, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다.
int a = 10; 변수 선언시 정수값이 할당될 수 있는 메모리공간을 a 라고 잡고 메모리 영역에 값이 10이 들어간다. 스택에 a라는 이름이 붙고 값이 10인 메모리 공간을 만든다.
클래스 Person P = new Person(); 소스 작성시 Person P 는 스택 영역에 생성 new 로 생성된 Person 쿨래스의 인스턴스는 힙 영역에 생성된다.
그리고 스택영역에 생성된 p의 값으로 힙 영역의 주소값을 가지고 있다. 스택 영역에 생성된 p가 힙 영역에 생성된 객체를 가리키고 있는 것임.
메소드 호출시 개별적으로 스택이 생성된다.
(4)PC Register
Thread가 생성될때마다 생성되는 영역이다. 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다.
(5)Native method stack
자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.
Heap 영역은 GC의 주요 대상이다.

GC는 Minor GC, Major GC로 나뉨
Major GC(Full GC) : Old 영역에서 일어나는 GC
Minor GC보다 시간이 훨씬 많이 걸리고 실행중에 GC를 제외한 모든 쓰레드가 중지한다.
Major GC(Full GC)가 일어나면,
Old영역에 있는 참조가 없는 객체들을 표시하고 그 해당 객체들을 모두 제거하게 된다.
그러면서 Heap 메모리 영역에 중간중간 구멍(제거되고 빈 메모리 공간)이 생기는데 이 부분을 없애기 위해 재구성을 하게 된다. (디스크 조각모음처럼 조각난 메모리를 정리함)따라서 메모리를 옮기고 있는데 다른 쓰레드가 메모리를 사용해버리면 안되기 때문에 모든 쓰레드가 정지하게 되는 것이다.
https://jeong-pro.tistory.com/148
https://backendcode.tistory.com/161