2012-04-09 2 views
14

Java JIT 인라인 메서드 호출을 수행 할 때? 호출자 메서드가 호출 된 횟수 (해당되는 경우 무엇이겠습니까?) 또는 다른 기준 (및 그 내용은 무엇입니까?)을 기반으로합니까?Java : JIT 메서드 인라이닝

나는 JIT가 인라인 'final' 메소드를 사용하지만 런타임 통계를 기반으로하는 비 최 적 메소드도 인라인하므로 트리거링 기준이 무엇인지 알고 싶습니다.

나는 JVM 구현에 따라 답변이 다를 것이라고 생각하지만, 아마도 그들 모두에 공통적 인 것이 있을까요?

+1

쉬운 대답하지만 도움이 될 몇 가지 링크 - http://www.azulsystems.com/blog/cliff/2011-04-04-fixing-the-inlining-problem https : //로 위키 .oracle.com/display/HotSpotInternals/Inline https://wikis.oracle.com/display/HotSpotInternals/PerformanceTechniques – Matt

+0

다소 관련 기사 http://www.ibm.com/developerworks/java/library/j-jtp1029/index .html –

답변

16

짧은 대답은 원할 때마다입니다.

JITC는 흔히 통계를 수집하지 않고 작은 최종 또는 유사 최종 방법을 자동으로 인라인합니다. 이것은 인라이닝이 코드 바이트와 호출을 코딩하는 것을 실제로 저장한다는 것을 쉽게 볼 수 있기 때문입니다 (또는 적어도 거의 "씻어내는"것입니다).

예기치 않은 하위 클래스가 발생할 경우 인라인 된 비공개가 어떻게 든 지켜 져야하므로 통계가 가치 있다고 제안하지 않는 한 실제로는 비 최종 메소드를 인라이닝하지 않습니다.

JITCed 또는 인라인되기 전에 호출 할 수있는 횟수는 가변적이며 실행중인 JVM 내에서도 변경 될 수 있습니다.

+0

'작음'은 # 회선에 따라 다릅니 까? 그렇다면 일반적으로 얼마나 많은 '작은'을 의미합니까? – shrini1000

+4

줄 수가 없습니다. 오히려 생성 된 코드의 예상 바이트 수입니다 (추정치는 매우 미미할 수 있음). JITC는 "줄"을 보지 않고 "바이트 코드"를 봅니다. –

+2

그리고 더 큰 방법을 JITC 할 때 JITC는 일반적으로 생성 된 크기에 대한 "예산"을 가지며 "예산"이 채워질 때까지 인라인으로 물건을 고를 것입니다. –

2

일반적으로 JIT는 기본적으로 "작은"방법 만 인라인합니다. 그것 이외에 그것은 구현에 전적으로 의존합니다.

+0

'작음'은 # 회선에 따라 다릅니 까? 그렇다면 일반적으로 얼마나 많은 '작은'을 의미합니까? – shrini1000

7

서버 핫 스폿 컴파일러를 실행하는 JVM의 기본 인라인 임계 값은 35 바이트 코드입니다.

Official docs