0. Java 소스코드를 실행하는 과정
1. JDK란 무엇인가?
2. JDK 플랫폼
3. JDK 종류
4. JRE(Java Runtime Environment)란 무엇인가?
5. JCL(Java Class Library)이란
참고 1. Java11에서의 변화
6. JVM(Java Virtual Machine)이란 무엇인가?
7. JVM 구조
0. Java 소스코드를 실행하는 과정
1. 개발자는 에디터나 IDE를 통해 Java 소스코드를 작성한다. 확장자는 .java이여야한다.
2. JDK에 포함된 Java Compiler를 통해 소스코드를 바이트코드로 컴파일한다. 확장자가 .class로 된 파일이 생성된다.
3. .class파일을 JVM의 ClassLoader가 읽어 JVM 메모리에 적재하고 프로그램을 실행합니다.
4. JVM의 Execution Engine은 메모리에 적재된 바이트코드를 Interpreter와 JIT Compiler로 기계어로 해석하며 실행한다.
5. 실행 중 JVM의 메모리 영역 중 Heap영역에서 쓸모 없어진 메모리 영역은 Garbage Collector가 자동으로 해제한다.
6. 프로그램이 종료된다.
1. JDK란 무엇인가?
JDK란 Java 프로그램을 개발하는데 사용되는 소프트웨어 개발 도구와 JRE(Java Runtime Environment)를 포함하고 있다. 각 운영체제에 맞는 JDK를 다운받을 수 있다. 하나의 컴퓨터에 여러 버전의 JDK를 다운받을 수 있다. 아래는 자주 사용하는 도구이다.
javac | 자바 컴파일러로써 소스코드를 바이트 코드로 변환한다. |
java | 자바 컴파일러가 만든 클래스 파일을 해석 및 실행한다. |
jdb | 자바 디버깅 |
javadoc | 소스 코드 주석으로부터 자동으로 문서를 생성해준다. |
jar | 서로 관련 있는 클래스 라이브러리들과 리소소를 하나의 JAR 파일로 묶어준다. |
apt | 어노테이션을 처리한다. |
참고 : docs.oracle.com/en/java/javase/11/tools/tools-and-command-reference.html
2. JDK 플랫폼
1. Java Standard Edition (Java SE)
Java언어로 데스트탑 응용 프로그램을 개발하기 위한 것이다. 개발 도구, 배포 및 여러 라이브러리와 개발 도구로 구성된다.
2. Java Embedded
셋톱 박스와 같은 임베디드 시스템이나 모바일 장치용 애플리케이션을 개발하기 위한 플랫폼이다. Java SE의 일부를 제공하고 모바일 기기에 특화된 라이브러리를 추가로 지원한다.
3. Java Enterprise Edition (Java EE)
Java SE를 기반으로 구축되었으며 웹 응용 프로그램 및 대규모 응용 프로그램을 개발하는데 사용된다.
엄밀히 말하면 위와 같은 플랫폼들은 소프트웨어라할 수 없고 규범이며 실제 구현은 규범에 맞게 OpenJDK와 각 벤더사에서 한다.
3. JDK 종류
JDK는 Java진영 JCP에서 정한 표준 JSR을 통해 OpenJDK가 구현되고 이를 기반으로 각 벤더사에서 표준을 지키는 선에서 추가 및 수정을 한다. OpenJDK는 모든 소스가 무료로 공개되지만 다른 JDK들은 이를 사용하여 상용화 소프트웨어를 개발할 시 유료이며 해당 벤더사의 개발 지원을 받기도 한다.
2021/01/09 - [JAVA 참고] - JCP, JSR, TCK란 무엇인가
1. OpenJDK
Java언어를 소유하고 있는 Oracle은 OpenJDK와 OracleJDK를 관리한다. OpenJDK는 Java SE의 오픈소스 구현이며 소스코드를 제공한다. 버전 업데이트는 지속적으로 하지만 이전 버전에 대한 추가 보안 패치는 지원하지 않는다. GNU General Public License v2 + Classpath Exception 라이센스를 가지고 있다.
2. OracleJDK
OracleJDK는 개인적인 용도로 사용할 경우 무료이지만 이 JDK와 포함된 JVM을 사용하여 상용화 소프트웨어를 개발하여 실행한다면 비용을 지불해야한다. OpenJDK에서 하지 않았던 추가 적인 보안 패치를 OracleJDK에서는 추가로 지원한다 이를 LTS(Long term Support)버전이라 한다. 유료버전의 장점은 Oracle사의 개발 지원을 받을 수 있다.
3. AdoptOpenJDK
비영리기관 London Java Community(LJC)와 같은 개인 및 조직과 Azul, IBM, Microsoft와 같은 기업의 지원을 받는 개방형 커뮤니티이다. Eclipse Foundation에 합류하여 Eclipse Adaptium에 소속된 프로젝트가 되었다. 무료로 바이너리 빌드 및 설치 프로그램을 제공하고 몇몇 버전의 LTS를 제공하며 JVM을 Hotspot과 j9를 선택할 수 있다. 원하는 경우 IBM에서 상업적 지원받을 수도 있다.
다른 JDK는 아래 표를 참고하자
4. JRE(Java Runtime Environment)란 무엇인가?
JRE는 컴퓨터의 운영체제 위에서 실행되며 자바 프로그램을 실행하는데 필요한 클래스 라이브러리 및 기타 리소스를 제공하는 소프트웨어입니다.
Java프로그램의 실행은 개발 프로세스의 일부이기 때문에 JDK에 항상 포함되어있습니다. 하지만 JRE만을 다운로드 받을 수 있습니다. Java로 이루어진 프로그램은 사용자의 실행을 위해 JRE만을 포함하여 배포하기도 합니다.
JRE는 JVM을 포함하고있습니다. 그리고 JDK를 사용하여 생성된 Java코드를 JVM에서 실행하는데 필요한 라이브러리와 결합 후 JVM 인스턴스를 생성합니다. JDK로 생성된 Byte코드는 소스코드의 변경없이 JRE를 통해 모든 운영체제와 시스템 아키텍쳐에서 실행됩니다.
5. JCL(Java Class Library)이란
Java에서 기본적으로 제공하는 JRE에 포함된 라이브러리이다.
- GUI 및 2D 그래픽 : java.awt 패키지로 WindowsOS 환경에서 Java 언어로 GUI와 2차원 그래픽을 그리는데 사용되는 API입니다.
- 문자 : java.lang패키지로 Java에서 문자와 관련된 API를 제공한다.
- 입출력 : java.io, java.nio, java.net등 파일 입출력과 콘솔 입출력, 네트워크와 관련된 API을 제공한다.
- 수학 : java.math 패키지로 수학과 관련된 API를 제공한다.
- XML : java.xml 패키지로 XML 처리를 위한 API를 제공한다.
- JDBC(Java DataBase Connectivity) : java.sql 패키지로 자바에서데이터베이스에 접근하는 API를 제공한다.
더 많은 정보는 여기에서 확인할 수 있다.
출처 : docs.oracle.com/en/java/javase/11/docs/api/index.html
참고1. Java11에서의 변화
java 11부터 JRE이나 서버용 JRE를 더 이상 제공하지 않으며 오직 JDK만 다운받을 수 있으며 필요시 JDK에 포함된 jlink를 사용하여 JRE를 만들 수 있다.
6. JVM(Java Virtual Machine)이란 무엇인가?
JVM은 Java로 작성된 코드 또는 애플리케이션을 구동할때 사용하는 런타임 환경을 제공하는 엔진입니다. Java 바이트 코드를 기계언어로 변환합니다. 다른 프로그래밍 언어의 컴파일러는 각 시스템에 대한 기계어 코드로 변환하지만 Java 컴파일러는 JVM에서 작동하는 바이트 코드로 변환합니다.
JVM은 각 운영체제와 CPU Architecture에 맞게 다운로드 받아야하며 이는 JVM은 시스템 종속적이지만 Java는 시스템 독립적라고 할 수 있다.
Write once, run anywhere(WORA) or Write once, run everywhere(WORE)는 Java를 개발한 sun microsystems사에서 1995년 Java가 시스템에 독립적인 이점에 대해 설명하는 슬로건이다. Java는 JDK에 포함된 자바 컴파일러를 통해 소스코드를 바이트 코드로 컴파일하며 바이트 코드는 JVM이 설치된 모든 장치에서 실행될 수 있음을 의미한다.
7. JVM 구조
1. ClassLoader
ClassLoader는 Java 컴파일러로 컴파일한 후 생성된 바이트 코드 파일(.class)들을 JVM 메모리(또는 Runtime Data Area)에 적재하는 JVM의 하위 시스템이다. 세가지 주요 기능을 수행합니다. Loading, Linking, Initialization
2. Class Method Area
Class 데이터가 저장되는 JVM의 데이더 영역 중 하나입니다. static variables, static blocks, static method, Intstance method가 이곳에 저장됩니다.
3. Heap
모든 new예약어로 생성된 Object와 그것과 관련된 Instance variable과 array는 Heap에 저장됩니다. Class Method Area에 적재된 Class만 생성가능하다. 이 메모리영역은 여러 thread에서 공유됩니다.
4. JVM Language Stacks
Language Stacks은 local vriable을 저장한다. Heap 영역에 생성된 Object의 메모리 주소값을 저장하고 있다. 각 thread는 그에 맞는 JVM stack이 있다. 코드블럭을 만나면 스택프레임을 생성하고 블럭이 끝나면 스택프레임이 사라진다.
5. PC Registers(Program Counter Regitsers)
일반적인 컴퓨터 구조 용어로써 다음에 실행할 명령어의 주소를 가지고있다. thread가 생성될때 함께 생성된다.
6. Native Method Stacks
JVM에서 작동하는 언어 외에 다른 언어(예를들어 C)로 작성한 Method를 저장하는 공간이다.
7. Execution Engine
Execution Engine은 ClassLoader를 통해 JVM Memory(또는 Runtime Data Area)영역에 할당 된 바이트 코드를 실행합니다. 엔진은 Interpreter, JIT Compiler로 이루어져 있다.
- Interpreter : 바이트코드를 순차적으로 한줄씩 읽어 즉시 기계어로 변환하여 실행합니다.
- JIT Compiler(Just-In-Time Compiler) : JVM이 바이트코드를 Interpreter로 즉시 해석하여 실행함과 동시에JIT Compier는 바이트코드 중 필요한 부분을 컴파일하여 기계어로 변환하고 Interpreter가 같은 함수를 여러번 기계어로 변환하는 것을 방지한다. Interpreter의 속도를 보완하기 위해 도입된 compile 기법이다.
- Garbage Collector : JVM은 Garbage Collection을 수행하며 이것은 메모리 관리 기법 중 하나로 프로그램이 동적으로 할당했던(JVM에서 Heap영역에 해당) 메모리 영역 중 필요없게 된 영역을 자동을 해제하는 기능이다. 이미 해제된 메모리에 접근하거나 더 이상 필요하지 않은 메모리가 해제되지 않고 남아있는 등 메모리 관련 버그를 막을 수 있다. 반면 어떤 메모리를 해제할지 결정하는데 드는 자원이 필요하다는 등 단점도 가지고 있다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
프로젝트 시작할 때 자바 버전 고르기 Java 8 vs Java 11 (0) | 2022.01.12 |
---|---|
[Effective Java] Item 1. 생성자 대신 정적 팩터리 메서드를 고려하라 (0) | 2021.07.24 |
[JAVA 기초] Method Overriding이란 무엇인가 (0) | 2021.01.15 |
[JAVA 기초] Wrapper Class란 무엇인가 (0) | 2021.01.11 |
[JAVA 참고] JCP, JSR, TCK란 무엇인가 (0) | 2021.01.09 |