Java Virtual Machine-컴파일 수준
JVM은 5 가지 컴파일 레벨을 지원합니다-
- Interpreter
- 전체 최적화가 적용된 C1 (프로파일 링 없음)
- 호출 및 백 에지 카운터가있는 C1 (라이트 프로파일 링)
- 전체 프로파일 링이있는 C1
- C2 (이전 단계의 프로파일 링 데이터 사용)
모든 JIT 컴파일러를 비활성화하고 인터프리터 만 사용하려면 -Xint를 사용하십시오.
클라이언트 대 서버 JIT
-client 및 -server를 사용하여 각 모드를 활성화합니다.
클라이언트 컴파일러 (C1)는 서버 컴파일러 (C2)보다 빨리 코드 컴파일을 시작합니다. 따라서 C2가 컴파일을 시작했을 때 C1은 이미 코드 섹션을 컴파일했을 것입니다.
그러나 기다리는 동안 C2는 C1보다 더 많이 알기 위해 코드를 프로파일 링합니다. 따라서 최적화에 의한 오프셋을 사용하여 훨씬 빠른 바이너리를 생성 할 수있는 경우 대기하는 시간입니다. 사용자의 관점에서 볼 때 프로그램 시작 시간과 프로그램 실행에 걸리는 시간 사이의 절충안이 있습니다. 시작 시간이 프리미엄이면 C1을 사용해야합니다. 애플리케이션이 오랫동안 실행될 것으로 예상되는 경우 (일반적으로 서버에 배포 된 애플리케이션) C2를 사용하는 것이 더 빠른 코드를 생성하여 추가 시작 시간을 크게 상쇄하므로 더 좋습니다.
IDE (NetBeans, Eclipse) 및 기타 GUI 프로그램과 같은 프로그램의 경우 시작 시간이 중요합니다. NetBeans를 시작하는 데 1 분 이상 걸릴 수 있습니다. NetBeans와 같은 프로그램이 시작되면 수백 개의 클래스가 컴파일됩니다. 이러한 경우 C1 컴파일러가 최선의 선택입니다.
C1에는 두 가지 버전이 있습니다. 32b and 64b. C2는64b.
계층 형 컴파일
Java의 이전 버전에서 사용자는 다음 옵션 중 하나를 선택할 수 있습니다.
- 통역사 (-Xint)
- C1 (-클라이언트)
- C2 (-서버)
Java 7에서 제공되었습니다. C1 컴파일러를 사용하여 시작하고 코드가 뜨거워지면 C2로 전환합니다. 다음 JVM 옵션으로 활성화 할 수 있습니다. -XX : + TieredCompilation. 기본값은set to false in Java 7, and to true in Java 8.
5 가지 컴파일 계층 중 계층 형 컴파일은 1 -> 4 -> 5.