진짜 개발자
본문 바로가기

Language/Java

Java - 자바 가상머신(JVM: Java Virtual Machine)

728x90

JVM 이란?

- 프로그램을 실행하기 위해 물리적 머신과 유사하게 소프트웨어로 머신을 만든 것

- JAVA와 OS사이에서 중개자 역할을 하여 OS와 독립적으로 JAVA가 실행 가능하게 한다.

(참조 - http://asfirstalways.tistory.com/m/158

https://dev-jangwon.github.io/java/2017/06/26/java-jvm/)



JAVA 프로그램 실행과정


1. 프로그램 실행시 OS로 부터 필요로하는 메모리를 할당 받는다

2. Javac 가 소스코드인 .java파일을 읽어 바이트코드(.class)로 컴파일 한다.

3. Class Loader가 필요한 class 파일들을 동적으로 로딩한다

4. 로딩된 class파일들은 Execution Engine을 통해 해석된다

5. 해석된 바이트 코드는 Runtime Data Areas 에 배치되어 수행이 이루어진다.



JVM 구조

<그림출처 - https://medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2>

1. Class Loader    

- Compile 타임이 아니라 Runtime시 클래스를 동적으로 참조한다

  => 즉 클래스를 처음으로 참조할 때 해당 클래스를 로드하고 링크하는 것이다.


2. Execution Engine 

- Class Loader에 의해 JVM내의 Runtime Data Areas에 로드된 Class의 ByteCode를 실행하는 Runtime Module

- 달리 말하면 Class Loader에 의해 Runtime Data Areas에 로드되지 않은 클래스들은 실행할 수 가 없다.


3. Interpreter

- 기본적으로 JAVA는 인터프리터 방식 즉 한줄한줄 코드를 해석하고 실행하는 형식이다


4. Jit

- Interpreter 방식이 느리다는 단점을 보완하기 위해 등장

- 고급언어를 번역하는데 역시 시간이 걸리기 때문에 일정 수준이 넘지 않는이상 Interpreter방식을 사용한다


5. Runtime Data Areas

- 프로그램 수행을 위해 OS로 부터 할당받은 메모리 공간이다


Thread 별 할당

  PC Register - Thread가 시작될 때 생성된다 (Thread 마다 하나씩 존재)

- Thread가 현재 수행할 명령의 주소를 갖는다

 JVM Stack - 지역변수 , 매개변수 , 리턴값 및 연산시 임시 값들을 저장한다.

- Method 와 Method 정보들을 저장한다

 Native Method Stack - 소프트웨어에서 처리할 수 있는 ByteCode가 아닌 실제 실행가능한 기계어로 작성된 프로그램을 실행하는 영역

               - Java가 아닌 다른 언어로 작성된 코드를 위한 영역이다.

 오직 하나만 할당

 Heap - 객체를 저장하는 가상 메모리 영역

   - new 연산자로 생성된 객체 저장

   - 배열 저장

   - Method Area(Class area) 에 등재된 클래스만 이곳에 저장될 수 있다.

 Runtime Constant Pool - 클래스 및 인터페이스의 상수가 저장됨

                                         - 메소드와 필드에 대한 모든 레퍼런스를 가지는 테이블로 실제 메모리상 주소를 찾을 때 항상 이곳을 참조함