JDK, JRE, JVM
JDK : Java Development Kit / 자바 개발 도구
JRE : Java Runtime Environment / 자바 실행 환경
JVM : Java Virtual Machine / 자바 가상 기계
Java의 호환성
Java는 Write Once Use Anywhere (소스파일 하나면 어디든 사용 가능) 이라는 목적을 가지고 있다.
즉 우리는 Java를 사용하여 기계의 기종별 즉, 운영체제에 구애받지 않고 개발을 할 수 있다.
여기서 Java의 목적파일은 반기계어인 바이트코드(.class)인데 이는 운영체제가 아니라 JVM에서 사용된다
소스코드를 바이트 코드로 컴파일 해주는게 자바 컴파일러(javac)이다. *사진참고
Java의 실행 과정
- 개발자는 자바 소스파일(.java)를 작성
- JDK가 제공하는 javac를 사용하여 소스파일을 컴파일
- JVM의 Class Loader는 컴파일로 생성된 바이트 코드(.class)를 전달 받아 동적 로딩을 통해 실행에 필요한 클래스들을 로딩하여 JVM 내부 Runtime Data Area에 로드
- JVM의 Execution에 의해 기계어로 해석되어 실행
Class Loader
- JVM 내부에 바이트 코드를 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈이다.
- 프로그램 상의 작성한 모든 클래스, 변수 및 메서드의 정보를 Method Area에 배치한다.
- 실행될 때 동적으로 클래스를 로드하고 jar 파일 내부에 저장되어 있는 클래스들을 JVM에 로드한다.
- static(정적) 변수와 메서드는 Heap Area에 배치한다.
Execution(실행 엔진)
- Interpreter는 바이트 코드를 한줄 씩 읽고 번역해 주는데 느리다는 단점이 있다.
- 이를 보완하기 위해 나온 것이 JIT 컴파일러
- JIT 컴파일러는 Interpreter 방식으로 실행을 하다가 적당한 시점에 바이트 코드 전체를 컴파일하여 캐싱한다.
- 컴파일된 코드를 저장해 두기 때문에 이 코드들은 Interpreter를 통해 실행되는 것이 아니라 바로 실행이 된다 그렇기 때문에 실행 속도가 매우 빨라진다.
- Garbage Collector는 간단하게 설명 하자면 유효하지 않은 즉, 사용되지 않는 메모리를 추적하여 비워주는 기능을 한다.
Compile 언어와 Interpreter 언어
Compile 언어 (C, C++, Java, C# ...)
- 소스파일 전체를 컴파일 한 후 기계어를 CPU와 메모리를 통해 읽어서 바로 실행하는 방식으로 동작이 되는 언어
- 소스파일의 크기가 크면 컴파일 과정이 오래 걸릴 수 있다.
- 컴파일이 된 후에 기계어로 바로 실행되기 때문에 실행 속도가 빠르다.
- Java는 javac에 의해 바이트코드로 컴파일 되지만 JVM에서는 인터프리터로 실행된다.
그러므로 Compile 언어이지만, Interpreter 언어의 특징을 동시에 가진다
Interpreter 언어 (Javascript, Ruby, Python ...)
- 소스파일을 컴파일하지 않고서 Interpreter를 사용하여 소스파일을 한줄 씩 번역하면서 실행하는 방식으로 동작이 되는 언어 Interpreter : 소스 코드를 바로 번역하여 실행하는 프로그램 혹은 환경
- 컴파일 언어처럼 별도의 목적파일이 존재하지 않는다.
- 컴파일 과정 없이 바로 실행되기 때문에 수정 및 디버깅시 편하다.
- Interpreter 만 존재하면 어디서든지 실행이 가능하기 때문에 자유롭고 독립적이다.
- 실시간으로 번역 되면서 실행되기 때문에 실행 속도가 느리다.