ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. #1
    Programming/Java 2021. 1. 25. 17:08

    JVM이란 무엇인가?

    자바 가상 머신은 시스템 메모리를 관리하고, 자바 기반 어플리케이션을 위해 이식 가능한 실행 환경을 제공합니다.

     

    JVM의 용도와 정의

    JVM에는 두가지의 기본 기능이 있습니다.

    • 자바 프로그램이 어느 기기나 운영체제에서 실행될 수 있게 하는 것
    • 프로그램 메모리를 관리하고 최적화 하는 것

    JVM에 대한 정의는 다음 두가지로 나타낼 수 있습니다.

    • 기술적 정의 : JVM은 코드를 실행하고 해당 코드에 대해 런타임 환경을 제공하는 소프트웨어 프로그램에 대한 사양입니다.
    • 일반적 정의 : JVM은 자바 프로그램을 실행하는 방법입니다. JVM의 설정을 구성한 후 사항에 따라 실행 중에 프로그램 리소스를 관리합니다.

     

    JVM에서의 메모리 관리

    JVM 실행에 있어서 가장 일반적인 상호 작용은 힙과 스택의 메모리 사용을 하지 않는 것입니다. 가장 흔한 교정 작업은 JVM의 메모리 설정 값들을 조율하는 것입니다.

     

    -가비지 컬렉션(Garbage Colleciton)

    자바 이전에는 프로그래머가 모든 메모리를 관리했습니다. 하지만 자바에서는 JVM이 이러한 메모리를 관리해줍니다.

    JVM은 가비지 컬렉션이란 프로세스를 통해 메모리를 관리하며, 이 가비지 컬렉션은 사용자가 사용하지 않는 메모리를 지속적으로 찾아내어 제거해줍니다(가비지 컬렉션은 실행중인 JVM에서 일어남). 

     

     

    세 부분으로 이루어진 JVM

    JVM은 3가지 측면이 있습니다. 표준(Specification), 구현(Implementation) 그리고 인스턴스(Instance)인데, 각각에 대해 살펴보도록 합시다.

     

    1. JVM 사양

    JVM은 소프트웨어 사양입니다. 다소 순환적인 방식으로 JVM 사양은 구현에 있어 최대한의 창조성을 보장하기 위해 JVM 구현 세부사항이 사양 안에 정해져 있지 않습니다.

     

    *소프트웨어 사양 : 소프트웨어 사양이란 어떤 소프트웨어 시스템이 어떻게 동작해야하는지를 정의하는 설계 문서입니다. 사양의 목적은 프로그래머들이 개발을 위해 정확한 정의와 요구사항을 기술하는 것입니다.

     

    결국 JVM이 해야만 하는 일은 자바 프로그램을 정확하게 실행시키는 것입니다. 

     

    2. JVM 구현

    JVM 사양 구현은 실제 소프트웨어 프로그램을 도출합니다. 

    오픈 JDK의 핫스팟(HotSpot) JVM은 창조 구현이며 세계에서 가장 널리 사용되는 JVM입니다.

     

    오라클의 라이선스가 부여된 JDK를 포함해,  라이선스가 부여되는 거의 모든 JVM은 오픈JDK의 포크로 생성된 것입니다.

    오픈JDK로부터 허가받은 포크를 생성하는 개발자들은 종종 운영체제 고유 성능과 기능 개선사항들을 추가하려는 욕구에 의해 동기부여가 됩니다.

    일반적으로, 개발자는 JRE(Java Runtime Environment) 번들의 한 부분으로 JVM을 다운로드해 설치합니다.

     

    3. JVM인스턴스

    JVM 스펙이 구현돼서 소프트웨어 제품으로 릴리즈되면, 개발자는 그것을 하나의 프로그램처럼 다운로드해 실행할 수 있습니다. 이렇게 다운로드 된 프로그램이 하나의 JVM의 인스턴스입니다.

     

    개발자들이 'JVM'에 대해 말하는 경우 소프트웨어 개발 환경 또는 제품화 환경에서 실행되는 하나의 JVM 인스턴스를 지칭합니다. 

     

     

    가상머신으로서의 JVM

    JVM은 자바 프로그램을 이식성 있는 방식으로 실행하는 가상 머신입니다.

    사용중인 운영체제 또는 하드웨어에 상관없이, JVM은 그 안에서 실행될 프로그램을 위한 예측 가능한 환경을 조성합니다. JVM은 실제 가상머신과 달리 가상 운영체제를 생성하지 않습니다. 그러므로 가상머신으로서의 JVM보다는, 관리되는 런타임 환경 또는 프로세스 가상머신이라고 부르는게 더 알맞는 표현일 수도 있겠습니다.

     

     

    JVM에서 클래스 파일 로더와 실행

    자바 어플리케이션 실행에 있어 JVM의 역할에 대해 살펴보았습니다. 그런데 이 기능을 실제로는 어떻게 수행할까요?

    자바 어플리케이션을 실행하기 위해 JVM은 자바 클래스 로더(Class Loader)와 자바 실행 엔진(Execution Engine)에 의존합니다.

     

     

    - JVM 자바 클래스 로더

    자바에서는 모든 것이 클래스이며, 자바 프로그램은 하나 또는 수 천가지의 자바 클래스로 이루어집니다. 컴파일된  .class 파일을 JVM이 맥락에 따라 액세스 가능한 서버 같은 것으로 로드를 해야만 합니다. JVM은 클래스 로더에 의존해 이 기능을 수행합니다.

     

    자바 클래스 로더는 클래스를 메모리에 로드하고 실행을 위해 사용할 수 있게 만드는 JVM의 일부입니다. 클래스 로더는 클래스 로딩(Class Loading)을 최대한 효율적으로 수행하기 위해 지연 로딩(Lazy-loading)과 캐싱(Cashing) 같은 기법을 활용합니다.

     

    모든 자바 가상 머신에는 클래스 로더가 포함되어 있습니다. JVM 스펙은 런타임에 클래스 로더에 질의하고 조작하기 위한 일반적인 방법들을 설명하고 있지만, 이런 기능을 충족시키는 책임은 JVM 구현에 있습니다. 개발자의 관점에서 볼 때, 근본적인 클래스 로더 메커니즘은 대개 블랙 박스입니다.

     

    - JVM 실행 엔진

    클래스 로더가 클래스 로딩을 마치면, JVM은 각 클래스에 있는 코드를 실행하기 시작합니다. 이 기능을 처리하는 것이 JVM 구성요소인 실행 엔진입니다. 실행 엔진은 JVM 실행에 필수적입니다.

    실제로, 현실적인 목적을 위해, 실행 엔진은 JVM 인스턴스입니다.

     

    코드 실행에는 시스템 리소스에 대한 액세스 관리가 관련되어 있습니다. JVM 실행 엔진은 파일, 네트워크 그리고 메모리 리소스를 요구하는 프로그램 실행과 운영체제 가운데 위치해서 이런 리소스들을 공급합니다.

     

    - 실행 엔진이 시스템 리소스를 관리하는 방법

    시스템 리소스는 크게 메모리와 다른 모든 것, 2가지 범주로 나눌 수 있습니다.

     

    JVM이 미사용 메모리를 없애야 할 책임이 있으며, 가비지 컬렉션이 이런 폐기를 수행하는 메커니즘이라는 것을 상기해봅시다. JVM은 개발자들이 당연하게 여기고 있는 참조 구조체를 할당하고 관리할 책임도 있습니다. 예를 들어, JVM의 실행 엔진은 자바의 new 키워드 같은 것을 받아, 그것을 메모리 할당에 대한 운영체제 고유의 요청으로 변환할 책임이 있습니다.

     

    메모리를 넘어서, 실행 엔진은 파일 시스템 엑세스, 네트워크 입출력을 위한 리소스를 관리합니다. JVM이 여러 운영체제 전반에서 호환되기 때문에, 실행 엔진은 각각의 운영 체제 환경에 즉각 대응할 수 있어야만 합니다. 이것이 JVM이 종잡을 수 없는 요구사항ㅇ르 처리하는 방법입니다.

     

    댓글

Designed by Tistory.