RelinkableCallSite
RelinkableCallSite (재연결 가능 콜 사이트)
DynamicLinker가 관리하는 콜 사이트를 위한 인터페이스입니다. Dynalink 사용자는 CallSite의 하위 클래스 중 이 인터페이스도 구현하는 것을 콜 사이트 구현으로 사용해야 해요.
본문
바로 사용 가능한 하위 클래스로는 모노모픽(단형) 인라인 캐싱 전략을 구현한 SimpleRelinkableCallSite와, 폴리모픽(다형) 인라인 캐싱 전략을 구현해 이전에 연결한 메서드 핸들들의 체인을 유지하는 ChainedCallSite가 있어요. 재연결 가능 콜 사이트는 DynamicLinker.link(RelinkableCallSite)로 연결된 뒤 그 DynamicLinker 객체가 관리합니다.
콜 사이트는 첫 호출 시점에 실제 인자에 맞춰 연결되는데, 이 지연 연결 방식을 통해 실제 사용되는 조합만 메서드 핸들로 만들어 성능을 최적화할 수 있어요. 가드가 실패하면 재연결(re-link)이 일어나 더 적절한 타깃으로 다시 연결됩니다.
주요 메서드
-
getDescriptor()— 이 콜 사이트의 설명자(CallSiteDescriptor)를 반환합니다. -
initialize(MethodHandle relinkAndInvoke)— 동적 링커가 재연결 가능 콜 사이트를 초기화할 때 호출해, 재연결-및-호출(relink-and-invoke) 메서드 핸들을 설정합니다. 콜 사이트 구현은 이 핸들을CallSite.setTarget(MethodHandle)으로 자신의 타깃으로 설정해야 해요. 이 핸들은 첫 호출 시 인자에 따라 콜 사이트를 적절한 타깃으로 재연결하고 그 연결된 타깃을 호출합니다. -
relink(GuardedInvocation guardedInvocation, MethodHandle relinkAndInvoke)— 콜 사이트가 재연결될 때마다 동적 링커가 호출합니다. -
resetAndRelink(...)— 콜 사이트가 재연결되고, 링커가 이전 연결 상태를 버리길 원할 때 호출됩니다.relink와의 차이점이 바로 이전 상태를 버리는 여부예요.