Java에서 ClassLoader란 무엇일까? Class Loading Process와 함께 알아보자.
Java 언어로 소스 코드가 작성된 파일로, .java 확장자를 가진다.
Java 파일을 Java compiler로 컴파일해 byte 코드로 작성된 파일로, .class 확장자를 가진다.
클래스 로더(ClassLoader)가 .class 확장자의 클래스 파일을 찾아 JVM에 올려놓는 과정이다.
👉 사용자 정의(User-defined) 클래스 파일들을 로딩하기 전, JVM을 실행하기 위해 JVM을 실행할 때 이미 여러 클래스 파일들을 로딩했다는 점을 유의해야 한다.
각 클래스 로더의 동작 순서
JVM 실행 시, 각 클래스 로더는 자신이 호출할 수 있는 클래스들을 호출하여 JVM에 로드하고 JVM을 동작시킨다.
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]
...
Java의 확장 클래스 파일들을 로드한다.
사용자 정의 클래스 파일들을 로드한다.
클래스 로더들은 부모-자식의 관계를 가진다.
부모 클래스 로더에서 자식 클래스 로더를 가지는 형태로 되어 있다.
👉 Bootstrap ➡ Extension ➡ System ➡ User-defined
로딩 요청 위임 동작 과정
예를 들어, 시스템 클래스 로더에서 어떠한 클래스 파일을 로딩할 때, 해당 로딩 요청이 부모 클래스 로더들로 거슬러 올라가 부트스트랩 클래스 로더에 다다른 후 그 밑으로 로딩 요청을 수행한다.
Exception
👶 자식 클래스 로더에서 찾지 못한 클래스 ➡ 👩🦱 (위임) 부모 클래스 로더에서 찾을 수 있음
👩🦱 부모 클래스 로더에서 찾지 못한 클래스 ➡ 👶 자식 클래스 로더에서 찾을 수 없음
클래스 로더에 의해 로딩된 클래스들은 JVM 상에서 삭제할 수 없다.