본문 바로가기

CS 전공지식

24.01.30 JVM 과 바이트 코드

1. JVM (Java Virtual Machine)

    - Java 를 실행하기 위한 가상 컴퓨터 (실제 컴퓨터가 아닌 소프트웨어로 구현한 것)

    - 자바 가상머신의 약자

    - 자바 애플리케이션을 클래스 로더(Class Loader)를 통해 읽고 자바 API 와 함께 실행

    - 자바 프로그램이 어느 운영체제에서도 동일하게 작동할 수 있게 해줌

      (JVM 은 운영체제에 종속되고 각 OS에 맞는 JVM 을 설치해야함)

    - 자바 프로그램은 OS가 아닌 JVM 과 통신하고 JVM 은 자바프로그램으로부터 전달 받은 명령을 해당 OS 가

      이해할 수 있도록 변환하여 전달

    - GC (Garbage Collection) 을 통해 자동으로 메모리 관리

 

2. Java 바이트 코드

    - JVM 이 이해할 수 있는 언어로 변환된 자바 소스코드를 의미

    - 자바 컴파일러에 의해 변환되는 코드의 명령어의 키기가 1byte 라서 Java 바이트 코드라고 불림

    - Java 바이트 코드는 JVM 만 설치되어 있다면 어떤 OS 에서도 실행 가능

 

3. JVM 의 구성

  1) 전체적인 JVM 구성

 

     (1) 클래스 로더 (class loader)

           - Java Compiler 를 사용해서 .java 파일을 .class(바이트 코드)로 컴파일

           - JVM 에 .class 파일을 load 하고 링크를 통해 배치하는 작업 수행

           - 클래스 파일들을 엮어서 JVM 이 OS 로 부터 할당받은 메모리 영역인 Runtime Data Area 로 적재하는 역할 수행

 

     (2) 실행엔진 (execution engine)

           - .class 파일을 실행시키는 역할

           - 클래스 로더에 의해 메모리에 적재된 바이트코드들을 기계어로 변환해 명령어 단위로 실행하는 역할

 

           A) Interpreter

                - 바이트코드 명령어 단위로 읽어 실행하는 인터프리터

                - 1줄씩 수행하기 때문에 느린 단점이있다

 

           B) JIT (Just - In - Time) compiler

                - 프로그램이 실행중인 런타임에 실제 기계어로 변환해주는 컴파일러를 의미

                - 인터프리터 방식의 단점을 보완하기 위해 도입됨

                - 인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드로 전체를 컴파일하여 네이티브 코드로

                  변경하고, 이후 네이티브 코드를 직접 실행하는 방식

                - JIT 컴파일러가 컴파일하는 과정은 바이트 코드를 인터프리팅하는 것보다 훨씬 오래 걸리므로

                  JIT 컴파일러를 사용하는 JVM 은 내부적으로 해당 메서드가 얼마나 자주 수행되는지 확인해 일정 정도를

                  넘을 때만 컴파일 수행

 

           C) GC (garbage collector)

                - 동적 할당된 메모리영역(Heap) 중에 더이상 사용하지 않는 영역을 탐지해 자동으로 삭제하는 역할

                - 개발자가 메모리를 따로 관리하지 않아도 됨

                - GC 가 수행되는 동안 GC 를 수행하는 쓰레드가 아닌 다른 모든 스레드는 일시 정지됨

 

    (3) Runtime Data Area

           - Java 프로그램을 수행하기 위해 OS 에서 할당받은 메모리 공간

 

           A) 개별 쓰레드에서 관리

                 (A) PC 레지스터

                       - 쓰레드가 실행되는 부분의 주소와 명령어를 저장하는 영역

                       - JVM 은 스택(Stack) 기반의 방식으로 작동하는데, Stack 에서 주소를 뽑아 이를 별도의

                         메모리 공간 (PC Register) 에 저장

                       - 현재의 어떤 명령을 실행해야 할 지에 대한 부분 기록

                 (B) JVM Stack

                       - 프로그램 실행 과정에서 호출된 메서드의 파라미터, 지역변수, 리턴 값, 연산에 사용되는 임시 값이

                         생성되는 영역(임시로 저장)

                 (C) Native Method Stack

                       - Java 외 언어로 작성된 네이티브 코드를 위한 메모리 영역 (C / C++ 등)

                       - Java 프로그램이 컴파일되어 생성되는 바이트코드가 아닌 실제 실행할 수 있는 기계어로 작성된

                         프로그램을 실행시키는 영역

                       - Java Native Interface 를 통해 바이트 코드로 전환하여 저장

 

           B) 공유 쓰레드에서 관리

                 (A) Method Area (메서드 영역)

                       - 클래스 메타 데이터(클래스의 멤버 변수의 이름, 데이터 타입, final 클래스 변수)등을 저장

                       - 프로그램 실행 중 어떤 클래스가 사용되면, JVM 은 해당 클래스의 클래스파일(.class)을 읽고

                         분석해 클래스에 대한 정보(클래스 데이터)를 이곳에 저장

                       - 클래스 변수(class Variable) 도 Method Area(메서드 영역)에 함께 생성됨

                 (B) Heap Area (힙 영역)

                       - GC 의 대상이 되는 영역

                       - new 키워드로 생성된 객체와 배열이 생성되는 영역 (jdk 8 이상 : static 변수, string 상수 풀)

                       - 즉 인스턴스 변수(Instance Variable) 들이 생성되는 공간

 

3. JVM 실행과정

    - 프로그램이 실행되면 JVM 은 OS로 부터 프로그램이 필요로 하는 메모리를 할당받는데 이 메모리를 용도에 따라

      여러 영역으로 나누어 관리

    - Java 컴파일러가 자바 소스(.java)  코드를 읽어 들여 자바 바이트코드(.class)로 변환

    - 변경된 Class 파일들을 클래스 로더를 통해 JVM 메모리 영역(Runtime Data Area) 영역으로 로딩

    - 로딩된 Class 파일들은 실행엔진(Execution engine) 을 통해 해석됨

    - 해석된 바이트코드는 Runtime Data Area 에 배치되어 실질적인 수행이 이루어짐. 이러한 실행과정 속에서

      JVM 은 필요에 따라 GC 같은 관리 작업 수행

'CS 전공지식' 카테고리의 다른 글

24.02.01 JDK, JRE 란?  (0) 2024.02.01
24.01.31 ORM  (2) 2024.01.31
24.01.26 CPU 스케쥴링 알고리즘  (2) 2024.01.26
24.01.25 스레드와 멀티스레딩 그리고 공유자원과 임계영역  (0) 2024.01.25
24.01.24 프로세스 2  (1) 2024.01.24