JVM ClassLoader의 작동원리
개발을 하거나 WAS를 기동하면 ClassNotFoundException 을 많이 만나게 됩니다.
왜 클래스를 찾을 수 없는지 원리를 알아보기 위해 정리를 해보았습니다.
ClassLoader의 작동원리를 살펴보기 전에 먼저 알아야 할 용어를 정리하면.
Class - Java 프로그램을 컴파일하여 생성된 .class
Class 객체 - 일반객체를 만들기 위해 JVM 메모리에 로드된 .class에 대한 객체
일반 객체 - Class 객체로 생성한 객체
ClassLoader는 작성한 Java Byte Code를 JVM메모리상에 올려주는 역할을 하는 것이고, 프로그래머는 Class 객체를 이용하여 일반객체를 생성할 수 있습니다. 즉 메모리 내에서 Class 객체를 매개로 하여 일반객체를 생성합니다.
ClassLoader는 기본적으로 Unload 기능을 제공하지 않습니다.. GC에 의하여 자동 Unload되며, Static으로 선언된 경우에는 GC에서 Unload하지 않기 때문에 프로그래머는 항상 Static으로 선언된 클래스를 사용할 수 있습니다.
Java ClassLoader의 구조(Delegation Model, 위임구조)
Bootstrap ClassLoader - 모든 ClassLoader의 부모 ClassLoader
Extensions ClassLoader - Bootstrap ClassLoader를 상속하며, lib/ext 디렉토리에 있는 클래스를 로드
System-Classpath ClassLoader - Extensions ClassLoader를 상속하며, CLASSPATH에 잡혀 있는 모든 클래스, java.class.path 시스템 프라퍼티, -cp 혹은 -classpath에 잡혀 있는 모든 클래스를 로드
ps.구조도는 첨부하였습니다.
클래스 로더의 delegation model에서 클래스를 찾을 경우
Cache -> Parent -> Self 순서로 찾습니다.
클래스 생성을 요청받으면 먼저 Cache를 검색하여 이전에 요청이 있었는지 파악하며, 없을경우 상위 클래스 로더에서 찾습니다.
최상위 클래스로더인 Bootstrap ClassLoader 에도 없을 경우 작업한 소스의 경로에서 클래스를 찾아서 생성합니다.
출처 - http://open.egovframe.org/nforges/information/share/4082/.do