[STUDY HALLE] 1주차 과제: JVM

2 minute read

/* 실제로는 2020-12-31에 작성된 게시물입니다. */

학습 목표

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

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

Deadline: ~2020/11/21 22:00

JVM

JVM(Java Virtual Machine)은 자바 바이트 코드를 어느 환경에서든 실행시킬 수 있도록 해주는 주체이다. JVM는 이식성이 좋고, Garbage Collector기능을 통해 메모리를 관리해준다. 이 두 가지 장점은 1995년에 자바가 세상에 나왔을 때, 이전까지 특정 OS에 맞춰 개발하고 직접 메모리를 관리해야했던 개발자들에게 큰 충격을 주었다고한다. 물론 서로 다른 OS에서는 서로 다른 JVM이 필요하다. 하지만 프로그램 개발자 입장에서는 이것을 신경쓰지 않아도 되므로 이식성이 좋다고 말 할 수 있는 것이다.

java excution

(1) 컴파일 하는 방법

$ javac main.java

(2) 실행하는 방법

// 확장자(.class)는 명시하지 않는다
$ java main

바이트코드

바이트코드(Bytecodee)는 특정 하드웨어가 아닌 가상 머신에서 돌아가는 실행 프로그램을 위한 이진 표현법이다. 자바 또한 JVM이라는 가상 머신을 사용하므로, 개발자가 작성한 고급언어(JAVA)를 JVM이 이해할 수 있는 중간 코드인 자바 바이트코드로 컴파일하여 사용한다. 컴파일러가 고급언어를 기계어로 바꾸어준다는 정의를 생각해보면, JVM을 단어 그대로 가상의 ‘기계’ 로 이해하는 것이 좋을 것 같다.

JVM 구성 요소

JVM의 구성 요소는 다음과 같다.

  1. 클래스 로더(class loader)
  2. 자바 인터프리터(interpreter)
  3. JIT 컴파일러(Just-In-Time compiler)
  4. 가비지 컬렉터(garbage collector)

클래스 로더는 JVM에 클래스 파일을 load하고 link를 통해 배치를 수행하는 모듈이다. 자바는 컴파일 타임이 아니라 런타임에 동적으로 클래스를 로드한다.

Execution Engine을 이용해서 배치된 클래스를 실행시키는데, 이 때 인터프리터나 JIT 컴파일러 방식을 사용한다. 인터프리터 방식은 바이트 코드를 명령어 단위로 실행하는데, 이 때문에 수행 속도가 느리다는 단점이 있다. 흔히 컴파일러와 인터프리터를 대조적으로 설명하는데, 이를 생각해보면 자바 코드의 실행 과정이 조금 이상하게 느껴진다. 컴파일러와 인터프리터를 둘 다 사용하기 때문이다. 하지만 생각해보면 이런 이상한(?) 과정 덕분에 JVM의 이식성이 완성된다고 할 수 있겠다.
그리고 또 다른 방식인 JIT 컴파일러는 인터프리터의 단점을 보안하기 위해 런타임시 바이트 코드를 네이티브 코드로 컴파일하는 방식이다. 컴파일 된 네이티브 코드는 캐시에 보관되므로 빠르게 실행할 수 있다. 딘 힌 반만 실행되는 코드라면 JIT가 오히려 불리할 수 도 있기때문에, JVM은 해당 메소드가 얼마나 자주 수행되는지 체크하고 컴파일을 수행한다.

가비지 컬렉터(GC)는 동적으로 할당된 메모리 중 사용되지 않는 메모리를 해제한다. stack의 모든 변수를 스캔하면서 어떤 객체를 참조하는지 마킹하고 Reachable Object가 참조하는 객체를 찾아서 마킹한 뒤, 마킹되지 않은 객체를 heap에서 제거한다(sweep). 여기서 Reachable Object란 유효한 레퍼런스가 있는 객체를 의미한다. 그림을 보면서 이해해보면

Reachable Object_1

Root Set은 항상 유효한 가장 처음의 참조를 의미한다. 그리고 객체 사이의 참조 관계를 이어보면

Reachable Object_2

위와 같이 녹색으로 분류된 Reachable Object를 찾아낼 수 있다.

JDK와 JRE의 차이

JRE는 자바 실행환경(Java Runtime Environment)의 약자로, JVM 이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가지고 있다.
반면 JDK는 자바 개발도구(Java Development Kit)의 약자로, JRE + 개발을 위해 필요한 도구(javac, java등)를 포함한다.

참고문헌

https://kim6394.tistory.com/215 http://www.tcpschool.com/java/java_intro_programming https://longbeom.tistory.com/15 https://wikidocs.net/257

Leave a comment