OS에 종속받지 않고 CPU가 JAVA를 인식, 실행할 수 있게 하는 가상 컴퓨터를 말합니다.
컴파일된 코드를 기계가 이해할 수 있는 기계어로 변환합니다.
프로그램 메모리를 최적화하고 관리합니다.
스택기반의 가상 머신입니다.
자바컴파일과정

JVM의 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 자바API와 함께 실행하는 것 입니다.

JVM = Class Loader + Runtime Data Areas + Execution Engine

JVM의 heap영역은 동적레퍼런스 데이터가 저장되는 공간으로서, GC대상이 되는 공간입니다.
(heap영역의 Permanent영역은 JAVA8버전부터 Native Method Stack영역에서 관리)

Young 영역
-새롭게 생성하는 객체들이 존재하는 곳
-대부분의 객체가 금방 Unreachable 상태가 되기 때문에, 많은 객체가 Young 영역에 생성되었다가 사라진다.
-Young 영역에 대한 가비지 컬렉션(Garbage Collection)을 Minor GC라고 부른다.
Old 영역
-Young영역에서 오래동안 살아남은 객체(가중치)들이 존재하는 곳
-Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생한다.
-Old 영역에 대한 가비지 컬렉션(Garbage Collection)을 Major GC 또는 Full GC라고 부른다.
GC(Garbage Collection)는 JVM의 heap 영역에 할당한 메모리 영역중 사용하지않는 메모리를 자동으로 수거하는 기능을 말합니다.
힙 영역은 더욱 효율적인 GC를 위해 Young 영역을 3가지 영역(Eden, survivor 0, survivor 1) 으로 나눕니다.

Eden
-new를 통해 새로 생성된 객체가 위치
-정기적인 쓰레기 수집 후 살아남은 객체들은 Survivor 영역으로 보냄
Survivor 0 / Survivor 1
-최소 1번의 GC 이상 살아남은 객체가 존재하는 영역
-Survivor 0 또는 Survivor 1 둘 중 하나에는 꼭 비어 있어야함
Minor GC 과정
Old영역에비해 상대적으로 작기 때문에 메모리 상의 객체를 찾아 제거하는데 적은 시간이 걸립니다.
이 때문에 Young영역에서 발생되는 GC를 Minor GC라 부릅니다.

Major GC 과정
Old영역의 객체들은 Young영역에서 GC과정 중에 제거되지 않은 경우 age 임계값이 차게되어 이동된 객체입니다.
그리고 Major GC는 객체들이 계속 Promotion되어 Old 영역의 메모리가 부족해지면 발생하게 됩니다.

age값이란? Survivor 영역에서 객체의 객체가 살아남은 횟수를 의미합니다.
만일 age 값이 임계값에 다다르면 Promotion(Old 영역으로 이동) 여부를 결정합니다.
MinorGC와 MajorGC의 차이점

참고:
-https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98GC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC
-https://tecoble.techcourse.co.kr/post/2021-08-09-jvm-memory/