(수근수근)

1주차 JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. 본문

JAVA

1주차 JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.

InformationFarm 2021. 1. 4. 16:18

github.com/whiteship/live-study/issues/1

 

1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. · Issue #1 · whiteship/live-study

목표 자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기. 학습할 것 JVM이란 무엇인가 컴파일 하는 방법 실행하는 방법 바이트코드란 무엇인가 JIT 컴파일러란 무엇이며 어떻게 동작하는지 JV

github.com


목표

자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.

학습할 것

  • JVM이란 무엇인가
  • 컴파일 하는 방법
  • 실행하는 방법
  • 바이트코드란 무엇인가
  • JIT 컴파일러란 무엇이며 어떻게 동작하는지
  • JVM 구성 요소
  • JDK와 JRE의 차이

JVM이란 무엇인가

JAVA Virtual Machine 자바 가상 머신의 약자이다. JVM은 class를 읽어들여 자바API와 함께 실행한다. 자바가 모든 플랫폼 위에서 작동한다는 것은 JVM이 OS와 JAVA사이에서 중개자 역할을 하기 때문이다. 

또한 JVM의 중요한 역할 한가지는 메모리관리와 최적화이다. 따라서 JVM은 매우 뛰어난 프로그래머들에 의해 유지보수 되고있고 따라서 JVM의 메모리관리는 일관성 있고 최적화 되어있다.

 

정리. JVM의 2가지 역할
1. 모든 플랫폼 위에서 JAVA가 작동가능하게 함
2. 메모리 관리와 최적화를 진행해줌

컴파일 하는 방법 & 실행하는 방법

1. Java Compiler에 의해 Java Source(.java 확장자)로부터 Byte Code(.class 확장자) 로  변환이 된다.

 

2. JVM의 Class Loader에 의해서 byte로 변환된 코드는 JVM으로 로드된다.

3. 실행엔진에 의해서 컴퓨터가 알아들을 수 있는 기계어로 해석이 되어 Runtime Data Area로 배치된다.

실행엔진에는 2가지 compiler가 존재한다
- interpreter : 자바의 바이트 코드를 한줄 씩 수행 (실행이 적게되는 코드에서 유리)
- JIT Compiler : 전체 바이트 코드를 컴파일하고 캐시에 보관하여 직접 실행 (여러번 실행되는 코드에서 유리)

 

4. 실행 엔진에 의해서 JVM메모리에 올라온 바이트 코드를 하나씩 가져와서 실행한다

 

 

바이트 코드란 무엇인가

자바 바이트코드란 JVM이 실행하는 명령어의 형태이다. 기계가 실행하는 기계어는 아니지만 중단단계인 코드라고 보면된다.  명령어의 크기가 1byte라서 자바바이트 코드라고 불린다.

예를 들어서 다음과 같은 자바 코드가 있다고 생각해보자

for (int i = 2; i < 1000; i++) {
    for (int j = 2; j < i; j++) {
        if (i % j == 0)
            continue outer;
    }
    System.out.println (i);
}

이 자바 코드를 자바 컴파일러는 바이트 코드로 변환하면 아래와 같이 변환 된다

0:   iconst_2
1:   istore_1
2:   iload_1
3:   sipush  1000
6:   if_icmpge       44
9:   iconst_2
10:  istore_2
11:  iload_2
12:  iload_1
13:  if_icmpge       31
16:  iload_1
17:  iload_2
18:  irem
19:  ifne    25
22:  goto    38
25:  iinc    2, 1
28:  goto    11
31:  getstatic       #84; // Field java/lang/System.out:Ljava/io/PrintStream;
34:  iload_1
35:  invokevirtual   #85; // Method java/io/PrintStream.println:(I)V
38:  iinc    1, 1
41:  goto    2
44:  return

 

JIT 컴파일러란 무엇이며 어떻게 동작하는지

JIT는 Just-In-Time에 약자이다. 직역을 한다면 실행하는 시점에서 컴파일을 해준다? 라는 의미인 것 같습니다.

JIT컴파일러는 네이티브가 아닌 코드를 실행시키기 직전에 네이티브 코드로 바꾸는 컴파일 과정을 말합니다. 

JIT 컴파일은 인터프리터와 컴파일이 혼합된 방식으로 실행시점에 기계어로 컴파일이 됩니다.

 

단점으로는 조금 느리다는 점이 있다 하지만 자바가 전통적인 컴파일 방식을 이용하지 않고, JIT를 사용하는 이유는 모든플랫폼에 따라 다르게 적용되기 때문에 유연성 측면에서 적용한 것으로 추측이 됩니다. 

 

JVM 구성요소

JVM은 크게 4가지로 구분이 됩니다.

  • Class Loader
  • Excution Engine
  • Native
  • Runtime Data Area (=memory) 는 5자기로 구성
    • Method Area(class Area , Code Area, Static Area)
    • Heap Area
    • Stack Area
    • PC Registers
    • Native Method Stactic

Class Loader 

클래스 로더는 로딩, 링크, 초기화 순서로 진행되는데 클래스 파일을 Runtime Data Area로 적재하는 역할을 한다

로딩 : class 파일을 읽고 내용에 따라 적절한 바이너리 데이터로 만들어 메서드 영역에 저장
링크 : Verify (class파일 유효성체크) -> Prepare (클래스변수 기본값 메모리 ) -> resolve(메모리 래퍼런스를 실제레퍼런스로 교체) 세단계로 실행 
초기화 : static 변수의 값을 할당 / static 블럭은 이때 실행 

 

Excution Engine

Runtime Data Area에 적재된 바이너리 코드들을 컴퓨터가 이해할 수 있는 기계어로 변경해 명령어 단위로 실행하는 역할! 엔진에는 2가지 방식이 존재하는데 interpreter방식과 JIT Compile방식이 존재합니다. 

 

Runtime Data Area

Method Area : 인터페이스, 클래스변수, 데이터타입, 리턴 static 이정보는 공유된다

Heap : new연산자로 생성한 객체가 힙영역에 저장, 힙영역에 주소값을 가지고 있음, 정보들이 공유된다

call stack :  스레드가 생성될때 생성되는 영역. 지역변수가 저장. 메서드를 호출할때마다 스택 개별생성

PC Register  : Program Counter 실행중인 라인의 물리적 메모리 주소를 저장합니다.

Native method stack : 자바 언어 이외의 언어로 작성된 코드를 저장하는 메모리영역

JDK와 JRE의 차이

JDK : 자바 응용프로그램 및 애플릿을 만드는데 사용되는 환경을 제공 / 개발 키드 
      - JRE + Complier + Debuggers ....
      - JDK를 다운로드하면 JRE도 다운로드 되므로 다운로드할 필요가 없다.
JRE : JVM + Libraries 자바로 작성된 응용 프로그램을 생성하기 위해 패기지화하는 제품번들

 

 

'JAVA' 카테고리의 다른 글

2주차 과제: 자바 데이터 타입, 변수 그리고 배열 #2  (0) 2021.01.07
Comparator & Comparable  (0) 2020.08.31
Comments