사전 지식
인터프리터와 컴파일러의 차이
인터프리터 | 컴파일러 |
한문장씩 읽고 바로 기계어 변환 후 실행 | 모든 소스코드를 기계어 파일로 변환하고 실행. |
python,php.... | c,c++,java... |
한줄씩 읽어 기계어로 변환 후 실행하는 면에서 빨라보이지만 | 만들어둔 실행 파일만 읽으면 되므로 실행속도 더 빠르다. |
JVM 구조
전체적인 흐름 : .java -> (javaC) ->.class (JVM이 이해할 수 있는 중간 언어)(바이트코드)-> 기계어 변환
요약 : class Loader를 통해 바이트 코드를 JVM내로 로드하고 Runtime data Area로 거쳐 Execution Engine으로 들어가 바이트 코드로 변환. (2가지 방식 JIT,Interpreter)
Compile 과정
.java를 javC에 의해 .class 를 생성하고 JVM의 class loader에게 전달하고 Execution Engine 들어가고 기계어로 번역한다.
class loader의 세부동작
- 로드 : 클래스 파일을 가져와 JVM메모리에 로드.
- 검증 : 자바언어 명세 및 JVM 명세에 잘 구성되었는지 검사.
- 준비 : 클래스가 필요로 하는 메모리를 할당.(feild,method,interface ....)
- 분석 : 클래스 상수 풀 내 모든 심볼릭 가상메모리 주소를 실제 메모리 주소로 변경.
- 초기화 : 클래스 변수들 값 초기화.(static field)
Execution Engine의 세부동작
- jvm 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져오 실행.
- 실행 엔진 방식 2가지
- Just In Time Compiler(JIT)
- 인터프리터의 단점을 보완하기 위해 도입된 방식.
- 인터프리터 방식으로 진행하다가 적정한 시점에 바이트코드 전체를 기계어로 변경하는 방식.
- 전체를 변환하는 과정에서 캐싱을 이용하므로 인터프리터의 단점을 극복.
- Interpreter : 위 설명과 동일.
- Just In Time Compiler(JIT)
자바 컴파일러로 바이트코드를 만들고, JVM을 거쳐 기계어로 번역하기 때문에 "Write Once, Run Anywhere" 란 문구를 가지게 되었다.
- JVM이 설치된 기계만 있으면 모든 곳에서 작동한다.
- OS마다 같은 코드라도 컴파일 후 생성된 기계어가 달라지는 점을 보완하였다.
- 이러한 특징을 한 단어로 Portability 이식성이라고 한다.
'JAVA' 카테고리의 다른 글
Garbage Collector (0) | 2021.04.25 |
---|---|
Reflection (0) | 2021.04.16 |
제네릭 타입의 컴파일 영향 (1) | 2021.04.10 |
JVM 구조와 버전에 따른 변경 (0) | 2021.03.28 |
Wrapper Class 와Primitive Type and First Class Collection (0) | 2021.03.21 |
댓글