자바 실행구역별 역할
- Java Compiler : .java파일을 byte 코드(.class)로 변환 (= 컴파일한다.)
- Java Compiler는 JVM이 아닌, JDK 안에 있다. (명령어 : javac)
- Class Loader : 클래스 로딩, 바이트코드 검증(= 클래스 검증), 클래스 링킹, 클래스 초기화
- 필요한 클래스들을 찾아서 JVM이 실행할 수 잇는 형태로 메모리에 로드. (= 클래스 로딩)
- 컴파일된 .class 파일이 올바른지, 에러는 없는지 확인. (= 바이트코드 검증, 컴파일 에러체크)
- 다른 클래스와의 의존성 연결. 상속, 인터페이스, 필드, 메서드 등등. (= 클래스 링킹)
- 클래스의 정적 변수와 정적 블록을 초기화. (static) (= 클래스 초기화)
- Excution Engine(실행엔진) : 바이트코드 해석, 메모리 관리, 스레드 관리.
- JVM 종류에 따라 Interpreter만 있기도, JIT compiler만 있기도, 두개 모두 있기도 한다.
- 자세한 내용은 [] 포스팅을 참고. (작성 후 링크 업로드예정)
- byte code를 컴퓨터가 읽을 수 있는 기계어(0과 1)로 번역한다. (=바이트코드 해석)
- 객체의 생성과 소멸, 메모리 할당 및 해제, 가비지 컬렉션 등을 통해 메모리를 관리한다. (= 메모리 관리)
- 멀티스레딩 환경에서 스레드 스케줄링 및 동기화를 관리한다. (=스레드 관리)
- Runtime Data Area : 예외 처리, 스레드 동기화.
- 자바 프로그램 실행을 위한 모든 값을 저장하는 메모리공간이다.
- 메서드 영역의 위치한 예외 헨들러 테이블(Exception Handler Table)을 통해 예외 발생 시 예외 처리기(catch, throws)로 제어흐름을 전달한다. (=예외 처리)
- 메서드 영역와 힙 영역을 통해 여러 스레드들 간의 데이터를 공유하고 동시성 제어를 한다. (=스레드 동기화)
자바 프로그램 실행순서
개발자가 .java 코드를 자바컴파일러에게 넘긴다.
→ 자바컴파일러가 (JVM이 해석가능한 byte code인) .class로 번역해 파일을 생성한다.
→ .class 파일과 함께 JVM에 실행요청을 보낸다. (class loader로 간다.)
→ class loader가 byte code의 유효성을 검사하고 클래스를 메모리에 로드, 링킹, static부분의 초기화를 진행한다. 그리고 main메서드 위치를 찾는다.
→ main메서드를 Excution Engine을 통해 기계어로 번역해 프로그램을 실행한다.
→ main메서드 내부에서 작성한 프로그램 코드가 순차적으로 실행한다.
(main 메서드의 실행 완료 시 프로그램이 종료된다.)
그 외, 참고하면 좋을 자료
https://dzone.com/articles/jvm-architecture-explained
위의 내용에서 Class Loader의 명칭은 현재 변경되었으나, 역할은 동일하다. 명칭이 달라도 혼란하지 말자.
(현재는 Bootstrap ClassLoader, Platform ClassLoader, System ClassLoader 이다.)