본문 바로가기
language/java

Java ClassLoader 동작 원리 완벽 이해하기

by 죄니안죄니 2026. 5. 26.
반응형

Java ClassLoader 동작 원리 완벽 이해하기

Java JVM 구조를 공부하면 반드시 등장하는 핵심 개념이 바로:

ClassLoader

입니다.

실무에서도:

  • Spring Boot 실행 구조
  • 라이브러리 충돌
  • Fat Jar 구조
  • JDBC Driver 자동 로딩
  • OOM(Metaspace)

등과 깊게 연결됩니다.

초보 시절에는 보통:

.class 파일 읽는 애
 

정도로만 이해하기 쉽습니다.

하지만 실제 ClassLoader는:

  • 클래스 로딩
  • 메모리 적재
  • 클래스 중복 방지
  • 보안
  • 런타임 동적 로딩

을 담당하는 JVM 핵심 시스템입니다.

이번 글에서는:

  • ClassLoader가 왜 필요한가
  • 동작 과정
  • Parent Delegation Model
  • Bootstrap / Platform / Application Loader
  • Spring Boot Fat Jar 구조

까지 깊게 정리해보겠습니다.


1. ClassLoader란?

ClassLoader는:

.class 파일(ByteCode)을 JVM 메모리에 로딩하는 컴포넌트

입니다.

즉:

.class 파일 읽기
↓
클래스 정보 생성
↓
JVM 메모리 적재
 

수행.


2. 왜 ClassLoader가 필요할까?

Java는 실행 중에:

필요한 클래스만 동적 로딩
 

합니다.

즉:

  • 프로그램 시작 시 모든 클래스 로딩 X
  • 필요한 순간 로딩 O

구조.


3. Java 실행 흐름 다시 보기

전체 흐름:

.java
 ↓
javac 컴파일
 ↓
.class(ByteCode)
 ↓
ClassLoader
 ↓
JVM 메모리
 ↓
Execution Engine 실행
 

4. ClassLoader 역할

핵심 역할:


역할 설명
클래스 탐색 .class 찾기
ByteCode 읽기 파일 로딩
클래스 생성 JVM 메타데이터 생성
메모리 적재 Method Area 저장

5. ClassLoader 동작 단계

ClassLoader 동작은 크게:

Loading
Linking
Initialization
 

3단계.


6. Loading 단계

Loading은:

.class 파일 읽기

단계.

예시:

 
User user = new User();
 

JVM은:

User.class 탐색
 

수행.


7. Loading 단계에서 하는 일

수행 작업:

  • .class 파일 읽기
  • ByteCode 메모리 적재
  • Class 객체 생성

8. Class 객체란?

매우 중요합니다.

Java에서는 클래스 자체도 객체입니다.

예시:

 
Class clazz = User.class;
 

즉 JVM 내부에:

Class<User>
 

객체 생성됨.


9. Linking 단계

Linking은:

Verification
Preparation
Resolution
 

3단계 존재.


10. Verification

ByteCode 검증 단계.

즉:

이상한 ByteCode인가?
보안 문제 있는가?
 

검사.


11. 왜 Verification이 중요할까?

Java 보안 핵심 중 하나.

악성 ByteCode 차단 가능.

예:

메모리 직접 접근
잘못된 타입 접근
 

등 검증.


12. Preparation 단계

static 메모리 준비 단계.

예시:

 
static int count = 10;
 

이 단계에서는:

count = 0
 

기본값만 할당.


13. Initialization 단계에서 진짜 값 설정

count = 10
 

실제 초기화 수행.


14. Resolution 단계

클래스 참조 연결 단계.

예시:

 
UserService
 ↓
UserRepository 참조
 

연결 수행.


15. Initialization 단계

마지막 단계.

수행 내용:

  • static 변수 초기화
  • static block 실행

16. static block 예시

 
static {

    System.out.println("초기화");
}
 

클래스 최초 로딩 시 실행.


17. 클래스는 언제 로딩될까?

대표 사례:


상황 로딩 여부
new 객체 생성 O
static 접근 O
static method 호출 O
Class.forName() O

18. Class.forName()

대표적인 동적 로딩 API.

 
Class.forName(
    "com.mysql.Driver"
);
 

JDBC에서 매우 유명.


19. 왜 JDBC Driver 자동 등록될까?

옛날 JDBC 구조:

 
Class.forName("Driver");
 

호출 시:

static block 실행
↓
DriverManager 등록
 

구조.


20. Parent Delegation Model

