-
[live-study] 1주차 :: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가JAVA/라이브 스터디 | whiteship 2020. 12. 26. 13:44
참고도서 : Java의 정석, Java in a Nutshell
0. Java
Java란?
- Java는 1995년 썬 마이크로시스템즈(Sun Microsystems, 현재 오라클사에 인수)에서 개발된 객체지향 프로그래밍 언어이다.
Java의 특징
- 한 번 작성하면, 어디서나 실행된다. (Write once, run anywhere)
- Java 응용 프로그램은 다른 응용 프로그램과 달리 운영체제에 독립적이다.
- 하지만 JVM에 종속적이어서, 여러 운영체제에 맞는 JVM이 제공되고 있다.
- 객체지향 언어이다.
- 객체지향(Object-oriented)중의 하나로 상속, 캡슐화, 다형성 등을 특징으로 갖고 있다.
- 메모리를 자동으로 관리할 수 있다. (Garbage Collection)
- 가비지컬렉터(Garbage Collector)가 자동으로 메모리를 관리하기때문에, 개발자는 따로 메모리를 관리할 필요가 없다.
- 멀티쓰레드(Multi-Thread)를 쉽게 구현 가능할 수 있다.
- 동적로딩(Dynamic Loading)을 지원한다.
- 자바는 보통 여러개의 클래스로 구성이 되어 있다. 하지만 동적 로딩을 지원하기 때문에 실행 시에 모든 클래스가 실행되는 것이 아니라 필요한 시점에 클래스를 로딩하여 실행 할 수 있다.
- 일부 클래스가 변경되어도 전체 어플리케이션을 다시 컴파일 하지 앟ㄴ아도 된다.
- 풍부한 클래스 라이브러리(Java API)를 지원한다.
- 자바는 다양한 오픈소스 라이브러리를 제공한다.
1. JVM이란 무엇인가 (Write Once, run anyware)
JVM이란?
- JVM은 Java Virtual Machine의 약자로, 자바 프로그램을 실행하기 위한 가상 기계 이다.
- 자바는 일반적인 어플리케이션과 달리 OS에 종속적이지 않고, JVM과 상호작용을 하게 된다. 그리고 JVM은 OS와 종속적인 관계이다. JVM은 window용, Mac용, Linux용 처럼 PS에 종속적인 형태로 존재한다. 따라서 어떠한 운영체제에 맞게 개발된 프로그램이어도 JVM이 있기 때문에 또 다른 운영체제에서 실행한다 하더라도 문제가 없다. 그래서 한 번 작성하면 어디서든 실행된다(Write once run anywhere)가 가능한 것이다.
2. 컴파일 하는 방법컴파일러(Compiler) 란?
- 컴파일러(Compiler)는 특정 프로그래밍 언어(고급언어, 사람이 이해하기 쉬운 언어, Java/C++ 등)로 쓰여 있는 코드를 기계어(저급언어, 기계가 이해할 수 있는 언어)로 변환하는 프로그램을 말한다. 그리고 이러한 과정을 컴파일(Compile)이라고 한다.
자바의 컴파일과정
- 소스파일(*.java)을 작성한다.
- 컴파일러(javac.exe)가 소스파일을 컴파일 하여, 바이트코드(*.class)파일을 생성한다.
- 이 후, 바이트코드(.class)는 클래스로더에 의해 JVM내로 로드가 되는 등의 과정이 있으나, 자세한 부분은 생략한다.
javac == compiler ?
- 컴파일러(Compiler)는 보통 기계어로 변환을 하지만, javac는 바이트코드로 변환한다. 그리고 바이트코드는 완전한 기계어라고 말할 수 없으며, 사람이 읽을 수 있는 언어도 아니다.
- 하지만 Java in a Nutshell 책에서 "소스코드 컴파일러" 와 "javac 컴파일러"로 사용한 것처럼 편의상 "컴파일러"라고 표현했다.
3. 실행하는 방법
컴파일 이후 실행하는 과정
- 인터프리터(Interpreter)가 컴파일 후 생성된 바이트코드(.class)를 한 줄씩 읽으며 기계어로 변역한다.
- 자바의 단점 중 대표적인 것이 속도문제인데, 인터프리터가 바이트코드를 한 줄씩 읽어 변환하는 이 과정 때문이다.
- 이러한 단점을 보완하기 위해 JIT컴파일러와 HotSpot과 같은 신기술이 도입되었다.
4. 바이트코드란 무엇인가바이트코드란
- 하드웨어에서 돌아가는 기계언어가 아닌, 가상환경에서 실행될 때
- 바이트코드란 쉽게 말하자면 기계언어와 소스코드 사이의 표현법이라고 말할 수 있다. 기계언어보다 더 추상적이며, 사람이 읽기 어렵다.
5. JIT 컴파일러란 무엇이며 어떻게 동작하는지컴파일러(Compiler)와 인터프리터(Interpreter)의 차이
- 일반적으로 컴파일러(Compiler)는 소스코드 전체를 변환한 후 실행하는 반면에 인터프리터(Interpreter)는 소스코드의 한 줄 단위로 실행시킨다.
- 컴파일러를 사용하는 대표적인 언어는 C, Java 등이 있고, 인터프리터를 사용하는 언어에는 Python, LISP, Basic 등이 있다.
JIT 컴파일러
- JIT 컴파일러(just-in-time compliation)는 런타임 시 바이트코드를 원시코드로 컴파일하여, Java 어플리케이션의 성능을 향상시키는 런타임 환경의 컴포넌트이다. 이는 Java의 단점 중 하나인 '속도가 느리다' 라는 부분을 보완해준다.
- 런타임시에, JVM은 class file을 로드 하게 되고, 각각의 바이트코드에 적절한 계산을 수행한다. 해석되는 동안 추가 프로세서와 메모리 사용량은 Java 어플리케이션이 native appliation보다는 퍼포먼스가 더 느리다라는 뜻이다. 즉, JIT 컴파일러는 런타임시 바이트코드를 native machine으로 컴파일하는 과정을 통해 Java 프로그램의 퍼포먼스를 높여준다.
6. JVM 구성 요소JVM의 구성요소
- JVM은 Class Loader, Memory Area, Execution Engine 등으로 구성되어 있다.
Class Loader
- 클래스 로더(Class Loader)는 클래스 파일을 로드하기 위한 서브시스템이다.
- Loading, Linking, Initializing 세 가지의 주요 기능을 갖고 있다.
JVM Memory
- Method Area는 메타데이터(metadata), 상수 런타임 풀(the constant runtime poo), 메소드에 대한 코드(the code for methods) 와 같은 클래스 구조를 저장하고 있다.
- Heap은 모든 개체와 관련 인스턴스 변수들, 그리고 배열들을 저장한다.
- JVM Language Stacks는 로컬 변수를 저장하고 그에 대한 부분적인 결과를 얻는다. 각각의 쓰레드는 각각 자체적인 JVM 스택을 가지고 있으며, 이는 쓰레드가 생성될 때 동시에 생성된다.
- PC Registers는 현재 실행되고 있는 Java 가상 머신의 명령 주소를 저장한다. Java에서는 각각의 쓰레드가 별개의 PC 레지스터를 갖고 있다.
- Natvie Method Stacks는 native library에 따라 native code의 명령을 쌓아놓는다.
Execution Engine
- Execution Engine은 바이트 코드를 실행시킨다. 바이트 코드를 JVM 내부에서 이해할 수 있는 형태로 변형한다.
Native Method Interface
- Native Method Interface는 프로그래밍 프레임워크이다. 이것은 JVM에서 실행중인 자바코드가 라이브러리 및 native 어플리케이션에서 호출할 수있다.
Native Method Libraries
- Native Method Libraries는 실행엔진에 필요한 Native Libraries(C, C++)의 콜렉션이다.
7. JDK와 JRE의 차이
JDK와 JRE
- JDK = JRE + 개발에 필요한 실행파일 (디렉토리 bin > javac.exe 등)
- JRE = JVM + 클래스라이브러리 (Java API)
참고자료
- [JVM | What is Java Virtual Machine & its Architecture]
- [Understanding JIT compiler(just-in-time compiler)]
- [JDK vs JRE vs JVM: Key Differences]
'JAVA > 라이브 스터디 | whiteship' 카테고리의 다른 글
[live-study] 6주차 :: 상속 (0) 2021.01.09 [live-study] 5주차 :: 클래스 (0) 2021.01.01 [live-study] 4주차 :: 제어문 (0) 2020.12.31 [live-study] 3주차 :: 연산자 (0) 2020.12.28 [live-study] 2주차 :: 자바 데이터 타입, 변수 그리고 배열 (0) 2020.12.26