IT이야기

-XX:-TieredCompilation

cyworld 2021. 10. 15. 21:06
반응형

-XX:-TieredCompilation은 정확히 무엇을 합니까?


사용 java -XX:+PrintFlagsFinal하여 TieredCompilation깃발을 찾았고 온라인에서 이에 대해 조금 읽었습니다.

그러나 로 설정할 때 어떤 일이 발생 하는지 정확히 알지 못합니다 false.

컴파일 시스템은 기본적으로 인터프리터, C1 및 C2로 분할된 5가지 실행 수준을 지원한다는 것을 알고 있습니다.

  • 레벨 0 - 통역사
  • 레벨 1 - 전체 최적화가 있는 C1(프로파일링 없음)
  • 수준 2 - 호출 및 백에지 카운터가 있는 C1
  • 레벨 3 - 전체 프로파일링이 있는 C1(레벨 2 + MDO)
  • 레벨 4 - C2

출처: http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/2b2511bd3cc8/src/share/vm/runtime/advancedThresholdPolicy.hpp#l34

두 가지 질문:

(1) 를 설정 -XX:-TieredCompilation하면 이 레벨 중 일부가 비활성화됩니까? 그렇다면 어느 것입니까?

(2) C1 또는 C2를 비활성화할지 또는 전혀 컴파일하지 않을지를 결정하는 플래그가 있습니까?


-XX:-TieredCompilation 메서드가 최대 최적화 수준(C2)에서 해석되거나 컴파일되도록 중간 컴파일 계층(1, 2, 3)을 비활성화합니다.

부작용 TieredCompilation플래그는 컴파일러 스레드 수, 컴파일 정책 및 기본 코드 캐시 크기도 변경합니다. 와 그 주 TieredCompilation장애인

  • 더 적은 컴파일러 스레드가 있을 것입니다.
  • 고급 컴파일 정책 대신 간단한 컴파일 정책(메소드 호출 및 백에지 카운터 기반)이 선택됩니다 .
  • 기본 예약 코드 캐시 크기는 5배 더 작습니다 .

C2 컴파일러를 비활성화하고 추가 오버헤드 없이 C1만 남기려면 를 설정하십시오 -XX:TieredStopAtLevel=1.

모든 JIT 컴파일러를 비활성화하고 인터프리터에서 모든 것을 실행하려면 -Xint.


JIT에는 여러 수준이 있습니다(JIT를 전혀 실행하지 않는 경우 포함).

이전 버전의 Java에서는 인터프리터만 사용하거나 클라이언트(C1) 컴파일러만 사용하거나 서버(C2) 컴파일러만 사용하여 실행하려면 처음에 선택해야 했습니다(예: -Xint, -client, -server).

Java 7과 함께 제공되는 계층형 컴파일은 핫스팟 컴파일러가 이러한 단계 사이를 원활하게 이동할 수 있음을 의미했습니다. 따라서 어떤 일이 발생하면 특정 양의 실행 후에 코드가 C1으로 컴파일되고 더 많은 실행 후에는 C2로 컴파일됩니다. 이것은 메서드별로 실행되므로 앱이 실행될 때 상당한 부분이 인터프리터(콜드 코드용)에서 실행되고 코드가 많이 실행된 후에(핫) 다음으로 컴파일됩니다. 성능이 향상됩니다. 당신은 실행하여 다른 수준을 볼 수 있습니다

$ java -XX:+PrintFlagsFinal -version | grep CompileThreshold
intx Tier2CompileThreshold                     = 0
intx Tier3CompileThreshold                     = 2000
intx Tier4CompileThreshold                     = 15000
openjdk version "1.8.0_92"
OpenJDK Runtime Environment (Zulu 8.15.0.1-macosx) (build 1.8.0_92-b15)
OpenJDK 64-Bit Server VM (Zulu 8.15.0.1-macosx) (build 25.92-b15, mixed mode)

-XX:-TieredCompilation본질적 TieredCompilation=false수단이 전환을하지 않는, 당신은 클라이언트 또는 서버 컴파일러를 사용할지 여부를 전면를 선택해야합니다. JVM은 CPU에 따라 적용할 모드를 경험적으로 결정합니다. 다중 프로세서 또는 64비트 VM이 있는 경우 서버 VM(C2)을 사용하고 그렇지 않은 경우 클라이언트 VM(C1)을 사용합니다.

그래서 -Xint(어떤 컴파일러 즉 없음) 단지 인터프리터로 실행되며 만 C1 또는 C2 중 하나를 선택할 수 있습니다 -client또는 -server와 함께, 각각-XX:-TieredCompilation


Java 8 사용자 TieredComplilation는 부동 소수점으로 프로덕션 사용을 위해 비활성화 하는 것이 좋습니다 .

Oracle은 Java8에서 이 문제를 수정하지 않습니다. 모든 핫스팟 JVM 8 w/ G1GC에는 동일한 문제가 있습니다.

( 버그 1 ) ( 버그 2 )

ReferenceURL : https://stackoverflow.com/questions/38721235/what-exactly-does-xx-tieredcompilation-do

반응형