본문 바로가기
3층 개발관/JAVA

[JAVA] 1주차 자바 기초 지식 정리(JVM)

by 개발관 2023. 6. 21.
반응형

1. JVM(Java Virtual Machine - 자바 가상 머신)이란 무엇인가

  • 자바 애플리케이션의 실행환경을 제공해 줍니다.
  • JVM은 JAVA와 OS 사이에서 중개자 역할을 수행하여 OS에 종속되지 않고 실행 가능합니다.(바이트 코드의 파일은 운영체제에서 바로 실행할 수 없기에 JVM이라는 번역기가 필요합니다.)
  • 현재 사용하는 운영체제에 맞는 자바 실행환경(JRE(Java Runtime Environment)) 가 설치되어 있다면 자바 가상 머신이 설치되어 있다는 뜻입니다.

자세히 살펴보면,

C언어의 실행환경

  • 보는 바와 같이 C언어의 경우 컴파일러를 거치게 되면 각 OS에 맞는 실행 파일이 만들어집니다.
  • 하지만, 윈도우 - 윈도우, 리눅스 - 리눅스 이렇게 해당 환경에서만 실행가능한 파일이 만들어지게 됩니다.
  • 윈도우의 파일을 리눅스에서 실행할 경우 실행파일이 동작하지 않는다는 단점이 있습니다.

JAVA의 실행환경

  • JAVA언어의 경우 컴파일러를 거치게 되면 .class라는 바이트 코드 파일이 생성하게 되고 이를 JVM이 각 OS에 맞는 실행 파일로 바꿔주게 됩니다.
  • 중간에 JVM이 각 OS에 맞는 실행파일로 바꿔줌으로써 C언어와 다르게 OS에 종속적이지 않게 됩니다.
  • 그러므로, 하나의 바이트 코드로 JVM이 설치되어 있는 모든 OS에서 동작이 가능합니다.
  • TIP) 자바 컴파일러는 javac로 JDK에 포함되어 있습니다.

JAVA의 자세한 실행 방법은 아래의 JVM 구성요소를 설명하면서 설명하겠습니다.

2. 바이트 코드란 무엇인가?

  • 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법(0과 1로 이루어져 있습니다.)입니다.
  • 자바 바이트코드(.class)는 명령어의 크기가 1바이트라 자바 바이트코드라 불리며, JVM이 이해할 수 있는 언어로 변환된 자바 소스코드를 의미합니다.
  • 자바 바이트코드는 자바 가상 머신만 설치되어 있으면, 어떤 운영체제에서도 실행될 수 있습니다.(OS에 종속적이지 않습니다.)로 변환됩니다.

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

  • JIT(Just-In-Time-Compliation) - 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법입니다.
  • 기존 자바 코드는 인터프리터 방식으로 명령어를 하나씩 실행함으로써 바이트 코드나 소스코드를 최적화 과정 없이 번역하기 때문에 실행 속도가 굉장히 느렸습니다. (이 단점을 보완하기 위해 나온 것이 JIT 컴파일러입니다.)
  • JIT 컴파일러는 바이트코드를 읽어 빠른 속도로 기계어를 생성할 수 있습니다. 이로 인해 기계어 변환은 코드가 실행되는 과정이 실시간으로 일어나며(그래서 Just In Time입니다.) 전체코드의 필요한 부분만 변환합니다.
  • 변환된 코드는 캐시에 저장되기 때문에 재사용 시 컴파일을 다시 할 필요가 없습니다.

4. JVM 구성요소

JVM 동작 과정

  1. 자바 프로그램을 실행하면 JVM은 OS로부터 프로그램이 필요로 하는 메모리를 할당받는다.
  2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어 자바 바이트 코드(.class)로 컴파일한다.
  3. Class Loader는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 Runtime Data Area(실질적인 메모리를 할당받아 관리하는 영역)에 올린다.
  4. Runtime Data Area에 로딩된 바이트 코드는 Execution Engine을 통해 해석된다.
  5. 이 과정에서 Execution Engine에 의해 Garbage Collector의 작동과 Thread 동기화가 이루어진다.

 

class loader

runtime 시점에 클래스를 로딩하게 해 주며 클래스의 인스턴스를 생성하면 클래스 로더를 통해 메모리(Runtime Data Area)에 로드하게 된다.

runtime data areas

Jvm이 프로그램을 수행하기 위해 os로부터 별도로 할당받은 메모리 공간을 말하며, runtime data areas는 크게 5가지 영역으로 나눌 수 있다.

execution engine

load 된 class의 bytecode를 실행하는 runtime module이 바로 execution engine이다. class loader를 통해 jvm 내의 runtime data areas에 배치된 바이트 코드는 execution engine에 의해 실행된다.

Garbage Collector

Garbage Collector(GC)는 Heap 메모리 영역에 생성된 객체들 중에 참조되지 않은 객체들을 제거하는 역할을 한다. GC의 동작시간은 일정하게 정해져 있지 않기 때문에 언제 객체를 정리할지는 알 수 없다. 즉 바로 참조가 없어지자마자 작동하는 것이 아니라는 것이다. 또한 GC를 수행하는 동안 GC Thread를 제외한 다른 모든 Thread는 일시정지상태가 된다.

 

5. JDK와 JRE의 차이

JRE(Java Runtime Environment)

  • JRE는 자바 프로그램을 실행하는 환경을 만들어 줍니다.
  • JRE는 JVM뿐만 아니라 Java 클래스 라이브러리 등을 포함하고 있어 자바 프로그램의 실행을 지원합니다.
  • 따라서, 자바 프로그램 개발하는 것(JDK)이 아니라 실행하기만 원한다면 JRE를 설치하면 된다.

JDK(Java Development Kit)

  • JDK는 Java를 사용하기 위해 필요한 모든 기능을 갖춘 패키지입니다.
  • JDK는 자바 애플리케이션을 개발하기 위한 환경을 지원합니다.
  • JDK는 JRE를 포함할 뿐만 아니라 컴파일러(javac), javadoc, jar 등 개발에 필요한 도구들을 가지고 있습니다.

 

6. Javac(Java Compiler)

  • 자바 프로그래밍 언어는 고수준 언어(사람이 이해할 수 있는 언어)로 컴퓨터가 실행 가능한 기계어 코드로 변환 되어야 합니다. 이 변환 작업을 수행하는 것이 컴파일러 입니다.
  • javac는 자바 소스 코드 파일(.java)을 컴파일 하여 실행 가능한 바이트 코드 파일(.class)로 변환하는 역할을 합니다
반응형