RelinkableCallSite

RelinkableCallSite (재연결 가능 콜 사이트)

DynamicLinker가 관리하는 콜 사이트를 위한 인터페이스입니다. Dynalink 사용자는 CallSite의 하위 클래스 중 이 인터페이스도 구현하는 것을 콜 사이트 구현으로 사용해야 해요.

출처: Java API Reference

본문

바로 사용 가능한 하위 클래스로는 모노모픽(단형) 인라인 캐싱 전략을 구현한 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와의 차이점이 바로 이전 상태를 버리는 여부예요.

더 알아보기

Java 공식 API