■ Java 개발 환경 구축 및 과정
ㆍ 개발 환경 구축
- Java SE(Standard Edition): 기본 에디션, JVM을 비롯해서 개발에 필수적인 도구와 라이브러리 API를 정의한다. 그리고 자바 프로그램을 개발하고 실행하기 위해서는 반드시 Java SE 구현체인 자바 개발 키트(JDK: Java Development Kit)를 설치해야 된다.
- Java EE(Enterprise Edition): 서버용 애플리케이션 개발 에디션, 분산 환경(네트워크, 인터넷)에서 서버용 애플리케이션을 개발하기 위한 도구 및 라이브러리 API를 정의한다.
ㆍ Windows
① JDK 다운로드 및 설치
- 여기서는 AdoptOpenJDK 설치, https://adoptopenjdk.net/
- 자신이 원하는 Version과 JVM을 선택 후, Latest release 버튼 클릭
- [시스템 속성] - [고급] - [환경 변수] - [새로 만들기] 클릭
- JAVA_HOME 환경 변수를 추가
- 시스템 변수 Path에 "%JAVA_HOME%\bin;"을 추가
* JAVA_HOME 환경 변수를 설정하는 이유는 자바를 Version 별로 관리하거나 자바를 설치하는 위치가 바뀌었을 때, JAVA_HOME의 변수 값만 바꾸어 주면 자바 명령어를 사용할 수 있게 하기 위해서이다. "%JAVA_HOME%\bin"에 명령어들이 있기 때문에 Path에 포함시킨다.
ㆍ 컴파일 과정
// JDK
① Java Source File(*.java) 작성
② Compiler(javac.exe)을 통해, Byte Code File(*.class)로 변환
③ JVM 구동(java.exe)
// JRE
④ Runtime에 Class Loader를 통해 Byte Code File을 JVM 내로 로드
⑤ ByteCode Verifier을 통해 검증 단계를 거친다.
- Data Types 체크
- Stack OverFlow 체크
- Code가 JVM이 명시한 내용과 일치한지
- Memory에 허가되지 않은 접근이 존재한지
⑥ Execution Engine에 의해서 Byte Code File을 Binary Code로 변환 및 실행
ㆍ JDK(Java Development Kit)
- JDK(Java Development Kit): 자바 개발 키트, JRE + 개발에 필요한 도구(컴파일러, java.exe 등)
- JRE(Java Runtime Environment): 자바 실행 환경, JVM + 표준 클래스 라이브러리
- JVM(Java Virtual Machine): 자바 가상 기계, 실제 운영체제를 대신해서 자바 프로그램을 실행하는 가상의 운영체제 역할을 한다(JIT Compiler + GC 등)
* JDK와 JRE는 운영체제 별로 제공된다.
ㆍ Class Loader
- 생성된 Byte Code File(*.class)들을 엮어서 JVM으로 로드하여 Runtime Data Area에 적재한다(자바 애플리케이션이 실행 중일 때 해당 작업을 수행한다)
ㆍExecution Engine = Interpreter & JIT Compiler(Just In Time)
- 기본적으로 Interpreter가 동작하여 명령어 단위로 Byte Code를 해석하게 된다. Interpreter가 코드를 해석하며, 루프, 반복적인 함수 호출 등을 만나 몇 번 이상 중복적인 해석이 이루어진다고 판단되면 JIT Compiler를 통해 Byte Code를 Binary Code로 직접 컴파일하게 된다(Hot Spot Detection).
=> JVM의 경우 메소드 영역에 있는 코드 캐시(Code Cache) 공간에 컴파일된 기계어 코드를 캐싱한다.
ㆍ Garbage Collector
- Heap 메모리 영역에 적재되어 있는 객체들 중에 참조되지 않는 개체들을 탐색하여 제거하는 역할을 한다. GC가 언제 동작을 하는지는 알 수 없다. 다른 특징은 GC가 수행되는 동안 GC를 수행하지 않는 다른 모든 쓰레드는 일시정지가 된다.
ㆍ Runtime Data Area
1) Stack Area
- Class 내의 Method에서 사용되는 정보들이 저장되는 공간, 매개변수, 지역변수, 리턴 값 등이 LIFO 방식으로 저장된다.
- 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당되며, 추가적으로 스레드를 생성하지 않았다면 main 스레드만 존재한다.
2) Method Area
- 코드에서 사용되는 클래스(*.class)들을 클래스별로 런타임 상수풀(runtime constant pool), 필드(field) 데이터, 메소드(method) 데이터, 메소드 코드, 생성자(constructor) 코드 등을 분류해서 저장된다.
- 메소드 영역은 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다.
3) Heap Area
- new 명령어를 통해 생성한 인스턴스와 배열 등의 참조형 변수 정보가 저장되며, Method Area에 저장된 클래스들만으로 생성이 가능하다.
4) PC Register Area
- Thread가 생성될 때마다 생성되는 영역으로 Program Counter 즉, 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다. 이것을 이용해서 쓰레드를 돌아가면서 수행할 수 있게 한다.
5) Native Method Stack Area
- 자바 외 언어로 작성된 네이티브 코드를 위한 영역, C/C++의 Method를 호출할 때 사용된다.
참조(Reference)
[1] https://www.holaxprogramming.com/2013/07/08/java-jvm-bytecode/
[2] https://m.blog.naver.com/2feelus/220738480797
[3] http://blog.naver.com/PostView.nhn?blogId=kbh3983&logNo=220985785358
[4] https://aboullaite.me/understanding-jit-compiler-just-in-time-compiler/
'Coding > Java' 카테고리의 다른 글
Java Loops(반복문) (0) | 2020.09.16 |
---|---|
Java Conditional(조건문) (0) | 2020.09.16 |
Java Operator(연산자) (0) | 2020.09.15 |
Java - Thread (0) | 2020.08.26 |
Java Variable & Data Type (0) | 2020.07.02 |