JAVA VIRTUAL MACHINE => JVM
- OS에 종속되지 않고 CPU가 java를 인식, 실행할 수 있게 가능한 가상 컴퓨터
- 바이트코드(.class 파일)를 OS 에 맞는 기계어로 변환하고, 이를 클래스 로더에서 읽어와 메모리 영역에 저장/관리 하고, 이를 실행엔진에서 바이트코드 명령어 단위로 읽어들여 실행하며 가비지 컬렉터로 메모리 관리를 하는 가상 머신
가비지
- JVM 메모리의 스택 영역, 네이티브 메서드 영역, 스태틱 영역 모두에서 참조하지 않는 객체
가비지 컬렉터
- 효율적인 메모리 관리를 하기 위해 힙 영역에서 가비지를 찾아내고 특정 기준으로 메모리 할당을 해제하기 위해 만들어진 것
클래스 로더
- 자바 바이트 코드를 읽어서 JVM의 실행 엔진이 사용할 수 있도록 Runtime Data Area(JVM Memory)의 메서드 영역(Method Area)에 적재하는 역할
클래스 로더
1) 로딩
.class 파일을 읽어서 바이너리 코드로 만들고 이를 메모리의 메서드 영역(Method Area)에 저장하는 과정
(1) 로드된 클래스를 비롯한 그의 부모 클래스의 정보
(2) 클래스 파일과 Class, Interface, Enum의 관련 여부
(3) 변수나 메소드 등의 정보
2) 링크
(1) 검증(verify): 읽어 들인 클래스가 자바 언어 명세 및 JVM 명세에 명시된 대로 잘 구성되어 있는지 검사한다.
(2) 준비(perpare): 클래스가 필요로 하는 메모리를 할당하고, 클래스에서 정의된 필드, 메소드, 인터페이스를 나타내는 데이터 구조를 준비한다.
(3) 분석(resolve): 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다.
3) 초기화
(1) 클래스 변수들(static 변수)을 적절한 값으로 초기화
부트스트랩 클래스 로더(Bootstrap Class Loader)
- JVM 시작 시 가장 최초로 실행되는 클래스 로더 자바 클래스를 로드하는 것이 아닌, 자바 클래스를 로드할 수 있는 자바 자체의 클래스 로더와 최소한의 자바 클래스(java.lang.Object, java.lang.Class, java.lang.ClassLoader, java.util.* 등)
확장 클래스 로더 (Extension Class Loader)
- 확장 클래스 로더는 부트스트랩 클래스 로더를 부모로 갖는 클래스 로더로서, 확장 자바 클래스들을 로드 ava.ext.dirs 환경 변수에 설정된 디렉토리의 클래스 파일을 로드하고, 이 값이 설정되어 있지 않은 경우 ${JAVA_HOME}/jre/lib/ext 에 있는 클래스 파일을 로드
애플리케이션 클래스 로더(Application Class Loader)
- 자바 프로그램 실행 시 지정한 Classpath에 있는 클래스 파일 혹은 jar에 속한 클래스
클래스 로더의 동작 방식
1) JVM의 메소드 영역에 클래스가 로드되어 있는지 확인한다. 만일 로드되어 있는 경우 해당 클래스를 사용한다.
2) 메소드 영역에 클래스가 로드되어 있지 않을 경우, 시스템 클래스 로더에 클래스 로드를 요청한다.
3) 시스템 클래스 로더는 확장 클래스 로더에 요청을 위임한다.
4) 확장 클래스 로더는 부트스트랩 클래스 로더에 요청을 위임한다.
5) 부트스트랩 클래스 로더는 부트스트랩 Classpath(JDK/JRE/LIB)에 해당 클래스가 있는지 확인한다. 클래스가 존재하지 않는 경우 확장 클래스 로더에게 요청을 넘긴다.
6) 확장 클래스 로더는 확장 Classpath(JDK/JRE/LIB/EXT)에 해당 클래스가 있는지 확인한다. 클래스가 존재하지 않을 경우 시스템 클래스 로더에게 요청을 넘긴다.
7) 시스템 클래스 로더는 시스템 Classpath에 해당 클래스가 있는지 확인한다. 클래스가 존재하지 않는 경우 ClassNotFoundException을 발생
클래스 로더의 원칙
1) 위임 원칙
클래스 로더는 클래스 또는 리소스를 찾기 위해 요청을 받았을 때, 상위 클래스 로더에게 책임을 위임하는 위임 모델을 따름
위에서 설명한 클래스 로더 동작 방식을 보면, 위임 법칙을 따른다는 것을 확인
2) 가시 범위 원칙
하위 클래스 로더는 상위 클래스 로더가 로드한 클래스를 볼 수 있지만, 반대로 상위 클래스 로더는 하위 클래스 로더가 로드한 클래스를 알 수 없음
이로 인해 java.lang.Object 클래스 등 상위 클래스 로더에서 로드한 클래스도 하위 클래스 로더인 시스템 클래스 로더 등에서 사용할 수 있음
3) 유일성의 원칙
하위 클래스 로더가 상위 클래스 로더에게 로드한 클래스를 다시 로드하지 않아야 한다는 원칙
위임 원칙에 의해서 위쪽으로 책임을 위임하기 때문에 고유한 클래스를 보장할 수 있음
Top comments (0)