개발 일지

[외부자료] Java ClassLoader 요약 글

북극곰은콜라 2022. 11. 22. 19:10
반응형

Java의 ClassLoader 관련하여 좋은글이있어 개인적으로 공부하면서 요약을 진행했다.

자세한 내용은 원본글 참조 부탁드립니다.

https://homoefficio.github.io/2018/10/13/Java-%ED%81%B4%EB%9E%98%EC%8A%A4%EB%A1%9C%EB%8D%94-%ED%9B%91%EC%96%B4%EB%B3%B4%EA%B8%B0/

 

Java 클래스로더 훑어보기

Java ClassLoader 훑어보기아주 예전에 SCJP 시험볼 때나 살펴본 이후로 자바의 클래스로더를 직접 다뤄야 할 일은 솔직히 없었다. 그래서 거의 잊고 살아왔는데 요즘 Quartz를 다루면서 Quartz에 없는 기

homoefficio.github.io


JAVA 8 Classloader

Classloader 종류

Bootstrap ClassLoader

부트스트랩 클래스로더는 3가지 기본 클래스로더 중 최상위 클래스로더로서, 쉽게 말하면 jre/lib/rt.jar에 담긴 JDK 클래스 파일을 로딩한다.

Native C로 구현돼 있어서, String.class.getClassLoader()는 그냥 null을 반환한다. Primordial ClassLoader 라고 불리기도 한다.


Extension ClassLoader

익스텐션 클래스로더는 jre/lib/ext 폴더나 java.ext.dirs 환경 변수로 지정된 폴더에 있는 클래스 파일을 로딩한다.

Java로 구현되어 있으며 sun.misc.Launcher 클래스 안에 static 클래스로 구현되어 있으며, URLClassLoader를 상속하고 있다.


Application ClassLoader

애플리케이션 클래스로더는 -classpath(또는 -cp)나 JAR 파일 안에 있는 Manifest 파일의 Class-Path 속성값으로 지정된 폴더에 있는 클래스를 로딩한다

익스텐션 클래스로더와 마찬가지로 Java로 구현되어 있으며, sun.misc.Launcher 클래스 안에 static 클래스로 구현되어 있으며, URLClassLoader를 상속하고 있다.

개발자가 애플리케이션 구동을 위해 직접 작성한 대부분의 클래스는 이 애플리케이션 클래스로더에 의해 로딩된다.


Classloader의 3가지 원칙

Classloader 위임 원칙

위임 원칙은 클래스 로딩이 필요할 때 3가지 기본 클래스로더의 윗 방향으로 클래스 로딩을 위임하는 것


Classloader 가시성 원칙

가시범위 원칙은 하위 클래스로더는 상위 클래스로더가 로딩한 클래스를 볼 수 있지만, 상위 클래스로더는 하위 클래스로더가 로딩한 클래스를 볼 수 없다는 원칙


Classloader 유일성 원칙

유일성 원칙은 하위 클래스로더는 상위 클래스로더가 로딩한 클래스를 다시 로딩하지 않게 해서 로딩된 클래스의 유일성을 보장하는 것


Java 9의 Classloader

Java 9에서 도입된 모듈 시스템에 따라서 구현이 바뀌었다.

Java 8 Java 9 비교
Bootstrap ClassLoader 그대로  - rt.jar 등이 없어짐에 따라 로딩할 수 있는 클래스의 범위가 전반적으로 축소
 - 따라서 parent classloader 인자로 null을 넘겨주며 Bootstrap ClassLoader를 parent classloader로 사용했던 코드 수정 필요할 수 있음
Extension ClassLoader Platform ClassLoader  - jre/lib/ext, java.ext.dirs를 지원하지 않음
 - Java SE의 모든 클래스와 Java SE에는 없지만 JCP에 의해 표준화 된 모듈 내의 클래스를 볼 수 있으며, Java 8에 비해 볼 수 있는 범위가 확장됨
 - URLClassLoader가 아닌 BuiltinClassLoader를 상속받아 ClassLoaders 클래스의 내부 static 클래스로 구현됨
Application ClassLoader System ClassLoader  - 클래스패스, 모듈패스에 있는 클래스 로딩
 - URLClassLoader가 아닌 BuiltinClassLoader를 상속받아 ClassLoaders 클래스의 내부 static 클래스로 구현됨

ClassLoader 적용 기준

public
class Thread implements Runnable {
    ...
 
    /* The context ClassLoader for this thread */
    private ClassLoader contextClassLoader;
 
    ...
}

Reference

 - https://homoefficio.github.io/2018/10/13/Java-%ED%81%B4%EB%9E%98%EC%8A%A4%EB%A1%9C%EB%8D%94-%ED%9B%91%EC%96%B4%EB%B3%B4%EA%B8%B0/

 

반응형

'개발 일지' 카테고리의 다른 글

OIDC 란  (0) 2022.11.23
Logstash 란  (0) 2022.11.23
JsonPath란  (0) 2022.11.22
HikariCP 동작원리  (0) 2022.11.16
JDBC 동작원리  (0) 2022.11.15