ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JVM
    카테고리 없음 2024. 7. 12. 01:32

    JVM 이란?

    Java Virtual Machine의 줄임말로 다른 프로그램을 실행시키는 것이 목적인 프로그램이다.

    JAVA는 OS에 독립적이라는 특징을 가지고 있다. 추가적인 절차 없이 어느 운영체제에서나 동작한다는 말이다. 이것을 가능하게 해주는 것이 바로 JVM 이다.

    즉, JVM은 OS에 종속받지 않고 CPU가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터이다.

    주의해야 할 점은, JVM은 OS에 종속적이라는 것이다.

     

    JVM도 OS에 종속적이라는데 왜 JAVA는 생산성이 좋은 언어일까?

    사용자의 입장에서 보면 다른 언어(C/C++)을 사용하는 것과 차이가 없이 느껴질 수 있다. 언어별 컴파일러를 설치하는 것이나 JVM을 설치하는 것 모두 운영체제에 맞춰 설치하는 것이기 때문이다.

    하지만, 개발자의 관점에서 보면 JAVA는 하나의 코드 작성 후 JVM만 알맞게 설치하면 구동되기에, 기존 운영체제별 코드를 만드는 것에 비하여 유지보수/효율성/생산성이 높아진다는 큰 장점을 가지고 있다.

     

    그럼 JVM의 단점은 없을까?

    JVM은 이식성이 높아 위와 같은 장점을 가지고 있지만,

    1) javac 컴파일러를 통하여 원시코드(.java)를 바이트코드(.class)로 변환하는 컴파일 과정

    2) execution engine을 통하여 바이트코드(.class)를 바이너리 코드로 바꾸는 컴파일 과정

     

    총 2번의 컴파일 과정을 거치기에 기타 언어들에 비하여 속도가 느리다는 단점이 있다.


    자바코드의 동작 과정

    1. 자바 프로그램이 실행되면 JVM은 OS로부터 프로그램이 필요로 하는 메모리를 할당 받는다.
    2. 자바 파일이 자바 컴파일러에 의해 자바 바이트 코드로 변환된다.
    3. 클래스 로더를 통해 자바 바이트 코드를 JVM으로 필요한 시점에 로딩한다.
    4. 해석된 바이트 코드는 런타임 데이터 영역에 배치되어 수행이 이루어지게 된다.
    5. 실행 과정 속에서 JVM은 필요에 따라 GC같은 관리 작업을 수행한다.

    이렇듯 JVM은 메모리 할당부터 코드 실행까지 자바 코드 동작과정 중 다양한 역할을 한다.


    JVM 의 구성 요소

     

    자바코드의 동작과정

    JVM의 구성요소는 다음과 같다.

    1. 클래스 로더

    2. 실행 엔진

       - 인터프리터(Interpreter)

       - JLT 컴파일러(Just-in-Time)

       - GC(garbage collector)

    3. 런타임 데이터 영역(runtime data area)

       - 메소드 영역

       - 힙 영역

       - 스택 영역

       - PC Register

       - Native method

     

    JVM 구성요소의 역할을 조금더 자세히 살펴보자


    클래스 로더

    자바는 동적으로 클래스를 읽어온다. 따라서, 프로그램이 실행 중인 런타임에서야 코드는 JVM과 연결된다. 이렇게 동적으로 클래스를 로딩해주는 역할을 하는 것이 JVM의 클래스 로더(class loader)이다.

    클래스 로더는 바이트 코드(.class)를 클래스로 로딩 후 JVM이 운영체제로부터 할당받은 영역인 Runtime Data Area로 적재한다.


    실행엔진

    클래스 로더를 통해 런타임 데이터 영역에 배치 된 바이트 코드를 명령어 단위로 읽어 실행한다. 즉, JVM만 알아들을 수 있는 바이트 코드를 컴퓨터가 알아들을 수 있는 바이너리 코드로 변환하는 작업을 수행한다.

     

    이 수행과정에서 실행엔진은 인터프리터와 JIT 컴파일러 두 가지 방식을 혼합하여 바이트 코드를 실행한다.

    인터프리터

    프로그램 실행 때마다 명령어를 하나씩 읽어서 해석한다. 이 방식은 같은 메소드라도 여러번 호출되기 때문에 성능이 느리다.

     

    * cf. 정적(static) 컴파일 방식 : 프로그램 시작 전 변환 작업을 사전 수행한다. 따라서, 변환 작업은 딱 한번만 일어나고 간편하지만 성능이 느릴 수 밖에 없다.

    JIT(Just-In-Time) complier

    인터프리터와 정적 컴파일 방식을 혼합한 방식으로, 인터프리터에 의해 변환작업은 지속적으로 수행된다. 이와 함께, 필요한 코드의 정보는 캐시에 담아두었다가 재사용함으로써 수행 속도를 높인다.

     


    런타임 데이터 영역(runtime data area)

    JVM 의 메모리 영역으로 자바 코드를 실행 할 때 사용되는 데이터들을 적재해놓은 곳이다.

     

    Method Area

    - JVM이 시작될 때 생성되는 공간으로, byte code를 메모리 공간에 처음 올릴 때 초기화되는 대상을 저장하기 위한 공간

    - 클래스 정보, 변수 정보, static으로 선언한 변수 정보가 이 영역에 저장되며, 모든 스레드가 공유하는 영역

     

    Heap

    - 동적으로 생성된 객체가 저장되는 공간으로, 메서드 영역과 함께 모든 쓰레드가 공유하며 사용

    - Garbage Collection 의 대상이 되는 공간

    why ? 효율적인 gc를 위해 내부공간을 5개로 나누어 놓음

     

    young generation : 생명주기가 짧은 객체를 대상으로 GC를 하는 곳

    - eden : new()를 통해 객체가 생성되면 이 곳에 위치. minor GC 과정을 통해 한번이라도 살아남은 객체는 survior 공간으로 이동.

    - survior0,1 : eden 영역에서 살아남은 객체들이 옮겨오는 곳으로, 두 공간 중 한곳에만 객체가 존재 할 수 있음.

     

    old generation : 생명주기가 긴 객체를 대상으로 GC를 하는 곳. young generation 보다 공간이 크게 할당되며, 이곳에서 이루어지는 GC는 major GC라고 한다. 

     

    permanent generation : 생성된 객체들의 주소값이 저장된 공간으로. Java 8 이후로는 Native Method Stack에 편입되었다.

     

    스택과 힙영역의 관계

    스택영역과 힙영역의 관계

     

    stack

    지역변수, 메서드의 매개변수, 임시적으로 사용되는 변수, 메서드의 정보가 저장되는 영역

    person 객체를 참조하는 변수 p는 stack에 저장

    동적으로 생성된 person 객체는 heap 영역에 저장

     

    PC Register

    스레드가 시작될 때 생성, 현재 수행중인 JVM 명령어 주소를 저장하는 공간

    스레드가 어떤 부분을 어떤 명령어로 수행할지 저장하는 공간

     

    Native Method Stack

    자바가 아닌 다른 언어로 작성된 코드를 위한 공간

    JNI(java native interface)를 통해 호출하는 c/c++ 등의 코드를 수행하기 위한 공간

     

     

    https://s-y-130.tistory.com/category/JAVA/JAVA%20%28JVM%29

     

    'JAVA/JAVA (JVM)' 카테고리의 글 목록

     

    s-y-130.tistory.com

    https://steady-coding.tistory.com/593#google_vignette

     

    [Java] JVM의 클래스 로더란?

    java-study에서 스터디를 진행하고 있습니다. 클래스 로더란? 자바는 동적 로드, 즉 컴파일 타임이 아니라 런타임(바이트 코드를 실행할 때)에 클래스 로드하고 링크하는 특징이 있다. 이 동적 로드

    steady-coding.tistory.com

    https://earth-95.tistory.com/4

     

    [JAVA 개념] JVM, JRE, JDK란?

    JVM JVM은 자바 가상머신(Java Virtual Machine)의 약자입니다. JVM은 자바 소스코드로부터 만들어지는 자바 바이너리 파일(.class)을 실행할 수 있습니다. 또한, JVM은 플랫폼에 의존적입니다. 즉, 리눅스의

    earth-95.tistory.com

    https://doozi0316.tistory.com/category/JAVA/WhiteShip%20Java%20Live%20Study

     

    'JAVA/WhiteShip Java Live Study' 카테고리의 글 목록

    Spring MVC | Spring Boot | Spring Security | Mysql | Oracle | PostgreSQL | Vue.js | Nuxt.js | React.js | TypeScript | JSP | Frontend | Backend | Full Stack | 자기계발 | 미라클 모닝 | 일상

    doozi0316.tistory.com

     

Designed by Tistory.