Search

Java Compiling Process

1. 용어 정리

가. 자바 환경

JVM(Java Virtual Machine): 자바 바이너리 파일을 읽고 검증하고 실행(implementation)
→ implementation: 표준 명세에 따라 동작하는 것
JRE(Java Runtime Environment): OS 환경에 따라 JVM이 자바 프로그램을 실행할 수 있는 환경 제공
→ 각종 라이브러리 및 기타 파일 제공
JDK(Java Development Kit): 자바 프로그램 개발에 필요한 도구 모음

나. 메모리 영역

Static(=Method Area): 클래스 변수와 static 멤버가 저장되는 영역
Stack(=Stack Area): 메소드 호출에 따라 메소드 실행에 필요한 메모리를 할당 받아서 저장되는 영역
Heap(=Heap Area): 객체의 인스턴스가 저장되는 영역

2. 자바 컴파일 방식

가. 컴파일 전체 흐름

.java → ( by Java Compiler ) → byte code(.class) → ( by JVM ) → binary code(machine lang)
개발자는 소스코드(.java)를 작성함
소스코드(.java)가 빌드되면 Java Compiler의 javac 명령에 따라 byte code(.class)파일이 생성됨
→ byte code는 아직 기계어로 변환되지 않았으므로 컴퓨터는 이해할 수 없음
byte code(.class)는 class loader(JVM의 subsystem)에 의해 JVM으로 로드되면서 동적 관리됨
→ 동적 관리: 한번에 모든 클래스 파일을 로드하는 것이 아니라 런타임 환경에서 필요한 클래스 파일을 로드하는 것
JVM으로 로드된 byte code는 Execution Engine에 의해 binary code로 해석되고 Data Area에 배치됨

나. Class Loader

binary code(.class)에 대해 런타임 환경에서 세 가지 단계(load, link, initialize)에 따라 동적으로 관리함
Loading: 클래스 파일 로딩
Linking: 클래스 파일의 정적 변수를 기본값(0)으로 저장
Initialization: 클래스 파일의 정적 변수를 초기값으로 저장

다. Runtime Data Areas

라. Execution Engine

Interpreter: byte code(.class)를 한 줄씩 읽고 실행함
JIT(Just In Time) Compiler: 한 번 읽은 byte code 전체를 한 번에 실행함
→ 한 번만 읽는 코드의 경우 속도가 느릴 수 있지만 반복적으로 읽는 코드가 있으면 한줄씩 읽지 않고 한번에 읽고 실행하므로 실행속도가 향상됨
Garbage Colletor: 참조되지 않은 객체를 찾아서 제거함

Reference

김종민, 스프링 입문을 위한 자바 객체지향의 원리와 이해
남궁성, 자바의 정석 3rd Edition