2017-10-01 1 views
2

그래서 JVM + LogCompilation 출력 "수신자가 너무 크다" 컴파일러에 의해 인라인되지 않음).의미 구체적인 방법 (및 결정과 관련된</p> <pre><code>callee is too large </code></pre> <p>및</p> <pre><code>too big </code></pre> <p>인쇄 된 메시지가있는 + LogCompilation의 출력

"수신자"방법 그 자체가 아닙니까? 그 밖의 무엇을 의미 할 수 있습니까? 그렇다면 "너무 큰 것"과 "너무 큰 것"의 차이점은 무엇입니까? - 같은 것을 의미하지는 않습니다 (동일한 로그 메시지, 다른 엔지니어가 동일한 언어를 사용하는 엔지니어 일 수도 있습니다)

"수신자"가 실제로 "발신자"를 의미 할 수 있습니까?
두 이유 중 하나가 인라인되지 않는 것이 합법적입니다. 나는 이것을 이해하지 못한다는 사실이 약간 난처 해합니다.

+0

확신 할 수는 없지만, 인라이닝이 호출자를 크게 만들 것이라고 말하고 싶습니다 ... "호출 수신자가 너무 큼"에 대해서는 인라인 된 버전이 크다는 것을 나타낼 수 있습니다. 많은 인수가 있어야합니다. 인라인 코드 전후에 준비 ... –

+0

잘 "인라이닝 (inlining)"은 호출자를 더 크게 만들 것입니다 ("너무 큽니다"는 많은 요소에 달려 있음). 나는 왜 2 개의 분리 된 메시지를 묻는가? 그들은 뭔가 다른 것을 의미합니까? – igaz

답변

1

HotSpot JVM에는 C1과 C2의 두 가지 JIT 컴파일러가 있습니다. 그들은 함께 Tiered mode (기본값)에서 작동합니다. inlining strategy은 그리 간단하지 않지만 가장 간단한 요소는 바이트 코드에서 호출 수신자 메서드의 크기입니다. 인라인되는 메소드의 바이트 코드의 크기 인 경우

  • "callee is too large" 메시지 printed by C1 인 인라인 각각의 다음 레벨에 NestedInliningSizeRatio (90 %)를 곱한 값보다 큰 MaxInlineSize (35).
  • "too big""hot method too big"의 메시지는 printed by C2인데, 인라인 될 방법의 크기가 각각 MaxInlineSize (35) 또는 FreqInlineSize (325)보다 클 경우입니다.

두 메시지는 거의 같지만 컴파일 계층이 다릅니다.