스터디 할래 - 깃헙 페이지
이미지 작성 - draw.io
1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.
JVM은 Java Virtual Machine의 약자로 자바 프로그램은 완전한 기계어가 아닌 바이트코드로 되어 있기 때문에, 바이트코드를 해석하고 실행하는 가상의 운영체제가 필요하다. 이것이 JVM이며, 운영체제 별로 자바 프로그램을 별도로 개발하는 것보다는 운영체제와 자바 프로그램을 중계하는 JVM을 두어 자바 프로그램이 여러 운영체제에서 동일한 실행 결과가 나오도록 설계되어 있다. 따라서 개발자는 운영체제와 상관없이 자바 프로그램을 개발할 수 있다.
이미지1. 자바 프로그램 실행 단계
컴파일이란 어떤 언어의 코드를 다른 언어로 바꿔주는 과정을 얘기하며, 자바에서 컴파일러의 역할은 "이미지1"에서 볼 수 있듯이 소스 파일(.java)을 바이트코드(.class)로 변환하는 역할을 한다.
<Hello.java>
public class Hello {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
자바 코드인 Hello.java를 컴파일 및 실행하는 방법은 아래에서 설명하고자 한다.
이미지2. Bash shell에서 자바 코드 컴파일 및 실횅
이미지3. 윈도우의 명령 프롬프트에서 자바 코드 컴파일 및 실행
이미지2, 3에서 보면 'javac Hello.java'로 컴파일을 하면 java.class인 바이트코드가 생성이 되고, 해당 바이트코드를 'java Hello'로 실행하여 "Hello World!"가 출력되는 것을 확인할 수 있다.
바이트코드(Bytecode)란 사람(프로그래머)이 작성한 소스 코드를 가상머신이 이해할 수 있는 중간 코드로 컴파일한 것을 말한다.(위키피디아에서는 이진표현법이라고 설명학고 있다.)
이미지 2, 3에서 Hello.class를 바이트코드라 할 수 있다.
JIT은 Just In Time의 약자이며 JIT 컴파일러는 런타임(실제 실행하는)시점에 기계어로 변환된 코드를 캐싱하기 때문에 재사용시 컴파일을 다시 할 필요가 없으며, JVM 내부의 최적화를 통해 JIT 컴파일러의 성능을 향상시켰다.
이미지4. 컴파일 타임과 런타임에 동작하는 자바 프로그램 동작 과정
이미지5. 클래스 로더 세부 실행 단계
Execution Engine
Execution Engine은 class loader를 통해 배치된 클래스를 해석하여 실행시키며 이 때, 인터프리터 방식과 JIT 방식으로 실행 된다.
Runtime Data Area
Runtime Data Area는 JVM이 프로그램을 수행하기 위해 운영체제로부터 할당 받는 메모리 영역이다.
5개의 영역으로 나뉘어져 있으며 다음과 같다.
Garbage Collector
Garbage Collector는 줄여서 GC라고도 부르며, 동적으로 할돵된 메모리 영역 중에서 사용할수 없는 영역을 탐지해 해제하는 기능이다. 따라서 자바 프로그램 개발 시 개발자는 동적으로 할당한 메모리 해제를 GC가 처리해주기 때문에 개발에 집중 할 수 있게 해준다는 장점이 있다.
이미지6. JVM 구조
자바 프로그램을 개발하고자 하는 것이 아닌, 이미 개발된 프로그램만 실행하기를 원한다면 JRE만 설치되어 있어도 무방하다.
이미지7. JDK & JRE 포함 관계
이것이 자바다(신용권 저, 한빛미디어)
바이트코드 - 나무위키
바이트코드 - 위키피디아
JIT컴파일 - 위피키피다
JVM 구성 요소
JVM 구성 요소2