2013-02-22 5 views
25

내 앱이 시작될 때 자주 호출되는 성능에 중요한 메소드가 있습니다. 결국, JIT 컴파일을 얻지 만 인터프리터에서 눈에 띄는 시간이 지나면 안됩니다.JVM이 주어진 메소드를 네이티브하게 컴파일하도록 강제 할 수 있습니까?

JVM에게이 메서드를 처음부터 컴파일하려면 (-XX:CompileThreshold과 같은 다른 내부 요소를 조정하지 않고) 컴파일하고 싶다고 말할 수있는 방법이 있습니까?

+0

당신은 그 방법의 사실적인 합성 워밍업을 실행할 수 있습니까? 아니면 위장 할 수없는 것들을 할 수 있습니까? – Matt

+1

이 메서드는 시작 직후 큰 구성 파일을 구문 분석하는 데 사용되며 속도를 높이려는 것입니다. 인공 워밍업은이 시점에서 아무런 효과가 없을 것입니다. –

+0

구성을 단순화 할 수 있습니까? xml에서 더 간단한 속성 형식으로 변경하거나 코드를 읽는 데 필요한 양을 줄이십시오. 어쩌면 구성을 "부팅"부분으로 나눌 수 있습니다. 가능한 한 작아서 시작하고 백그라운드에서로드 할 수있는 주요 부분을 만드시겠습니까? 코드를 해석하더라도 스레드 스레딩 속도가 빨라지므로 작업을 병렬 처리 할 수 ​​있습니까? – radai

답변

32

내가 아는 유일한 방법은 -Xcomp 플래그이지만 일반적으로 사용하지 않는 것이 좋습니다. 처음 실행될 때 모든 클래스와 메소드에 대해 즉시 JIT 컴파일을 강제 실행합니다. 단점은 JIT 활동 증가로 인해 초기 시작시 성능이 저하된다는 것입니다. 이 플래그의 또 다른 주요 제한 사항은 JIT가 일반적으로 수행하는 점진적 프로파일 링 기반 최적화를 사용 불가능하게하는 것입니다. 표준 혼합 모드에서 JIT 컴파일러는 수집 된 프로파일 링 및 런타임 정보를 기반으로 코드의 일부를 지속적으로 최적화 및 재 컴파일 할 수 있습니다. 이를 통해 누락되었지만 필요한 것으로 밝혀진 경계 검사와 같은 오류 최적화를 "수정"할 수 있습니다. -Xcomp은 프로파일 링 기반 최적화를 비활성화하고 프로그램에 따라 전체적인 성능 손실을 최소화 할 수 있습니다 또는 시작시 실제 이득이 없으므로 사용하지 않는 것이 좋습니다. (주어진 방법의 많은 사형 집행이 JIT가 최적화/컴파일하기 전에 통계를 수집 해석하여 모드에서 실행하는 방법을 제어)

(매우 잔인) -Xcomp에 넘어

-XX:CompileThreshold-Xbatch있다. 이렇게하면 JIT 컴파일이 "포 그라운드"로 강제로 수행되므로 기본적으로 메소드가 컴파일 될 때까지 메서드 호출을 백그라운드에서 컴파일하는 대신 정상적으로 차단합니다.

사용중인 Java 버전을 지정하지 않았지만 Java 7이 옵션 인 경우 "계층화 된 컴파일"(-XX:+TieredCompilation 스위치로 활성화 됨)이라는 새로운 JIT 모델이 도입되었습니다. 계층화 된 컴파일은 수집 된 프로파일 링 데이터를 기반으로 메소드의 첫 번째 사용시 더 작은 컴파일 통과를 허용하고 나중에 더 큰 더 큰 컴파일/최적화를 허용합니다. 너 한테 재미있을 것 같은데.

아마 몇 가지 추가 조정 및 매개 변수/구성이 필요하지만 더 자세히 조사 할 필요는 없습니다.

+0

이러한 모든 옵션을 사용해 주셔서 감사합니다. 너무 좋지는 않지만 더 미세한 레벨로 설정할 수는 없습니다 ... –

+0

장기 실행에서 TieredCompilation이 너무 많은 데미지를 줄 것이라고 생각합니다. – radai

2

코드가 완전히 사전 처리 될지 확실하지 않지만 중요한 메소드가있는 클래스를 JVM의 공유 데이터 덤프에 추가 할 수 있습니다. 자세한 내용은 this question을 참조하십시오.

도 JNI를 고려해 보셨습니까? 귀하의 방법이 CPU를 매우 집중적으로 사용한다면 상당히 속도가 빨라질 수 있습니다.

+0

흥미 롭습니다. 그것은 단지 클래스 로딩을 향상시키고 JIT 컴파일러를 만지지는 않는다. 또는 나는 무엇인가 놓치고 있냐? JNI를 피하고 우리가 배포하는 모든 플랫폼에서 원시 코드를 컴파일해야합니다. –