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/
 
      
    
댓글남기기