Coding/Java

Java 개발 환경 구축 및 컴파일 과정

heyoon2j 2020. 6. 29. 23:38

Java 개발 환경 구축 및 과정

ㆍ 개발 환경 구축

- Java SE(Standard Edition): 기본 에디션, JVM을 비롯해서 개발에 필수적인 도구와 라이브러리 API를 정의한다. 그리고 자바 프로그램을 개발하고 실행하기 위해서는 반드시 Java SE 구현체인 자바 개발 키트(JDK: Java Development Kit)를 설치해야 된다.

- Java EE(Enterprise Edition): 서버용 애플리케이션 개발 에디션, 분산 환경(네트워크, 인터넷)에서 서버용 애플리케이션을 개발하기 위한 도구 및 라이브러리 API를 정의한다.

 

 

ㆍ Windows

① JDK 다운로드 및 설치

 

AdoptOpenJDK

AdoptOpenJDK provides prebuilt OpenJDK binaries from a fully open source set of build scripts and infrastructure. Supported platforms include Linux, macOS, Windows, ARM, Solaris, and AIX.

adoptopenjdk.net

- 여기서는 AdoptOpenJDK 설치, https://adoptopenjdk.net/

 

- 자신이 원하는 VersionJVM을 선택 후, 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)

[그림 출처] https://www.testingdocs.com/java-platform-overview/

- 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/

[5] https://aljjabaegi.tistory.com/387

[6] https://jeong-pro.tistory.com/148

'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