[Java] ClassLoader, Class Loading Process

da-nyee·2020년 8월 2일
0

TIL

목록 보기
2/4
post-thumbnail

Java에서 ClassLoader란 무엇일까? Class Loading Process와 함께 알아보자.

☕ 자바 파일(Java file)

Java 언어로 소스 코드가 작성된 파일로, .java 확장자를 가진다.

📄 클래스 파일(Class file)

Java 파일을 Java compiler로 컴파일해 byte 코드로 작성된 파일로, .class 확장자를 가진다.

💻 클래스 로딩 과정(Class Loading Process)

클래스 로더(ClassLoader)가 .class 확장자의 클래스 파일을 찾아 JVM에 올려놓는 과정이다.

👉 사용자 정의(User-defined) 클래스 파일들을 로딩하기 전, JVM을 실행하기 위해 JVM을 실행할 때 이미 여러 클래스 파일들을 로딩했다는 점을 유의해야 한다.

각 클래스 로더의 동작 순서
각 클래스 로더의 동작 순서

JVM 실행 시, 각 클래스 로더는 자신이 호출할 수 있는 클래스들을 호출하여 JVM에 로드하고 JVM을 동작시킨다.

부트스트랩 클래스 로더(Bootstrap ClassLoader)

JVM을 실행시키기 위한 핵심 클래스 파일들을 로드한다.

/*
Java app을 -verbose:class JVM 옵션과 함께 실행시키면
rt.jar에 있는 클래스 파일들이 무수하게 로딩되는 것을 확인할 수 있다.
*/

[Opened C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar]
[Loaded java.lang.Object from C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar]
[Loaded java.io.Serializable from C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar]
[Loaded java.lang.Comparable from C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar]
[Loaded java.lang.CharSequence from C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar]
[Loaded java.lang.String from C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar]
...

확장 클래스 로더(Extension ClassLoader)

Java의 확장 클래스 파일들을 로드한다.

시스템 클래스 로더(System ClassLoader)

사용자 정의 클래스 파일들을 로드한다.

💻 클래스 로더 특징

계층적 구조(Hierarchical Structure)

클래스 로더들은 부모-자식의 관계를 가진다.
부모 클래스 로더에서 자식 클래스 로더를 가지는 형태로 되어 있다.

👉 Bootstrap ➡ Extension ➡ System ➡ User-defined

로딩 요청 위임(Loading Request Delegation)

로딩 요청 위임 동작 과정
로딩 요청 위임 동작 과정

예를 들어, 시스템 클래스 로더에서 어떠한 클래스 파일을 로딩할 때, 해당 로딩 요청이 부모 클래스 로더들로 거슬러 올라가 부트스트랩 클래스 로더에 다다른 후 그 밑으로 로딩 요청을 수행한다.

  • System ClassLoader ➡ (위임) Extension ClassLoader ➡ (위임) Bootstrap ClassLoader
  • Bootstrap에서 해당 클래스를 못 찾은 경우, (요청 넘김) Extension ClassLoader
  • Extension에서 해당 클래스를 못 찾은 경우, (요청 넘김) System ClassLoader
  • System에서 해당 클래스를 못 찾은 경우, User-defined까지 가지 않음, Exception

가시성 제약 조건 (Visibility Constraint Condition)

👶 자식 클래스 로더에서 찾지 못한 클래스 ➡ 👩‍🦱 (위임) 부모 클래스 로더에서 찾을 수 있음
👩‍🦱 부모 클래스 로더에서 찾지 못한 클래스 ➡ 👶 자식 클래스 로더에서 찾을 수 없음

언로드 불가(Unload Impossibility)

클래스 로더에 의해 로딩된 클래스들은 JVM 상에서 삭제할 수 없다.


🔎 참고자료

profile
매일매일을 소중하게 ✨

0개의 댓글