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 - 클래스 및 인터페이스의 상수가 저장됨 - 메소드와 필드에 대한 모든 레퍼런스를 가지는 테이블로 실제 메모리상 주소를 찾을 때 항상 이곳을 참조함 |
'Language > Java' 카테고리의 다른 글
Java - Static 이해 (0) | 2018.10.28 |
---|---|
Java - 초기화 순서 (0) | 2018.10.28 |
Java - 쓰레드 동기화 (Synchronized) (0) | 2018.08.26 |
Java - 멀티쓰레드 (Multi Thread) (0) | 2018.08.26 |
Java - InputStream 의 read()메소드는 왜 int형을 반환 하는가 (0) | 2018.08.25 |