티스토리 뷰

JVM을 공부하다 보면 Class Loader라는 녀석을 발견할 수 있다.

도통 이것이 무슨 역할을 하는지 몰라 아래 링크를 참고하여 정리해보았다.

https://goodgid.github.io/Java-Class-Loader/

 

- JVM 전까지의 순서 -

컴파일러는 .java File을 바이트 코드인 .Class File로 바꿔주는데 이것을 클래스 로더가 읽어오고,

클래스 로더 안에는 기본적으로 로딩, 링킹, 초기화 3가지를 통해 jvm의 각 영역에 저장한다.

 

- 로딩 (Loading) -

클래스 로더는 .Class File을 읽어온 뒤 바이너리 데이터로 변경해준다.

바이너리 데이터로 변경된 것은 Method Area 영역에 Type 정보(Class, interface, enum), Method와 변수,

FQCN (Fully Qualified Class Name) 이 저장된다.

로딩이 끝났다면 Type 정보로 저장된 Class Type Object를 생성하며 Heap 영역에 생성한 Object를 저장한다.

 

· FQCN?

클래스가 속한 패키지 명을 모두 포함한 이름

( 예 : package + full package 경로 + class name )

 

· 바이너리 데이터?

이진 File이라고도 불리며, Text 파일이 아닌 컴퓨터 파일로서 컴퓨터 저장과 처리 목적으로

이진 형식으로 인코딩된 데이터를 포함하고 있다.

 

- 링킹 (Linking) -

링킹은 3단계로 진행된다.

Verify (검증) -> Prepare (준비) -> Resolve (Optional 혹은 해석) 단계이며 

바이트 코드가 변경되었을 때를 위한 Verify,

static 변수와 기본값에 필요한 메모리를 준비하는 Prepare,

심볼릭 메모리 레퍼런스를 Method area 영역에 있는 실제 레퍼런스(Heap 영역에 위치)로 교체해주는 Resolve(Optional) 가 있다.

 

· 심볼릭 메서드 레퍼런스?

참고하는 Class의 특정 메모리 주소를 참조 관계로 구성한 것이 아닌 참조 대상의 이름만을 지칭한 것

 

- 초기화 (Initiailzation) -

링킹의 Prepare 단계에서 확보한 메모리 영역에 static 값을 할당한다.

 

- 회고 -

Class Loader에 대해서 바이트 코드를 읽어드리는 역할을 한다고 막연히 생각했지만

jvm 영역에 데이터를 주입해주는 과정도 있다는 것을 처음 알았다.

현재 Class Loader의 특징도 정리 중인데 새로운 지식이 늘어나고 있어서 즐겁지만

한편으론 전체적으로 크게 보려니 이해하기 쉽지 않구나 하는 것도 느끼고 있다.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함