| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- session이 뭔가요?
- 배열과 메모리
- 메모리에서 배열
- 세션장점
- 세션장단점
- session이란?
- 구글 자바 코드 스타일
- 프록시서버
- jwt토큰구조
- 프로그래밍 배열
- ReverseProxy
- 자바 코드 가이드
- GPT프로젝트
- 신입개발자 프로젝트
- 신입개발자
- 포워드프록시
- session단점
- jwt원리
- 우아한테크코스 Google Java Style Guid
- jwt란?
- 토큰구조
- session이뭔가요?
- jwt토큰원리
- Google Java Code Style Guide
- jwt토큰관리
- Google Java Style Guide
- 세션단점
- session장점
- 구글 자바 스타일
- 백엔드 서버
- Today
- Total
dev_dbdb1114
[JAVA]JVM해체기(2) - 클래스 로더 ( 동작 방식 ) 본문
우리가 코드를 실행한다. JVM이 일을 한다. 어떻게 일할까? 일단 우리가 작성한 코드는 컴파일된다. 그 이후 컴파일된 코드들은 JVM에 들어간다. 그 첫번째 단계가 클래스 로더이다. 이름 그대로 클래스를 로드한다.
1. 클래스로더는 뭘까?

1 ) 클래스로더 전
우리가 작성한 코드가 컴파일러를 통해 컴파일 된다.
2)클래스로더로 들어오면
전체적으로 보면 오른쪽과 같다. 클래스로더에서는 Loading / Linking/ Initialization 이라는 세 가지 과정이 포함된다. 각각 과정마다 세부적인 규칙이나 상세한 실행순서가 있다.
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.2
3) 클래스로더 후
클래스로더 이후에는 메모리에 우리가 필요한 필드들의 메모리저장, 참조 연결, 초기화 등이 되고, 이후 execution enzine을 통해 코드가 실행된다.
2. 클래스로더의 Load
Bootstrap ClassLoader (jre/lib/rt.jar) ( feat. classLoader 동작방식 )
- 총 3가지의 기본클래스로더중 최상위 클래스로더로서, jre/lib/rt.ja에 담긴 JDK 클래스 파일을 로딩한다. —> 자바 클래스를 로드할 수 있는 자바 자체의 클래스로더와 최소한의 자바클래스만을 로드한다 ( java.lang.object, Class, ClassLoader)
- Native C로 구현돼 있어 getClassLoader() 메서드 실행시 null을 반환한다.
- 버전에 따른 차이
- java8 → jre/lib/rt.jar 및 기타 핵심 라이브러리와 같은 JDK의 내부 클래스를 로드한다. ( rt.jar 내에는 java.lang, java.util 등의 필수 패키지들이 들어있다. )
- java9 이후 → 더 이상 /re.jar이 존재하지 않으며, /lib 내에 모듈화되어 포함됐다. 이제는 정확하게 ClassLoader 내 최상위 클래스들만 로드한다. ( 이건 어떤 클래스를 로드하는 건지 모르겠다. ClassLoader 내 최상위 클래스가 뭐지,,, )
Extension ClassLoader (jre/lib/ext , java.ext.dirs)
- 부트스트랩 클래스로더를 부모로 갖는 클래스로더로써, 확장 자바 클래스들을 로드한다.
- java.ext.dirs 환경변수에 설정된 디렉토리의 클래스 파일을 로드하고, 이 값이 설정되어 있지 않은 경우 ${JAVA_HOME}/jre/lib/ext에 있는 클래스 파일을 로드한다.
- 버전에 따른 차이 java8 → URLClassLoader를 상속하며, jre /lib / ext 내 모든 클래스를 로드한다. java9 이후 → Platform Loader로 변경되었으며, URLClassLoader가 아닌 BuiltinClassLoader를 상속한다. Inner Static 클래스로 구현되어 있다.
Application ClassLoader
- • 애플리케이션 클래스로더는 -classpath(또는 -cp)나 JAR 파일 안에 있는 Manifest 파일의 Class-Path 속성값으로 지정된 폴더에 있는 클래스를 로딩한다.
- sun.misc.Launcher 클래스 안에 static 클래스로 구현되어 있으며, URLClassLoader를 상속하고 있다.
- 우리가 만든 .class 확장자 파일을 로드한다.
3. 클래스로더의 Link 과정
블로그 글을 봐도 더 알고싶어서 공식문서를 찾아갔다.

