백기선 자바 스터디 1기 1주차

2022. 4. 2. 00:29Java/java-live-study

728x90
반응형

목표

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

학습할 것

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

JVM이란 무엇인가

JVM(Java vertual Machine)이란 자바 프로그램이 OS에 관계없이 실행할 수 있도록 하고 프로그램 메모리를 관리하고 최적화하는 프로그램이다.

  • 프로그램 실행

JVM은 자바 프로그램과 OS 사이에서 중개자 역할을 하여 자바 바이트코드(.class)를 각 OS에 따라 해석하여 실행한다.

  • 메모리 관리(Garbage Collection)

자바에서는 JVM이 프로그램 메모리를 관리한다. JVM은 Garbage collection이라는 프로세스를 통해 메모리를 관리하며, 이 Garbage collection은 자바 프로그램에서 사용되지 않는 메모리를 지속적으로 찾아내서 제거한다. Garbage collection은 JVM 내부에서 일어난다.


컴파일하는 방법

자바에서의 컴파일이란 자바 소스 파일(.java)을 자바 바이트코드(.class)로 변환하는 것을 뜻한다. JDK에 포함된 javac 실행 파일이 필요하다.

javac 명령어를 사용하여 자바 소스 파일(.java)을 바이트코드(.class)로 변환할 수 있는데, 과정은 다음과 같다.

sochong@hongseogjuui-MacBookPro test % ls
javacTest.java
sochong@hongseogjuui-MacBookPro test % javac javacTest.java
sochong@hongseogjuui-MacBookPro test % ls
javacTest.class    javacTest.java
sochong@hongseogjuui-MacBookPro test %

.java 파일을 컴파일하여 .class 파일이 생성된 것을 확인할 수 있다.


실행하는 방법

바이트코드(.class)를 실행하려면 역시 JDK에 포함된 java 실행파일이 필요하다.

java 명령어를 사용하여 실행 가능하다.

sochong@hongseogjuui-MacBookPro test % ls
javacTest.class    javacTest.java
sochong@hongseogjuui-MacBookPro test % java javacTest
hello java
sochong@hongseogjuui-MacBookPro test %

바이트코드란 무엇인가

JVM이 실행하는 명령어의 형태, 자바 컴파일러로 변환되는 코드의 명령어 크기가 1바이트라서 바이트코드라고 불린다. 자바 컴파일러는 자바 소스 코드(.java)를 바이트코드 파일(.class)로 컴파일한다.

자바는 JVM이 실행할 수 있는 바이트코드로 컴파일하기때문에 JVM만 설치되어 있다면 OS에 관계없이 프로그램이 실행 가능하다.


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

기존 .class 파일을 실행하는 방법은 interpreter 방식이 기본인데, 이 방식은 명령어를 하나씩 해석해 처리하기 때문에 실행 속도가 느린 단점이 있다. 이를 해결하기 위해 나온 것이 JIT 컴파일러이다.

JIT(just-in-time) 컴파일은 프로그램을 실제 실행하는 시점(run time)에 바이트코드를 기계어로 번역하는 컴파일 기법이다. 이렇게 되면 JVM은 이미 기계어로 번역된 클래스를 다시 컴파일할 필요 없이 바로 사용하면 되므로 기존 Interpreter 방식보다 코드 수행 속도가 빠르다.

출처: https://aboullaite.me/understanding-jit-compiler-just-in-time-compiler/


JVM 구성 요소

출처: https://www.inflearn.com/course/the-java-code-manipulation/dashboard

클래스 로더 시스템

.class 에서 바이트코드를 읽고 메모리에 저장한다.

메모리(runtime data area)

JVM이 프로세스로써 수행되기 위해 OS로부터 할당받은 메모리 영역이다. 목적에 따라 크게 5가지 블록으로 나뉘어있다.

  • 스택(stack) : 모든 스레드에 대해 별도의 런타임 스택이 만들어진다. 스택 영역은 공유 자원이 아니므로 스레드 안전 영역이다.
  • PC(PC registers) : 스레드가 생성될 때마다 생성되는 영역, Program Counter 즉, 현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다. 이것을 통해 스레드가 돌아가며 수행할 수 있게 한다.
  • 네이티브 메소드 스택(native method stack) : 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역, C/C++ 등의 코드를 수행하기 위한 스택이다.
  • 힙(heap) : 모든 객체와 해당 인스턴스 변수 및 배열이 저장된다.
  • 메소드(method) : 클래스 수준의 정보(클래스 이름, 부모 클래스 이름, 메소드, 변수)를 저장한다. JVM 당 하나의 메소드 영역이 있으며 공유 자원이다.

실행 엔진(Execution Engine)

실행 엔진은 인터프리터, JIT 컴파일러, GC(Garbage Collector)로 구성된다.

  • Interpreter, JIT 컴파일 두 가지 방식을 조합하여 메모리(runtime data area)에 있는 바이트코드(.class)를 명령어 단위로 읽어서 실행한다.
  • GC(Garbage Collector) : 힙 메모리 영역에서 더 이상 참조되지 않는 객체들을 탐색하여 제거한다.

JNI(Java Native Interface)

자바 애플리케이션에서 C, C++, 어셈블리로 작성된 함수를 사용할 수 있는 방법 제공

네이티브 메소드 라이브러리

C, C++로 작성된 라이브러리


JDK와 JRE의 차이

출처: https://www.inflearn.com/course/the-java-code-manipulation/dashboard

JRE(Java Runtime Environment)

JVM + 라이브러리

  • 자바 애플리케이션을 실행할 수 있도록 구성된 배포판
  • JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일을 가지고 있다.

 

JDK(Java Development Kit)

JRE + 개발툴

  • JRE와 더불어 개발을 위해 필요한 도구(javac, java 등)를 포함한다.
728x90
반응형