Class Loader

akanana·2021년 9월 27일
0

JavaPerformance

목록 보기
2/9
post-thumbnail

🏐Class Loader


Class Loader 는 JVM 내로 Class 를 load 하고 Link 를 통해 적절히 배치하는 작업을 하는 모듈이다.

🏀JAVA 특징


  • runtime 시 동적으로 class 를 load, link 한다
  • dynamic 한 loading 이 필요하다

🏀Namespace


이름을 통해 class 를 구별한다.
loader name + package name + class name 모두가 일치하는지를 확인.

🏀Class Loader 구조


🥎BootStrap


  • 최상위 class loader
  • jvm 실행시 가장 먼저 실행된다
  • $JAVA_HOME/jre/lib/rt.jar 를 load

🥎Extension


  • bootstrap 이 부모인 class loader
  • $JAVA_HOME/jre/lib/ext 내 모든 class 를 load

🥎System(Application)


  • $CLASS_PATH 를 load
  • java.class.path 를 load

🥎User-Defined


  • 직접 application 에서 생성하는 class loader
  • user-defined 간에도 계층이 존재한다

🥎특징


class loader 간에는 부모-자식이 존재한다
class 가 필요할 시, 부모에게 load 를 위임한다.
이때, 부모로만 위임 요청이 가능하며, 자식 또는 이웃에게는 요청 및 탐색이 불가능 하다.

⚾정리

  • 계층적 구조
  • 로딩 요청 위임
  • 가시성 제약 조건
  • 언로드 불가능

🏀동작 과정


🥎Loading


⚾Acuistion

.class 형태의 바이너리 파일을 획득
파일 시스템 뿐만 아니라 네트워크 등의 다양한 환경을 통해 획득이 가능하다.

⚾Parse

class 를 method area에 적재가 가능하도록 분석을 하는 작업
class 는 결국 method area에 refenrence 형태로 적재가 되니, class 의 meta 정보를 생성

⚾Create Instnace

java.lang.class 인스턴스를 생성하는 작업.
안에 기본적인 class 가 담겨있음.

🥎Linking


⚾Verification

Class 가 문법에 어긋남이 없는지, 전개상 정합성에 문제가 없는지 판단.

문법에 오류가 있으면 바이트 코드로 컴파일이 안 되는데요?

자세한건 VerifyError 를 참고하면 좋다.
가장 흔한 경우는 상위버전으로 컴파일을 한 .class 파일을 하위버전의 jdk 로 구동시키는 경우 발생한다.

⚾Preparation

Type 별로 메모리를 할당 및 default 값을 설정

TypeDefault
int0
long0L
short(short)0
char'\u0000'
byte(byte)0
referencenull
float0.0f
double0.0d

⚾Resolution

Symbolic Reference 를 Direct Reference 로 변경

🥎Initialization


변수들을 적절한 값으로 초기화

🏀CDS(Class Data Sharing)


rt.jar 와 같은 큰 파일들을 미리 load 해놓아 jvm 의 기동 시간을 줄이거나 메모리를 절약하는 등의 효과를 누릴 수 있다.

🚨JAVA 9++



java 9버전 부터는 구조가 jdk 구조가 바뀌었다.
이에따라 class loader 의 역할또한 바뀌게 되었다.

🚩Bootstrap


rt.jar 파일이 사라져, rt.jar 가 아닌 "java.base" 기반의 api 만 호출

🚩Extension -> Platform


JavaSE 내의 클래스들을 탐색

🚩Application


$CLASS_PATH 뿐 아니라 $MODULE_PATH 또한 호출. 탐색범위 증가.

0개의 댓글