JVM은 초기화클래스를 만들면서 시작한다. 그리고 그 초기화 클래스들을 연결한다. 그리고 main 메서드를 불러온 후 메인 메서드를 이용하여 다른 클래스, 인터페이스, 추가 메서드들을 링킹한다. 이후 실행에 따라서 추가로 생성되고, 연결되고, 초기화 되는 클래스나 메서드들이 있을 수 있다.
====> 클래스로더가 하는 일을 대략적으로 설명한 느낌이다. 이 다음 내용들도 공식문서를 보면서 공부하긴 했는데 아직 내 기초지식이 많이 모자라 이해하기 힘들었고, 나오는 용어들로 서치를 해보니 다행히 양질의 정보를 얻을 수 있었다.
1) Load 단계 세 개의 클래스로더에 의해서 여러 클래스들이 메모리에 적재된다.
2) Linking 단계
공식문서를 읽다보면, verify / prepare / resolution이라는 단어가 계속해서 나온다. 그 단어 자체로도 뜻이 있긴 하지만, 자바에서 쓰이는 뜻이 따로 있을것 같아 찾아보다가 위의 블로그를 찾았다. 링킹 과정에는 3단계의 과정을 거친다.
Verify
읽은 클래스의 바이너리 데이터가 유효한 것인지 확인해야한다. class파일 형식이 유효한지 여러가지 체크를 한 다음 믿을 수 있는 .class 파일 데이터인 경우에 진행한다.
Prepare
클래스의 static변수와 원시타입 변수에 필요한 메모리 공간을 준비하고, static field들을 기본값으로 초기화한다. 우리가 코드에서 초기화한 값들은 initialization 과정에서 초기화된다.
Resolution
선택적으로 진행되는 과정으로 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 힙 메모리 영역에 있는 인스턴스에 대한 레퍼런스로 교체해준다. 즉, 실제 주소값으로 변경해주는 작업을 하는데 Linking과정인 것처럼 마지막으로 정확히 연결되는 것이다.
3. 클래스로더의 Initialization 과정
링크 단계의 Prepare 단계에서 확보한 메모리 영역에 클래스의 static 값들을 할당한다. 즉, 우리가 직접 초기화한 값들에 대해서 초기화가 다시 이루어지는 단계이다 .
4. 클래스로더의 법칙
1)위임 법칙

런타임중에 새로운 클래스를 요청받으면, 하위 클래스로더에서 상위 클래스로더로 요청을 위임한다. 그렇게 Bootstrap ClassLoader까지 올라가면, Bootstrap ClassLoader에서 찾아보고, 없으면 한 단계 내려와서 ExtenssionClassLoader에서 찾아보고, 없으면 ApplicationClassLoader에서 찾아본다.
마지막까지 찾지 못하면, class not found Exception이 발생하는데 하위에서 상위 클래스로더로 요청을 위임하는것이 클래스로더의 위임법칙이다.
2)가시성 법칙
하위 클래스로더는 상위 클래스로더가 로딩한 클래스를 볼 수 있지만, 상위 클래스로더에서는 하위 클래스로더가 로딩한 클래스를 볼 수 없다.
3 )유일성법칙
상위 클래스로더에서 로딩한 클래스는 하위 클래스 로더에서 로드할 수 없다.
References
https://www.baeldung.com/java-classloaders
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.2
https://homoefficio.github.io/2018/10/13/Java-클래스로더-훑어보기/
https://leeyh0216.github.io/posts/java_class_loader/
https://tecoble.techcourse.co.kr/post/2021-07-15-jvm-classloader/
'프로그래밍 > JAVA' 카테고리의 다른 글
| Servlet이란? (2) | 2023.09.15 |
|---|---|
| [JAVA]JVM 해체기(1) (0) | 2023.01.12 |
| [JAVA] HEAP영역과 STACK영역 Unreachable Object (0) | 2022.12.08 |
| [JAVA] 가비지컬렉터2 - 동작방식 (0) | 2022.12.08 |
| [JAVA] 가비지컬렉터 - Heap 영역 (0) | 2022.12.08 |