티스토리 뷰

728x90
반응형

목차

     

     

    JVM(Java Virtual Machine)

     

    JVM(Java Virtual Machine)이란 이름 그대로 자바 바이트코드를 실행할 수 있는 가상 머신이다.

     

    여기서 자바 바이트코드JVM이 실행할 수 있는 언어로 이루어진 명령어의 집합을 가리키며,

     

    플랫폼에 독립적이기 때문에 하드웨어나 운영체제와 무관하게 동작 가능하다는 특징이 있다.

     

    참고로 바이트코드라는 별칭은 컴파일러에 의해 변환된 명령어의 크기가 1바이트이기 때문에 붙었다고 한다.

     

    계속해서 앞서 언급한 정의를 하나로 이어서 그림과 함께 다시 한번 정리하면 JVM이란

     

    컴파일러소스코드를 번역해서 만들어낸 바이트코드해당 O/S 및 H/W에 맞게 기계어로 해석해주는 가상머신을 가리킨다.

     

    이 방식은 일반적인 프로그램에 비해 거쳐야 하는 단계가 늘어나 속도가 느리다는 단점이 있지만

     

    운영체제와 하드웨어에 종속적이지 않은 프로그래밍을 할 수 있다는 장점이 있다.

     

    이는 이론적으로는 한 번 프로그래밍으로 존재하는 모든 디바이스에서 실행 가능하다는 강력한 호환성을 자랑한다.

     

    추가적으로 JVM의 특징은 아래와 같다.

     

    • 메모리 자동 관리 및 최적화(Garbage Collector)
    • 스택 기반의 가상 머신 - 피연산자를 저장하고 가져올 때 스택 구조를 활용
    • 기본형 데이터 타입의 명확한 정의에 따른 플랫폼 독립성 보장
    • 참조형 데이터 타입은 심볼릭 레퍼런스로 참조한다.

      • 심볼릭 레퍼런스 - 대상을 참조할 때 메모리 주소가 아닌 이름으로 수행하는 것
    • 메모리 주소 할당시 높은 주소부터 낮은 주소로 부여한다(네트워크(빅 엔디안) 바이트 오더).

     

    JVM Structure

     

    JVM은 크게 보면 세 가지, 혹은 네 가지 요소로 구성되어 있다.

     

    • Class Loader
    • Execution Engine
    • Garbage Collector
    • Runtime Data Area

    추가로 그림에 표시된 Native Method Interface자바 바이트코드가 아닌 언어(C, C++, etc.)

     

    로 작성된 코드(라이브러리와 인터페이스)를 말한다.

     

    런타임 데이터 영역에 대해선 글을 분리하고, 여기선 위의 세 요소를 먼저 살펴보자

     

    Class Loader

     

    JVM은 바이트코드(클래스 파일)의 로드와 링크를 컴파일 시점이 아닌 바이트 코드의 실행 시점(런타임)에 로드한다.

     

    이런 방식을 동적 클래스 로딩(Dynamic Class Loading)이라 부르며,

     

    클래스 로더는 위와 같은 방식으로 자바 클래스를 JVM으로 로딩, 연결, 초기화해 메모리에 배치하는 역할을 한다.

     

    각 파트에 대한 추가 설명은 아래와 같다.

     

    • Loading - 담당한 클래스, 인터페이스, 에넘 파일을 읽어와 메모리의 Method 영역에 요소를 저장한다.
                        로딩이 끝난 클래스 파일은 객체가 생성되어 메모리의 Heap 영역에 추가된다.

      • Boot Strap ClassLoader - 자바 자체 클래스 로더 및 최소한의 클래스(Object 클래스 등)를 로드한다. 최고 우선순위.
      • Platform ClassLoader - ${JAVA_HOME}/jre/lib/ext 에 속한 모든 클래스를 로드한다. Inner Static 클래스.
      • Application(System) ClassLoader - 지정한 경로에 있는, 개발자가 작성한 클래스를 로드한다.
    • Linking - 불러온 클래스를 검증, 연결 후 사용할 수 있는 상태로 만든다.

      • Verification - 클래스 파일의 자바 및 JVM API에 대한 유효성 검증
      • Preparation - Static 필드에 대한 메모리 할당 및 기본값 할당을 통해 코드 작동 준비
      • Resolution - 심볼릭 참조(Symbolic Reference)를 메서드 영역의 직접 참조(Direct Reference)로 교체
                              → Tag tag = new Tag(); 의 tag(참조 변수)가 실제 Tag 클래스를 참조할 수 있도록 변경
    • Initialization - 링킹이 완료된 클래스 파일의 코드를 읽어오는 단계 Static 필드가 지정 값으로 초기화된다. 파일 실행 준비 완료.

     

    Execution Engine

     

    실행 엔진은 로드되어 Runtime Data Area에 저장된 클래스 파일을 실행하는 영역이다.

     

    여기서 실행이란 바이트 코드(클래스 파일)를 명령어 단위로 기계어로 번역, 운영체제에 맞게 해석 및 실행하는 것을 가리킨다.

     

    실행 엔진은 아래에서 알아볼 Garbage Collertor를 포함해 세 개의 요소로 구성된다.

     

    • Interpreter - 바이트 코드를 한 줄씩 해석해 실행한다. 동일한 메서드도 호출시마다 새로 번역해야 하기 때문에 속도가 느리다.
    • JIT(Just In Time) - 실행속도 향상을 위해 반복되는 코드를 미리 운영체제에 맞게 해석해 놓는다. 속도 향상에 도움이 된다.

     

    Garbage Collector

     

    Heap 메모리 영역에 쌓여있는 (클래스 로더에 의해 생성된) 객체 중 더 이상 사용되지 않는 것들을 모아 제거하는 역할을 한다.

     

    Garbage Collector의 동작으로 JVM은 메모리 관리가 수월하다는 장점이 있다.

     

    추가로 GC는 동작 시점을 명확하게 예상할 수 없으며, 실행시 다른 모든 스레드가 일시 정지된다는 특징을 가지고 있다.

    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2025/01   »
    1 2 3 4
    5 6 7 8 9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30 31
    글 보관함