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에 배치됨
image from https://aljjabaegi.tistory.com/387
나. 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
•
자바 환경, https://wikidocs.net/257
•
Java compile 흐름, https://aljjabaegi.tistory.com/387