JVM (Java Virtual Machine)
업데이트:
JVM
JVM (Java Virtual Machine) 역할
- 애플리케이션을 클래스 로더를 통해 읽어 들여
자바 API
와 함께 실행하는 것이다. Java
와OS
사이에서 중개자 역할을 수행한다.Java Byte Code (.class file)
를OS
에 맞게 해석하여JVM
위에서OS
와 상관없이 실행된다.- 어느 환경에서나
JVM
이 설치되어 있다면,Java
코드를 실행할 수 있다.
- 어느 환경에서나
JVM
은 스택기반의 가상머신이며, 메모리 관리와 Garbage Collection을 수행한다.
Java 프로그램 실행과정
- 프로그램이 실행되면
OS
가JVM
에게 필요한 메모리를 할당한다. 자바 컴파일러(javac)
가자바 소스코드(.java)
를 읽어자바 바이트코드(.class)
로 변환한다.Class Loader
를 통해 class 파일들을 JVM으로 로딩한다.- 로딩된 class 파일들은
Excution engine
을 통해 해석된다. - 해석된 바이트 코드는
Runtime Data Areas
에 배치되어 실질적인 수행이 이루어지게 된다.
JVM 구조
Class Loader
Runtime
시점에 클래스(.class
)를 로드하고, 클래스의 인스턴스를 생성하면 클래스 로더를 통해 메모리에 로드하게 된다.jar
파일 내 저장된 클래스들을JVM
위에 올리고 사용하지 않는 클래스들을 메모리에서 삭제한다.
Excution Engine
- 클래스를 실행시키는 역할이다. 클래스 로더가
JVM
내의 런타임 데이터 영역에 바이트 코드를 배치시키고, 이것은Excution Engine
에 의해 실행된다. - 자바 바이트 코드는 기계가 바로 수행할 수 있는 언어보다는 비교적 인간이 보기 편한 형태로 기술된 것이다.
Excution Engine
은 이러한 바이트 코드를JVM
내부에서Interpreter
혹은JIT(Just In Time)
방식을 통해 기계가 실행할 수 있는 형태로 변환한다.
Runtime Data Area
JVM
이 프로그램을 수행하기 위해OS
로부터 할당 받은 메모리 공간을 말한다.
Runtime Data Area 상세
-
PC Register
Thread
가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로 스레드마다 하나씩 존재한다. 스레드가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인JVM
명령의 주소를 갖는다. -
JVM Stack
프로그램 실행과정에서 임시로 할당되었다가 메서드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역이다. 각종 형태의 변수나 임시 데이터, 스레드나 메서드의 정보를 저장한다. 메서드 호출 시 마다 각각의 스택 프레임이 생성되고 메서드 수행이 끝나면 해당 스택 프레임은 삭제된다.
메서드 내부에서 사용되는 로컬 변수들과 매개 변수 및 해당 메서드 주소가 저장되며,
primitive type
값도 저장된다. -
Native Method Stack
자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역이다. 자바 이외의 언어(C, C++, 어셈블리)로 작성된 코드를 실행할때 해당 스택이 할당된다.
-
Method Area (= Class or Static area)
클래스 파일의 바이트 코드가 로드되는 영역이다. 프로그램을 실행 할 때 사용되는 클래스 파일들을 메모리에 올려놓는다. 어떤 메서드가 호출되면 스태틱 영역에 로드된 클래스에서 해당 메서드를 찾아 호출한다. 메인 메서드에서 사용하는 전역변수나 스태틱 변수 등이 이 영역에 올라온다.
-
Heap
객체를 저장하는 가상 메모리 공간이다.
new
연산자로 생성된 객체와 배열을 저장한다.(모든Object type
) 클래스 영역에 올라온 클래스들만 객체로 생성할 수 있다. 힙 영역에 저장된 데이터는 메소드 호출이 끝나도 유지되며, 스택에서 가리키는 포인터값이 없으면 GC에 의해 메모리 해제된다.
References
- https://asfirstalways.tistory.com/158
- https://wooody92.github.io/java/JVM과-메모리-구조/
- https://yaboong.github.io/java/2018/05/26/java-memory-management/
댓글남기기