Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- Integer
- equals
- DFS
- java
- HashMap
- Prim
- Disjoint-set
- MST
- bruteforce
- web
- 그래프
- ssafy서울
- Union-FInd
- Web-BackEnd
- ==
- cycle
- BFS
- Kruskal
- back-end
- Floyd-Warshall
- spring-boot
- 삼성청년SW아카데미
- spring
- 완전탐색
- 최소신장트리
- 구현
- 시뮬레이션
- Graph
- SSAFY
- Spring Framework
Archives
- Today
- Total
devlog
Class Loader : 자바 바이트 코드를 메모리에 올린다 본문
Class Loader System
클래스 로더는 로딩, 링크, 초기화의 과정을 수행한다.
Loading
- 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 메소드 영역 에 저장한다.
- 메소드 영역 에 저장되는 데이터
- FQCN(Fully Qualified Class Name) : 클래스가 속한 패키지명을 모두 포함한 이름 ex) java.lang.String
- Class, Interface, Enum 과 같은 속성정보
- 메소드와 변수
- 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 힙 영역에 저장한다. 때문에 App.class 처럼 사용가능
Linking
- 링크는 Verify, Prepare, Resolve(Optional) 세 단계로 나누어져 있다.
- Verify : .class 파일의 형식이 유효한지 체크한다.
- Prepare : static 변수와 기본값에 필요한 메모리를 준비하는 과정
- Resolve : 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다. 이 과정은 Optional 이므로 지금 수행할 수도 있고 나중에 수행될 수도 있다.
public Book { }
public App {
Book book = new Book();
}
위의 코드 처럼 App 클래스에서 Book 클래스를 참조한다고 실제 메소드 영역에 있는 레퍼런스가 연결되어 있는 것이 아니라 논리적인 레퍼런스로 연결되어있다. 이를 실제 레퍼런스로 교체하는 것이 Resolve 과정이다.
Initialization
- static 변수의 값을 할당한다. static 블록이 존재하면 이 때 실행된다.
Class Loader
클래스 로더는 계층 구조로 이루어져 있으며 기본적으로 세 가지 클래스 로더가 제공된다.
Bootstrap Class Loader
- 최상위 부모 클래스로더로 가장 높은 우선순위를 가지고 있다.
- JAVA_HOME\lib 에 있는 코어 자바 API를 제공한다.
Platform Class Loader
- JAVA_HOME\lib\ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽는다.
Application Class Loader
- 애플리케이션 클래스 패스에서 클래스를 읽는다.
최상위 부모 클래스인 부트스트랩 클래스 로더부터 애플리케이션 클래스 로더 순으로 클래스를 읽고 최종적으로 애플리케이션 클래스로더도 읽기를 시도했을 때 해당 클래스를 찾지 못했을 경우 ClassNotFoundExcepion 이 발생한다. ex) 의존성을 제대로 추가하지 않은 경우
public class App {
public static void main( String[] args ) {
ClassLoader classLoader = App.class.getClassLoader();
System.out.println(classLoader);
System.out.println(classLoader.getParent());
System.out.println(classLoader.getParent().getParent());
}
}
위의 코드를 실행하면 아래와 같은 결과를 얻을 수 있다.
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@6d6f6e28
null
현재 클래스로더를 출력하면 Application 클래스 로더가 그 부모를 출력하면 Platform 클래스 로더가 출력되는데 그 부모인 Bootstrap 클래스 로더는 출력되지 않고 null 값이 출력된다.
그 이유는 Bootstrap 클래스 로더 는 네이티브 코드로 구현되어 있기 때문에 자바에서 참조해서 호출이 불가능하기 때문이다.
'프로그래밍언어 > Java' 카테고리의 다른 글
JVM (Java Virtual Machine) : 자바 바이트 코드를 실행한다 (0) | 2020.08.09 |
---|---|
JVM, JRE, JDK : 자바코드를 실행한다. (0) | 2020.08.09 |
Integer 비교하기 == 와 .equals() (0) | 2020.06.26 |
Comments