ClassLoader 핵심 구조.

매우 중요합니다.

동작 방식:

“부모에게 먼저 요청”
 

입니다.


21. 왜 부모 위임 구조를 사용할까?

핵심 목적:


목적 설명
보안 핵심 클래스 보호
중복 방지 클래스 충돌 방지
안정성 JVM 일관성 유지

22. ClassLoader 계층 구조

Java 기본 구조:

Bootstrap ClassLoader
 ↓
Platform ClassLoader
 ↓
Application ClassLoader
 

23. Bootstrap ClassLoader

최상위 로더.

로드 대상:

java.lang.*
java.util.*
 

즉 Java 핵심 클래스.


24. Bootstrap Loader 특징


특징 설명
JVM 내부 구현 C/C++
Java 객체 아님 O
최상위 로더 O

25. Platform ClassLoader

(JDK9 이전 Extension Loader)

로드 대상:

JDK 확장 라이브러리
 

26. Application ClassLoader

실제 우리가 만든 클래스 로딩.

예:

src/main/java
 

클래스들.


27. Parent Delegation 실제 흐름

예:

 
new String()
 

실행 시:

Application Loader 요청
 ↓
Platform 요청
 ↓
Bootstrap 요청
 ↓
Bootstrap이 String 로딩
 

28. 왜 String을 직접 만들 수 없을까?

예를 들어:

 
package java.lang;

public class String {

}
 

이런 악성 클래스 방지 목적.

Bootstrap이 먼저 로딩하기 때문.


29. 클래스는 “이름 + ClassLoader”로 구분

매우 중요합니다.

즉:

같은 클래스 이름이어도
Loader 다르면 다른 클래스
 

입니다.


30. 그래서 발생하는 문제

대표 사례:

ClassCastException
 

인데 클래스 이름은 동일.

왜냐하면:

ClassLoader 다름
 

때문.


31. OSGi / WAS에서 자주 발생

대표 사례:

  • Tomcat
  • JBoss
  • OSGi

에서 라이브러리 충돌 문제.


32. Spring Boot Fat Jar 구조

실무에서 매우 중요.

Spring Boot는:

jar 안에 jar 포함
 

구조 사용.


33. 일반 Java 실행 구조

보통:

classpath 기반
 

로딩.


34. Spring Boot는 왜 특별할까?

Spring Boot Fat Jar:

app.jar
 └── lib/*.jar
 

즉 nested jar 구조.

기본 ClassLoader로 처리 어려움.


35. 그래서 Spring Boot가 Custom ClassLoader 사용

대표 클래스:

LaunchedURLClassLoader
 

Spring Boot 내부 구현.


36. ClassLoader와 메모리

클래스 정보는:

Method Area(Metaspace)
 

에 저장.


37. Metaspace OOM

대표 오류:

OutOfMemoryError:
Metaspace
 

원인:

  • 클래스 너무 많이 로딩
  • ClassLoader 누수

38. ClassLoader 누수(ClassLoader Leak)

실무에서 매우 중요.

대표 사례:

  • WAS 재배포 반복
  • static 참조 유지
  • ThreadLocal 누수

39. 왜 ClassLoader Leak이 위험할까?

ClassLoader가 살아있으면:

해당 클래스 전체 GC 불가
 

즉:

  • Metaspace 증가
  • 메모리 누수

발생.


40. 실무에서 자주 하는 실수

1) ClassLoader 존재 자체를 모름

Spring/JPA 내부 구조 이해 어려워짐.


2) static 남용

ClassLoader GC 방해 가능.


3) ThreadLocal 정리 안 함

WAS 메모리 누수 원인 가능.


41. 핵심 정리

ClassLoader 핵심 역할:

.class 로딩
+
메모리 적재
+
중복 방지
+
보안 유지
 

입니다.


42. 정리

ClassLoader는 단순 파일 로더가 아닙니다.

실제로는:

  • JVM 클래스 로딩
  • 보안
  • 메모리 구조
  • Spring Boot 실행
  • WAS 메모리 누수

와 깊게 연결되는 JVM 핵심 시스템입니다.

특히 실무에서는:

  • Parent Delegation Model
  • Bootstrap/Application Loader
  • Spring Boot Fat Jar
  • Metaspace/ClassLoader Leak

를 이해하는 것이 매우 중요합니다.

다음 글에서는:

Stack / Heap / Method Area 메모리 구조

를 객체 생성 과정과 함께 JVM 메모리 흐름 중심으로 깊게 정리해보겠습니다.

반응형

댓글