Java Compiler
흔히 우리가 JIT Compiler 라고 부르는 Compiler 는 실행중에 바이트 코드를 여러가지 다양한 테크닉을 사용하여 JVM 해석 엔진 없이 바로 수행되는 기계어 코드를 만들어 낸다. 그럼으로써 바이트 코드가 가지는 장점과 기계어가 가지는 장점을 결합할 수 있다.
과정
1. Java Compiler (javac 명령어 실행)에 의해 Java Source ( .java 확장자) 로부터 Byte Code ( .class 확장자 )가 생성된다.
2. JVM에 있는 Class Loader 에 의해 Byte Code는 JVM내로 로드되고 실행엔진에 의해 기계어로 해석되어 메모리 상 ( Runtime Data Area)에 배치된다.
3. 실행엔진에는 Interpreter와 JIT ( Just - In - Time )compiler 가 있는데, Interpreter에 의해 Byte Code를 한 줄씩 읽어 실행하다가 적절한 시점에 Byte Code 전체를 컴파일하고 더이상 인터프리팅하지 않고 해당 코드를 직접 실행한다.
- JIT Compiler 에 의해 해석된 코드는 캐시에 보관하기 때문에 한번 컴파일된 후에는 빠르게 수행할 수 있다는 장점이 있다. 하지만 코드 전체를 컴파일하기 때문에 인터프리팅하는 것보다 시간이 오래 걸리므로 한번만 실행해도 되는 코드에 대해서는 인터프리팅하는 것이 유리하다.
- Interpreter : 자바 Byte Code를 한줄씩 실행, 전체 성능면에서 불리
- JIT Compiler : 전체 Byte Code를 컴파일하고 캐시에 보관해 놓고 직접 실행. 한 번만 실행해도 되는 코드에 대해서는 Interpreter가 유리하다.
장점
- 생성되는 코드의 안정성
- Java 가 수행중 만들어 내는 기계어 코드는 안전한 공간(sandBox)안에서 돌아가기 때문에 외부 해킹에 안전
- 동작하는 메모리 공간의 안전성
- 모든 자바 객체들은 Heap 이라는 독립적인 공간에서만 수행
- 다른 Process 와 다른 메모리 공간을 사용하기 때문에 Stack Overflow에 강함
- 최적화 재사용에 유일한 관련 클래스간 상속구조
- 메모리 위치상 가깝게 관련된 객체와 메소드들을 위치시킨다.
- method inlining 같은 성능을 높이기 위한 테크닉들이 자바에서 효율적으로 작동
- 동적 최적화와 그것에 대한 취소, 재 최적화 가능
- Static 언어와 다르게 Dynamic class loading 으로 어떤 방식으로든 수행중 변경 가능 compiler 를 통한 최적화가 수시로 이루어 진다.
Compiler 기술들
- Hot Spot Detection
- JVM이 Byte Code를 해석하다가 루프등을 만나 몇번이나 중복적인 해석이 이루어진다 판단되면 Byte 코드를 기계어로 직접 컴파일하는 방식
- 기존의 모든 기본 코드를 수행전에 컴파일 하는 방식은 수행 자체는 빠르지만 프로그램 크기가 커지고 기기별 이식성이 떨어지기도 한다.
- Method inlining
- 클래스 안에서 사용된 다른 클래스에 대해 Method inlining 을 수행함으로서 다른 메모리 공간에 있는 메소드에 대해 호출하는 것을 피할 수 있다.
- 이걸 취소할 수도 있다.
- Reflection
- 객체를 명시적으로 코드에서 new하지 않아도 임의의 객체를 동적으로 생성하고 메소드를 호출할 수 있는 reflection 은 자바 동적 클래스로딩의 핵심
'Live-Study' 카테고리의 다른 글
1주차 : JVM 구성 요소 (0) | 2021.02.28 |
---|---|
1주차 : JIT 컴파일러란 무엇이며 어떻게 동작하는지 (0) | 2021.02.28 |
1주차 : Byte Code 란 무엇인가 ? (0) | 2021.02.28 |
1주차 : 실행하는 방법 ( JVM 실행 방법 ) (0) | 2021.02.23 |
1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. #1 (0) | 2021.02.21 |