JVM이란
Java Virtual Machine의 약자.
각각 운영체제별 JVM을 설치한다면, Java 프로그램을 한 번 만들기만 하면 어느 운영체제에서든 실행할 수 있다. → 플랫폼 독립성, 운영체제에 종속적
가비지 컬렉션을 사용하여 메모리 관리를 자동으로 수행한다.
JVM 메모리 구조
JVM은 크게 4가지 구조로 이루어져 있다.
1.
Class Loader
•
JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치 하는 작업을 수행
◦
로드 : 클래스 파일을 바이트 코드로 읽어 메모리로 가져오는 과정
◦
링크 : 바이트 코드가 자바 규칙을 따르는지 검증, 클래스에 정의된 필드, 메소드, 인터페이스들을 나타내는 데이터 구조를 준비하며, 그 클래스가 참조하는 다른 클래스를 로딩한다.
•
클래스 파일을 분석한 뒤에 운영체제로부터 할당받은 Runtime Data Area에 적재.
2.
Runtime Data Area
•
JVM의 메모리 영역으로, 자바 애플리케이션을 실행할 때 사용되는 데이터를 적재하는 영역
a.
Method Area
b.
Heap Area
c.
Stack Area
d.
PC Register
e.
Native Method Stack
3.
Execution Engine
•
Runtime Data Area에 배치된 바이트 코드를 해석하며 실행.
•
이 때 인터프리터 방식과, JIT 컴파일 방식을 혼합하여 해석한다.
1.
인터프리터(Interpreter) 방식 : 바이트 코드를 한 줄씩 읽고 해석한다.
2.
JIT 컴파일(Just-In-Time compile) 방식 : 바이트 코드를 런타임 시점에 바로 기계어로 변환한다.
◦
최초의 JVM은 인터프리터 방식만 사용하여 실행 속도가 느렸지만, JIT 컴파일 방식을 추가하여 이를 보완하고자 했다.
그런데 JIT 컴파일은 바이트코드를 기계어로 바꾸기 때문에 실행 속도가 빠르지만 변환하는 데 비용이 발생하게 된다. 그래서 인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT 컴파일 방식으로 실행한다.
4.
Garbage Collector
•
힙 메모리 영역에 생성된 객체들 중 더 이상 사용하지 않는 객체를 해제시켜 메모리를 반환한다.
•
Garbage Collector가 동작하는 시간은 언제인지 정확히 알 수 없다.
Runtime Data Area 메모리 영역
1.
Method Area
•
모든 쓰레드가 공유하는 메모리 영역.
•
Method Area는 클래스, 인터페이스, 메소드, 필드, static 변수 등의 바이트 코드를 보관.
2.
Heap Area
•
모든 쓰레드가 공유하는 메모리 영역.
•
new 키워드로 생성된 객체와 배열이 생성되는 영역.
•
Method area에 로드된 클래스만 생성이 가능하다.
•
Garbage Collector가 동작하는 영역
3.
Stack Area
•
메소드 호출 시마다 각각의 스택 프레임(그 메소드만을 위한 공간)이 생성됨.
•
그 메소드 안에서 사용되는 값들을 저장하고, 호출된 메소드의 매개변수, 지역변수, 리턴 값, 연산 시 일어나는 값들을 임시로 저장
•
메소드 수행이 끝나면 프레임별로 삭제됨
4.
PC Register
•
쓰레드가 시작될 때 생성되며, 쓰레드마다 하나씩 존재한다.
•
쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지 기록하는 부분
•
현재 수행중인 JVM명령의 주소를 갖는다.