[Java] JVM이란 ?

About JVM

Posted by JongMin-Lee on June 13, 2019

JVM

JVM(Java Virtual Machine)은 Java를 다루는 사람이라면 실력을 막론하고 들어본 이름입니다. 바로 Java 언어의 특징 중 ‘운영체제(OS / platform)에 독립적이다’의 주인공입니다. 사실 저는 JVM 자바 가상 머신 즉, 가상으로 자바 코드를 돌리기 때문에 독립적이다라고만 알고 있엇고, 그 안에 메모리가 있는지 조차 알지 못했습니다. 때문에!! 이번에 확실하게 JVM에 대해 알아보고자 합니다!!


1. 정의

JVM은 다른 프로그램을 실행하는 것을 목적으로 하는 프로그램 입니다. 즉, Java코드에 있는 main메소드를 실제로 호출하는 것 입니다. JVM은 두 가지의 기본 기능이 있습니다. 첫 번째는 Java 프로그램이 모든 장치 또는 운영체제에서 실행되도록 허용하는 기능, 두 번재는 프로그램 메모리를 관리하고 최적화 하는 기능입니다.
정리하자면 다음과 같습니다.

  • 기술적 정의 : JVM은 코드를 실행하고 해당 코드의 런타임 환경을 제공하는 소프트웨어 프로그램 사양(specification)입니다.
  • 일상적인 정의 : JVM은 Java 프로그램을 실행하는 방법입니다. JVM의 설정을 구성한 다음 실행 중에 프로그램 리소스를 관리 하는데 의존합니다.

일반적으로 개발자가 JVM에 관해 이야기 한다면 Java app의 리소스 사용을 나타내고 제어하는 시스템, 특히 서버에서 실행되는 프로세스를 의미 합니다.


2. 구조

(1) Class Loader

클래스 로더란 runtime에 Class를 로딩하게 해주는 기술입니다. Java의 모든 것이 Class이며, 모든 Java애플리캐이션은 Class로 구성됩니다. 응용 프로그램은 하나 또는 수천개의 클래스로 구성될 수 있습니다. Java 애플리케이션을 실행하려면 JVM은 컴파일된 .class파일을 액세스 할 수 있는 서버와 같은 Context에 load해야 합니다. 따라서 JVM은 클래스 로더에 의존하여 기능을 수행합니다.

클래스 로더의 핵심 적인 기능은 3가지 입니다.

  • Loading
  • Linking
  • Initialization

위의 3가지 기능을 하나하나 알아봅시다!!

(1-1) Loading

클래스 로드는 .class 파일을 읽고 해당 byte data를 생성한 다음 method영역에 저장합니다. 각 .class파일에 method영역 정보를 저장합니다. 이 정보에는 다음과 같은 것들이 있습니다.

  • .class파일이 class 또는 interface, Enum과 관련이 있는지 여부
  • load된 class 및 부모 클래스의 정규화된 이름
  • modifier, variable, method의 정보 등등..

.class 파일을 로드 한 후 JVM은 Class 유형의 객체를 생성하여 힙 메모리에 저장합니다. 이 객체는 java.lang 패키지에 미리 정의된 Class 유형입니다. 이 Class 객체는 사용자가 정보를 얻는 과정에 많은 편의를 제공해 줍니다. 만약 이 객체의 참조를 얻으려면 getClass( ) 메소드를 사용하여 얻을 수 있습니다.

(1-2) Linking

verification(확인), preparation(준비), resolution(해결)을 수행합니다.

  • verification : .class파일의 정확성을 보장합니다. 이 파일의 형식이 올바른지, 유효한 컴파일러에 의해 생성되었는지를 확인합니다.

    확인에 실패하면 런타임 에러 발생 (java.lang.VerifyError)

  • preparation : 클래스 변수에 메모리를 할당하고 메모리를 기본값으로 초기화 합니다.

  • resolution : 직접참조(direct reference)를 기호참조(symbolic reference)로 바꾸는 프로세스 입니다.

(1-3) Initialization

초기화 단계에서 모든 static 변수는 클래스 위의 계층(부모)부터 아래 계층(자식)순으로 정의된 값을 지정 받습니다.

(1-4) Class Loader

Java Class Loader는 기본 클래스 로더가 3가지 있다. 간단하게 알아보자.

