들어가며
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의 이유에 대해 아시는 분 댓글 부탁드립니다.
'개발 > 개발관련' 카테고리의 다른 글
[개발관련] ssh 리모트 터널링과 로컬 터널링 (0) | 2024.07.25 |
---|---|
[개발관련] Java_ 대량의 CSV Insert, 그리고 OutOfMemoryError 발생! (0) | 2024.07.07 |
[개발관련] JAVA_ IPv4 String to Int 변환 (2의 보수, 비트 연산) (0) | 2024.06.22 |
[개발관련] Docker_ MariaDB Container 만들기 (0) | 2024.06.01 |
[개발관련] JAVA_ SLF4J와 Logback에 대한 이해(+ServiceLoader) (0) | 2024.05.24 |