JVM에 대해 좀 더 자세히 알아보자.
JVM의 구조는 크게 클래스 로더(Class Loader), 런타임 데이터 영역(Runtime Data Area), 실행 엔진(Execution Engine), 그리고 가비지 컬렉터(Garbage Collector)로 나뉜다.
클래스 로더
: 자바는 동적으로 클래스를 읽어오기 때문에 프로그램이 실행 중인 런타임에서 모든 코드가 JVM과 연결된다. 이렇게 동적으로 클래스를 로딩해주는 역할을 하는 것이 클래스 로더이다. 클래스 로더는 .class
파일을 묶어서 런타임 데이터 영역으로 적재한다.
런타임 데이터 영역
: 런타임 데이터 영역은 JVM이 프로그램을 수행하기 위해 운영체제로부터 독립적으로 할당받은 메모리 공간을 말한다. 크게 5가지 영역으로 나눌 수 있다.
new
연산자를 이용해 생성된 객체를 저장하는 영역이다. 또한 주기적으로 가비지 컬렉터가 제거하는 영역이다.실행 엔진
: .class
파일이 런타임 데이터 영역의 Method Area에 배치된 이후에 JVM은 Method Area의 바이트 코드를 실행 엔진에 제공하여 정의된 내용대로 바이트 코드를 실행시킨다. 이 때, 로드된 바이트 코드를 실행하는 런타임 모듈이 실행 엔진이다. 실행 엔진은 바이트 코드를 명령어 단위로 읽어서 실행한다. 인터프리터 방식과 JIT Compiler 방식을 사용한다.
가비지 컬렉터(GC, Garbage Collector)
: 유효하지 않은 메모리인 가비지(Garbage)를 정리해 메모리를 관리하는 역할을 한다. GC의 과정 등 더 자세한 내용은 다음에 알아보자.
모든 스레드가 공유해서 사용(GC의 대상)
스레드마다 하나씩 생성