JDK 17 이전 reflection 방식에서는 reflection inflation이 발생했다.
LayoutDialect를 제거하면서 Metaspace가 안정된 이유를 요약해보자면
LayoutDialect는 groovy 언어로 작성된 라이브러리이다.
→ 그 클래스 내부에 있는 클로저들 (자바의 람다 같은 개념)은 클래스로 컴파일된 상태로 jar에 포함되어 있다.
→ 그 클래스에는 doCall() 메서드가 있는데, 이 메서드 각각을 리플렉션으로 호출하는 횟수가 15회가 넘어가면 JVM이 최적화를 위해 GeneratedMethodAccessor의 바이트코드를 생성한다.
(JDK 17까지 이러한 방식이었으나, 18 이후로는 MethodHandle 방식으로 리플렉션하도록 바뀌었다.)
→ 이 클래스를 로드하는 클래스로더는 DelegatingClassLoader이다.
참고
comments 2
흥미로운사람#41
reflection inflation으로 생성된 GeneratedMethodAccessor가 DelegatingClassLoader에 쌓인다는 내용이 굉장히 흥미롭네요. 글 잘 읽었습니다! Metaspace 증가 원인을 이해하는 데 큰 도움이 될 것 같아요!
흥미로운 주인장#42
DelegatingClassLoader가 GeneratedMethodAccessor 클래스를 로드하는 클래스로더라고 이해해주시면 될 것 같습니다! 감사합니다:)
댓글 작성
이름·비밀번호는 이 댓글에만 사용됩니다