[백기선님과 함께하는 Live-Study] 1주차 - JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.

JoonYoung Maeng·2020년 12월 7일
1
post-thumbnail

목표

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

학습과정

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

JVM이란 무엇인가?

JVM은 Java Vertual Machine의 줄임말이며, Java 바이트코드(*.class 파일)를 운영체제나 CPU등에 종속적이지 않고 독립적으로 실행할 수 있는 주체이다.

즉, Java 파일만 있다면 어떤 환경에서도 JVM 위에서 해당 파일을 실행할 수 있다.

또한, 프로그램의 메모리를 직접 관리메모리를 최적화 시킨다.


JVM의 구성요소

JVM은 크게 Class loader, Runtime Data Areas, Excution Engine 3가지로 구성된다.

jvm

출처 : https://thinkground.studio/자바-메모리-구조-java-memory-structure/

Class Loader(클래스 로더)

Java 컴파일러로 컴파일된 Java 바이트 코드를 Runtime 시점에 JVM내로 가져오고 Runtime Data Area(JVM 메모리 영역)에 배치해주는 역할을 한다.

Runtime Data Area

JVM의 메모리 영역에 해당하며 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack으로 세분화된다.

  • Method Area : Class, Interface, Method, Field, Static, Final 변수 등을 보관하는 영역
  • Heap Area : new 키워드로 생성된 객체나 배열 인스턴스를 보관하는 영역, Runtime 시 동적으로 생성되고 JVM이 사용여부를 판단 후 Garbage Collection을 하는 영역
  • Stack Area : Heap Area에 동적으로 생성되어 보관되있는 객체(참조 타입)의 래퍼런스를 보관하는 영역, 기본 타입의 경우 직접 Stack Area에 보관됨
  • PC Register : Thread가 생성될 때 생성되는 영역으로서 Thread마다 하나의 영역을 가진다. JVM이 현재 수행중인 명령의 주소를 가짐
  • Native Method Stack : Java외 다른 언어로 작성된 Native Code를 위한 Stack 영역

Execution Engine

Class Loader를 통해 Runtime Data Area영역에 배치된 바이트 코드를 실행하는 역할을 한다.


Java 컴파일 과정

출처 : https://ttuk-ttak.tistory.com/38

자바 소스 파일(.java)이 있다면 해당 파일을 Java Compiler가 JVM이 해석할 수 있는 파일인 Java ByteCode (.class)파일로 변환한다. Java Compiler는 Java 설치 시 Javac.exe라는 실행 파일 형태로 존재한다.


Java 실행 방법

Java Compiler를 통해 만들어진 Java Bytecode (*.class)를 Class Loader를 통해 가져온 후 Runtime Data Area에 배치한다.

이후 Execution Engine에서 바이트코드를 기계어로 해석한다. Execution Engine은 인터프리터 방식 혹은 JIT(Just-In-Time) Compiler 방식이 있다.

  • 인터프리터 방식은 소스 코드를 한 문장씩 읽으며 해당 문장을 기계어 코드로 변환시켜준다.
  • JIT Compiler는 실행 시점에 기계어 코드로 변환시켜준다.

Java 바이트 코드란?

Java 바이트 코드란 Java Source File (*.java)을 Java Compiler가 컴파일해 만든 파일이다.

Java Compiler에 의해 변환되는 코드의 명령어 크기가 1byte이기 때문에 Java 바이트코드라고 불린다.

Java 바이트 코드는 JVM이 해석할 수 있는 언어이며 *.class 확장자를 가진다.


JIT 컴파일러

출처 : https://medium.com/@ahn428/java-jit-컴파일러-c7d068e29f45 **JIT(Just-In-Time) 컴파일러**는 JVM의 Execution Engine이 바이트코드를 사용하는 운영체제에 맞는 기계어로 변환시켜주는 방식중 하나이다.

JIT 컴파일러는 프로그램을 실제 실행하는 시점에 기계어를 번역한다. 이렇게만 보면 인터프리터 방식과의 차이점이 없어보이지만 JIT 컴파일러는 같은 코드를 매번 해석하지 않고 기계어로 번역하면서 캐싱한다. 해당 파일이 다시 기계어로 컴파일 된다면 이전 파일과 비교해서 바뀐 부분은 새롭게 컴파일하고 변동 사항이 없는 부분은 캐싱된 코드를 사용한다.

이러한 방식은 인터프리터 속도가 느린 점을 JIT 컴파일러로 개선할 수 있는 장점이 된다.


JDK와 JRE

JREJava Runtime Environment의 약자로 다양한 운영체제에서 자바 프로그램이 실행되도록 도와주는 패키지이다. JRE 안에 JVM, Java 클래스 라이브러리, JIT 컴파일러 등이 JRE 패키지 안에 구성되어있다.

JDKJava Development Kit의 약자로 자바 프로그램 개발에 필요한 도구들의 집합체이다. JDK 안에 자바 실행에 필요한 JRE 뿐만 아니라 Java Compiler, 인터프리터 등이 JDK 패키지 안에 구성되어 있다.

즉, JDK는 JRE를 포함하고 있으며 자바 개발이 목적이라면 JDK가 필요하고 단순 java 파일을 실행 시키는 목적이라면 JRE만 있어도 된다.


정리

  • Java의 실행 과정, JVM의 구성요소, JIT 컴파일러등은 학부 수업 때 필기 시험을 위해 간단하게 용어만 파악하던 내용이었는데 이번 기회를 통해서 더욱 자세하고 전체적으로 어떻게 실행되는지, 어떠한 과정이며 내가 코드를 짠 내용들이 어떻게 저장되는지등 여러가지를 배우게 된 계기가 되었다.
  • 백기선님의 라이브 스터디 소식을 늦게 접해 2주차 부터 참여해서 시작이 늦었지만 늦은만큼 더 열심히 참여해서 자바에 대해 더욱 깊이 공부하고 알아가도록 노력해야겠다.

References

https://medium.com/@lazysoul/jvm-이란-c142b01571f2

https://thinkground.studio/자바-메모리-구조-java-memory-structure/

https://velog.io/@dnjscksdn98/Java-What-is-JVM

https://medium.com/@ahn428/java-jit-컴파일러-c7d068e29f45

https://medium.com/@ahn428/java-jvm-java-virtual-machine-jre-java-runtime-environment-jdk-java-developement-kit-fed91def1d6f

profile
백엔드 개발자 지망생입니다!

0개의 댓글