First: What is JVM?
JVM이란 Java Virtual Machine의 약자. 자바 가상 머신이라고 부른다. 자바와 운영체제 사이의 중개자 역할을 수행
자바가 운영체제에 구애받지 않고 프로그램을 실행할 수 있게 도와준다. 가비지 컬렉터를 사용한 메모리 관리를 자동으로 수행한다. 스택 기반으로 동작한다.
자바 컴파일러에 의해 자바 소스 파일은 바이트 코드로 변환된다. 이러한 바이트 코드를 JVM에서 읽어들인 다음, 여러 과정을 거쳐 어떤 운영체제에서든지 프로그램을 실행할 수 있게 하는 것이다.
JVM 메모리 구조
JVM의 구조는 Garbage Collector, Execution Engine, Class Loader, Runtime Data Area로, 4가지로 나누어진다.
자바 소스 파일은 자바 컴파일러에 의해서 바이트 코드 형태인 클새스 파일이 된다.
이 클래스 파일을 클래스 로더가 읽어들이면 JVM이 실행된다.
(1) Class Loader
JVM 내로 클래스 파일을 로드하고, 링크를 배치하는 작업을 수행하는 모듈입니다. 런타임 시에 동적으로 클래스를 로드한다.
(2) Execution Engine
클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명령어 단위로 읽어 실행한다.
(3) Garbage Collector
Garbage Collector(GC)는 힙 메모리 영역에서 생성된 객체 중에서 참조되지 않은 객체들을 탐색 후 제거한다. GC가 역할을 하는 시간을 정확히 알 수 없다.
(4) Runtime Data Area
JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역. 영역은 크게 Method Area, Stack Area, PC Register, Native Method Stack으로 나누어 진다.
(1) Method Area(= Class Area)
모든 쓰레드가 공유하는 메모리 영역. 메소드 영역은 클래스 정보(멤버 변수의 이름), 변수정보(데이터타입, 접근제어자정보), 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관합니다. JVM이 동작해서 클래스가 로딩될 때 생성
(2) Heap Area
모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역. 메소드 영역에 로드된 클래스만 생성 가능하고 Garbage Collector가 참조되지 않은 메모리를 확인하고 제거하는 영역
(3) Stack Area
메서드 호출 시마다 스택 프레임(그 메서드만을 위한 공간)이 생성된다. 그리고 메서드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다. 메서드 수행이 끝나면 프레임별로 삭제한다.
(4) PC Register
쓰레드가 시작될 때 생성된다. 생성될 때마다 생성되는 공간으로 쓰레드마다 하나씩 존재한다. 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행 중인 JVM 명령의 주소를 갖는다.
(5) Native Method stack
자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역입니다.