클라우드 낚시꾼

[JAVA] 심볼릭 레퍼런스와 다이렉트 레퍼런스 본문

Programming Language/JAVA

[JAVA] 심볼릭 레퍼런스와 다이렉트 레퍼런스

KanuBang 2024. 11. 13. 14:37
728x90

심볼릭 레퍼런스와 다이렉트 레퍼런스

  • 심볼릭 레퍼런스: 클래스 파일 내에 사용되는 기호적인 참조를 의미한다. (클래스 이름, 메서드 이름 등)
  • 다이렉트 레퍼런스: 실제 메모리 주소나 런타임 시점에 참조할 수 있는 위치를 의미한다.

심볼릭 레퍼런스를 다이렉트 레퍼런스로 변환하는 이유

 

심볼릭 레퍼런스는 메모리 주소나 위치를 직접 나타내지 않으므로, 실행 시 마다 이를 반복적으로 확인하면 성능이 저하될 수 있다. 다이렉트 레퍼런스는 JVM이 런타임 시점에 해당 참조를 빠르게 액세스할 수 있기에 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변환한다.

 

심볼릭 레퍼런스를 다이렉트 레퍼런스로 변환하는 과정

  1. 로딩 및 검증 단계: JVM은 클래스 파일을 읽어드린 후, 심볼릭 레퍼런스가 참조하는 대상이 존재하는 지 확인한다.
  2. 해석 단계: JVM은 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변환한다. 이 과정에서 실제 메모리의 위치나 실행 시점에 참조할 수 있는 위치가 확정된다.

심볼릭 레퍼런스를 다이렉트 레퍼런스로 변환하는 예시

 

1. 로딩 및 검증 단계

 

자바 소스 코드에서 System.out.println("Hello")는 System이라는 클래스의 out이라는 PrintStream 객체의 println 메서드를 호출하는 심볼릭 레퍼런스이다. 컴파일된 바이트코드에서는 메서드 호출이 invokestatic 명령어로 명시되며, 심볼릭 레퍼런스를 통해 java/lang/System 클래스와 println 메서드를 참조하게 된다,

 

2. 해석 단계

 

JVM이 클래스를 로드하고 검증 및 해석 과정을 거치면, System.out과 println 메서드의 실제 메모리 주소나 런타임 위치에 대한 다이렉트 레퍼런스를 생성한다. 이후에는 이 다이렉트 레퍼런스를 통해 빠르게 메서드를 호출할 수 있다.


728x90