본문 바로가기
자바과정/Java

Java 클래스 로더(ClassLoader)

by Parkej 2021. 10. 4.

# 참고 및 출처

 

 

# 클래스 로더 (Class Loader)

각 자바 클래스는 클래스 로더에 의해 로드되어야 한다. 게다가 자바 프로그램들은 외부 라이브러리들을 이용하거나 최소한 수많은 라이브러리들의 한 부분으로 구성될 수 있다. 

 

클래스 로더는 크게 3가지로 구분할 수 있다. 

그리고 또 아래와 같이 구분이 가능하다. 

 

로딩(Loading)

Bootstrap -> Extenstion -> Appliacation

- 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 메소드 영역에 저장한다. 

- 이때 메소드 영역에 저장하는 데이터 

  • FQCN(Fully Qualitied Class Name) : java.lang.String s = new java.lang.String(); <-> Alias Name : String s = new String(); , 패키지/클래스 이름/클래스 로더까지 포함된 이름
  • 클래스, 인터페이스, 이늄
  • 메소드와 변수

- 로딩이 끝나면 해당 클래스 타입의 class 객체를 생성해서 "힙" 영역에 저장한다. 

- 이런것들이 로딩이 되고난 후 "힙" 영역에 저장된다는 것

* 힙, 메소드는 모든 쓰레드에서 공용으로 사용함.

 

# 기본적으로 3가지 클래스 로더가 있다. 

1. 부트스트랩 클래스 로더 : JAVA_HOME\lib에 있는 코어 자바 API를 제공한다. 최상위 우선순위를 가진 클래스 로더

2. 플랫폼 클래스 로더 : JAVA_HOME\lib\ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽는다.

3. 애플리케이션 클래스 로더 : 애플리케이션 클래스패스(애플리케이션 실행할 때 주는 -classpath 옵션 또는 java.class.path 환경 변수의 값에 해당하는 위치)에서 클래스를 읽는다. 

 

 

# 사용하는 클래스로더 확인하기 (Maven 프로젝트 생성)

- 이클립스 메이븐 프로젝트 생성
- 퀵스타트로 생성 후 자바 1.7을 11로 변경

 

클래스로더는 계층형 구조이다.

 

- 이렇게 현 클래스에서 클래스 로더를 확인 가능하다.

- App 클래스의 클래스로더는 AppClassLoader이다.

- App 클래스 로더의 부모는 Platform 클래스 로더이다.

- Platform 클래스 로더의 부모는 있지만 볼 수가 없다. (부트스트랩 로더는 네이티브 코드로 구현되어 있어서..)

 

- ClassLoaders.java에서 확인해보기 

 

이렇게 총 3개의 로더가 기본적으로 생기는데 각각의 클래스 로더는 클래스 패스에서 

각각의 클래스 로더는 클래스 패스에 프로퍼티 즉, 클래스 패스에 들어있는 패스들만 읽어준다.

 

기본적으로 작성한 코드들은

AppClassLoader가 읽고

스프링에서 애플리케이션 클래스 패스에 추가하는 것들도 AppClassLoader가 읽게된다.

 

 

# 클래스 로더가 동작하는 원리

어떤 클래스를 읽어달라하면 그 클래스를 읽어올 때 제일 부모한테 먼저 부탁을 하게된다.

부모가 못읽으면 그다음 부모 모든 부모가 못읽으면 본인이 읽게되는 원리이다.

하지만 본인마저도 못읽게 되면 ClassNotFoundException이 발생하게 된다.

 

링크(Lingking)

Verify, Prepare, Resolve

  • Verify : .class 파일 형식이 유효한지 체크한다.
  • Prepare : 메모리를 준비하는 과정, Prearation : 클래스 변수( static 변수)와 기본값에 필요한 메모리
  • Resolve : 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다. 

* 심볼릭 레퍼런스 : 어떤 객체가 다른 객체를 레퍼런스 하면 (Test.java 클래스 생성 후 App에서 new 연산자를 통해 해당 클래스에 대한 정보를 레퍼런스 할 때)

 

Test에 대한 레퍼런스는 링크하는 과정에서 심볼릭 메모리 레퍼런스이다. 즉, 실제 레퍼런스를 가리키고 있지 않은 형태이다. 이것을 실제 힙에 들어있는 Test 객체(인스턴스)를 가리키도록 하는 과정이 Resolve때 벌어지기도 하고 아닐 수도 있다. (Optional 이기 때문에)

 

 

초기화

- Static 변수의 값을 할당한다. (Static 블록이 있다면 이 때 실행된다.)

 

 

클래스에 static한 것들은 이 때 할당이 된다. park라는 인스턴스를 만들어서 name에 할당한다. 

 

 


JVM에 가장 중요한 것은 바이트 코드라고 한다. 

다음 강의를 듣고 난 후 포스팅 하도록 하겠다. 

반응형

'자바과정 > Java' 카테고리의 다른 글

쓰레드(Thread)란  (0) 2021.10.07
JVM의 구조  (0) 2021.10.04
JVM과 JDK와 JRE  (0) 2021.09.23
객체 지향 프로그래밍 5원칙 (SOLID)  (0) 2021.09.09
객체 지향 프로그래밍 4대 특징 (코드 실습)  (0) 2021.09.09

댓글