(1) Bootstrap class loader

모든 JVM은 반드시 bootstrap class loader를 가지고 있어야 하며, 신뢰있는 클래스를 로드 할 수 있어야 합니다. 핵심 Java API 클래스를 로드해 줍니다.(Java_Hoome/jre/lib)

(2) Extension class loader

bootstrap class loader의 자식 입니다. 확장 디렉토리(Java_Home/jre/lib/ext) 또는 java.ext.dirs 시스템으로 지정된 다른 디렉토리에 있는 클래스를 로드 합니다.

(3) System/Application class loader

Extension class loader의 자식입니다. 내부적으로 java.class.path에 매핑된 환경 변수를 사용합니다.


2. JVM 메모리

이번에는 JVM 메모리 영역에 대해서 알아보겠습니다.(구조에 있는 그림을 참고해주세요!!!)

(1) Method area

static 변수를 포함하여 class 이름, 메소드 및 변수 정보 등 모든 클래스 레벨의 정보가 저장됩니다. JVM에는 단 하나의 메소드 영역이 있는며, 이는 공유자원(shared resource)입니다.

(2) Heap area

모든 객체(Object)의 정보를 저자아고 있습니다. 이 또한 하나만 존재하며 공유자원 입니다.

(3) Stack area

Method 내에서 사용되는 값들(매개변수, 지역변수, 리턴값 등)이 저장되는 구역으로 메소드가 호출할때 LIFO(Last In Frist Out)로 하나씩 생성되고, 메소드 실행이 완료되면 LIFO형식으로 하나씩 지워집니다.

각 Thread별로 하나씩 생성

(4) PC Resister

현재 실행중인 스레드(thread)의 주소를 저장합니다. 각 thread별로 별도의 PC register를 가지고 있습니다.

(5) Native Method Statcks

Java외 언어로 작성된 Native 코드를 위한 메모리 입니다. C / C++ 등의 코드를 수행하기위한 스택입니다.

그 외

(6) Excution Engine

클래스 로더가 로드 작업을 완료하면 JVM은 각 클래스의 코드를 실행하기 시작합니다. 실행 엔진은 이 처리를 수행합니다. .class(바이트코드)를 실행하여 한줄씩(interperter) 바이트코드를 읽습니다.

실행엔진은 3부분으로 분류할 수 있습니다. Interperter, JIT(Just-In-Time Compiler, GC(Garbage Collection))

참고) JIT는 인터프리터의 효츌성을 높이는데 사용됩니다. 인터프리터방식과 컴파일러 방식을 혼합한 것으로 생각할 수 있습니다.

(7) JNI(Java Native Method Interface)

Native Method Library와 상호작용하고 실행에 필요한 Native Libarary(C, C++)를 제공하는 인터페이스 입니다.

(8) Native Method Libraries

Execution Engine에 필요한 Native Library(C, C++)의 Collection입니다.


3. 메모리 관리

Java이전에는 프로그래머가 모든 프로그램 메모리를 관리했습니다. 그러나 Java에서는 JVM에 의해서 관리가 됩니다. JVM에서 GC(Garbage Collection)이라는 녀석이 사용하지 않는 메모리를 지속적으로 식별하고 제거하며 메모리를 관리합니다.(이 GC라는 녀석도 상당한 녀석이니 나중에 다루도록 하겠습니다!)

그런데 GC가 있어서 무조건 좋은 것은 아닙니다. 초기에는 Java가 C++만큼 빠르지 않았기 떄문에 많은 비판을 받았습니다. 차츰 다양한 알고리즘과 접근법이 나와 GC의 능력이 크게 향상되었습니다.


JVM은 Java에서 가장 기본적이면서도 중요하다고 생각합니다. 처음에는 가상메모리구나 정도로 시작했다면 JVM을 이루는 구조와 기능들이 많음을 알았습니다.

이 구조들의 기능들이 모여 JVM을 이루는데 각각의 구조물들 또한 다양한 구조와 기능을 이루고 있습니다. 다음에 차근차근 세세한 부분까지 알아보겠습니다!!


참고

https://www.javaworld.com/article/3272244/what-is-the-jvm-introducing-the-java-virtual-machine.html

https://www.geeksforgeeks.org/jvm-works-jvm-architecture/JVM