JVM(자바 가상 머신)은 자바 언어에서만 사용하는 것이 아니다. 코틀린, 스칼라 언어에서도JVM 동작 방식을 그대로 따른다.

JVM(자바 가상 머신) 실행 부분은 빨간 박스를 친 부분인, 컴파일된 .class 파일을 어떠한 처리를 거쳐 프로그램을 실행하는 과정이다.

다음은 위에서 다뤄본 JVM 동작 과정 중 Class Loader <--> Execution Engine <--> Runtime Data Area 부분을 좀 더 상세화 한 도식이다.

JVM은 아래와 같이 구성되어 있다.

자바 가상 머신은 가비지 컬렉터(Garbage collector)를 이용하여 Heap 메모리 영역에서 더는 사용하지 않는 메모리를 자동으로 회수해준다.
C언어 같은 경우 직접 개발자가 메모리를 해제해줘야 되지만, JAVA는 이 가비지 컬렉터를 이용해 자동으로 메모리를 실시간 최적화 시켜준다. 따라서 개발자가 따로 메모리를 관리하지 않아도 되므로, 더욱 손쉽게 프로그래밍을 할 수 있도록 해준다.
일반적으로 자동으로 실행되지만, GC(가비지 컬렉터)가 실행되는 시간은 정해져 있지 않다.
특히 Full GC가 발생하는 경우, GC를 제외한 모든 스레드가 중지되기 때문에 장애가 발생할 수 있다.

런타임 데이터 영역은 쉽게 말하면 JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.
런타임 데이터 영역은 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack으로 나눌 수 있다.

이때 Method Area, Heap Area 는 모든 쓰레드(Thread)가 공유하는 영역이고, 나머지 Stack Area, PC Register, Native Method Stack 은 각 쓰레드 마다 생성되는 개별 영역이다.

메서드 영역은 JVM이 시작될 때 생성하는 공간으로 바이트 코드(.class)를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간이다.
JVM이 동작하고 클래스가 로드될 때 적재되서 프로그램이 종료될 때까지 저장 된다.
->간단히 말하자면 메서드 영역에는 정적 필드(static)와 클래스 구조만을 갖고 있다고 할 수 있다.

힙 영역은 메서드 영역과 함께 모든 쓰레드가 공유하며, JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다.
즉, new 연산자로 생성되는 클래스와 인스턴스 변수, 배열 타입 등 Reference Type이 저장되는 곳이다.

유의할 점은 힙 영역에 생성된 객체와 배열은 Reference Type으로써, JVM 스택 영역의 변수나 다른 객체의 필드에서 참조된다는 점이다.
즉, 힙의 참조 주소는 "스택"이 갖고 있고 해당 객체를 통해서만 힙 영역에 있는 인스턴스를 핸들링할 수 있는 것이다.

만일 참조하는 변수나 필드가 없다면 의미 없는 객체가 되기 때문에 이것을 쓰레기로 취급하고 JVM은 쓰레기 수집기인 Garbage Collector를 실행시켜 쓰레기 객체를 힙 영역에서 자동으로 제거된다.
스택 영역은 int, long, boolean 등 기본 자료형을 생성할 때 저장하는 공간으로, 임시적으로 사용되는 변수나 정보들이 저장되는 영역이다.


단, 데이터의 타입에 따라 스택(stack)과 힙(heap)에 저장되는 방식이 다르다는 점은 유의해야한다.
Ex) 예를 들어 Person p = new Person();와 같이 클래스를 생성한 경우, new에 의해 생성된 클래스는 Heap Area에 저장되고, Stack Area에는 클래스의 참조인 p만 저장된다.

스택 영역은 각 스레드마다 하나씩 존재하며, 스레드가 시작될 때 할당된다.
프로세스가 메모리에 로드 될 때 스택 사이즈가 고정되어 있어, 런타임 시에 스택 사이즈를 바꿀 수는 없다.
만일 고정된 크기의 JVM 스택에서 프로그램 실행 중 메모리 크기가 충분하지 않다면 StackOverFlowError가 발생하게 된다.
쓰레드를 종료하면 런타임 스택도 사라진다.
나머지 내용은 추후 수정 예정