개발/개발관련

[개발관련] @ForceInline 테스트

mabb 2024. 7. 3. 22:41
반응형

 

들어가며

Properties.java를 들여다보던 중 Objects의 requiredNonNull 메서드에 붙어있는 @ForceInline 어노테이션을 살펴보게 되었습니다. 메서드 인라인을 강제하는 어노테이션 정도로 이해하였고, 이것이 성능을 위한 조치인 지 잘 이해가 되지 않았습니다. 문의를 해보니 스택트레이스 출력 때문인 것 같다는 의견이 있었습니다. 그래서 검증을 해보고자 테스트해보았습니다.

메서드가 인라인화 되어 메서드의 본문이 참조되니까 스택트레이스에는 해당 메서드를 호출한 스택 상위의 메서드까지만 스택 트레이스가 출력될 것으로 예상하였습니다.

 

문제의 @ForceInline 어노테이션이 붙어있는 requireNonNull 메서드입니다.

 

1. 어노테이션을 붙이지 않고 예외를 던져 스택 트레이스를 확인합니다.

 

 

throwException(CsvReader.java:67)에서 스택트레이스가 확인됩니다.

 

해당 어노테이션을 붙이면 어떻게 달라지는지 확인해보고자 하였습니다. 하지만 @ForceInline 어노테이션은 기본 라이브러리 수준에서 Import가 되지 않는 것으로 보아 자바의 표준 어노테이션이 아닌 듯합니다. 그래서 복사하여 만들어 주었습니다.인 줄 알았으나 jdk 하위 패키지에 있었습니다.

import jdk.internal.vm.annotation.ForceInline;

 

 

 

2. 어노테이션을 붙이고 스택트레이스를 확인합니다.

 

결과가 동일합니다.

 

테스트가 잘못된 것인지, @ForceInline을 붙인 다른 이유가 있는 것인지 모르겠습니다. 혹시 아시는 분 계시면 댓글로 알려주시면 감사하겠습니다.

 

Objects의 메서드를 그대로 사용하여도 스택트레이스는 동일합니다.

 

주석으로 볼 때, 핫스팟VM이 아니어서 그런 것일 수도 있을 것 같습니다.

 

VM의 이름이 OpenJDK 64-Bit Server VM이라고 나옵니다.

 

VM이 핫스팟 VM이 아닌가 봅니다.

 

그런데 GPT는 해당 VM이 핫스팟 VM의 일종이라고 합니다.

 

 

 

결론

  • 추가적인 분석이 필요할 것 같습니다.

 

혹시 requiredNonNull에 붙은 @InlineForce의 이유에 대해 아시는 분 댓글 부탁드립니다.

 

반응형