https://dev-dx2d2y-log.tistory.com/139
[CS] JVM 밑바닥까지 파헤치기 독서 #2 - 자바는 어떻게 객체를 저장하는가?
https://dev-dx2d2y-log.tistory.com/138 [CS] JVM 밑바닥까지 파헤치기 독서 #1 - 자바 런타임 메모리 영역C와 C++은 객체 (C에는 객체가 없지만)의 생성, 관리, 삭제까지 모두 관리할 책임을 가지지만, 자바에서
dev-dx2d2y-log.tistory.com
저번에는 자바에서 객체를 저장하는 방법에 대해서 알아보았다.
그렇다면 객체는 어떻게 불러오는걸까? 그것에 대해 알아보기로한다.

https://dev-dx2d2y-log.tistory.com/138
[CS] JVM 밑바닥까지 파헤치기 독서 #1 - 자바 런타임 메모리 영역
C와 C++은 객체 (C에는 객체가 없지만)의 생성, 관리, 삭제까지 모두 관리할 책임을 가지지만, 자바에서는 JVM이 대체적으로 이 역할을 수행한다. JVM에 대해서 배우면서 가장 먼저 자바 메모리 영역
dev-dx2d2y-log.tistory.com
저번에 자바 메모리 구조를 대략적으로 살펴봤을 때, 스택의 지역변수테이블에 힙메모리에 참조 중인 객체가 들어가는 주소값이 저장되는 지역 변수 테이블이 있다고 했다.
한 메서드에서 인스턴스 참조변수를 가져와서 사용하게된다면 바로 이 지역변수 테이블의 참조객체의 주소값에 접근하는 것에서 시작된다.
다만 여기까지만 동일하고 힙 내부에서 어떻게 가져올지부터는 가상 머신의 제공자가 어떻게 구현하는가에 달렸다. 대표적으로는 핸들 방식과 다이렉트 포인터 방식으로 나뉜다.
핸들방식

핸들 방식을 사용하면 힙메모리에 핸들 저장용 핸들풀이 따로 존재한다. 스택의 참조변수에는 핸들의 포인터 주소가 저장될 것이고, 핸들은 객체의 인스턴스 데이터를 나타내는 포인터와 객체의 타입에 대한 데이터를 나타내는 포인터로 이루어져 있다.
그러니까 핸들은 같은 힙메모리의 객체 인스턴스를 나타내는 포인터와,
메서드 영역에서 해당 객체의 클래스 정보를 나타내는 포인터 두 개로 이루어져 있다. 이러한 방식의 장점은 안정적으로 객체를 다룰 수 있다는 것이다.
GC에 대해서 아직 배우지 않았지만 GC 과정에서 객체가 위치를 이동하는 일은 흔한 편이다. 만약 핸들을 사용하지 않았다면 모든 참조변수에 접근해서 포인터값을 수정해야했겠지만, 이 방식을 사용하면 핸들의 포인터만 수정하면 되기 때문에 안정적으로 데이터를 조작할 수 있다.
다이렉트 포인터 방식

다이렉트 포인터 방식에서는 참조값에 곧바로 힙메모리의 인스턴스 주소가 저장되며, 인스턴스 내에 객체 타입의 정보를 나타내는 포인터가 들어있다.
다이렉트 포인터 방식에서 가장 큰 장점은 속도다. 자바에서는 객체에 접근할 일이 아주많기 때문에 이렇게 핸들을 경유하는 공정 한 개를 제외하는 것만으로도 실행 시간에 유의미한 영향을 끼칠 수 있다.
핫스팟 가상머신에서는 다이렉트 포인터 방식을 사용한다. 그렇다고 핸들이 사장되는 추세는 아니고, 다양한 언어와 프레임워크에서 핸들 방식이 차용되는 편이다.
'CS > JVM' 카테고리의 다른 글
| [JVM] GC의 객체회수과정은 어떻게 일어나는가? - 마크-스윕, 마크-카피, 마크-컴팩트 (0) | 2025.12.26 |
|---|---|
| [JVM] 참조 카운팅 알고리즘과 파이썬의 순환 검출 알고리즘에 대해서 (0) | 2025.12.25 |
| [JVM] JVM 밑바닥까지 파헤치기 독서 #4 - 메모리 영역 별 오버플로우 (1) | 2025.12.06 |
| [JVM] JVM 밑바닥까지 파헤치기 독서 #2 - 자바는 어떻게 객체를 저장하는가? (0) | 2025.11.27 |
| [JVM] JVM 밑바닥까지 파헤치기 독서 #1 - 자바 런타임 메모리 영역 (0) | 2025.11.26 |
