• JVM이 뭐라고?

    2022. 3. 6.

    by. 내이름은 킹햄찌

    JVM

    Java Virtual Machine : 자바를 실행하기 위한 가상머신(소프트웨어로 구현된 하드웨어)

    특징

    • 스택기반의 가상머신 : 인텔 86x 아키텍처나 ARM 아키텍처와 같은 하드웨어는 레지스터기반으로 동작하지만 JVM은 스택기반으로 동작함 이유는 자바는 어떠한 디바이스에서도 동작하는 것이 목표인데 디바이스의 레지스터는 정해져 있지 않기때문에 레지스터기반으로 동작하면 자원관리에 관여하게 되기때문에 스택기반임
    • 심볼릭 레퍼런스 기반 : 기본자료형(Primitive data type)을 제외한 모든 타입(클래스와 인터페이스)을 명시적인 메모리 주소 기반의 레퍼런스가 아니라 심볼릭 레퍼런스를 통해 참고 심볼릭 레퍼런스 : 참고하는 클래스의 특정 메모리 주소를 참조 관계로 구성하지 않고 이름만 가지고 있는것
    • 네트워크 바이트 오더 : 자바 클래스 파일은 네트워크 바이트 오더를 사용함. 인텔 x86 아키텍처가 사용하는 리틀 에디안이나 RISC계열 아키텍처가 주로 사용하는 빅 에디안 사이에서 플렛폼 독립성을 유지하려면 고정된 바이트 오더를 유지해야 하기에 네트워크 전송시에 사용하는 바이트 오더인 네트워크 바이트 오더(빅 에디안)를 사용함

     

    왜 필요할까?

    • 자바와 OS 사이의 중개자 역활을함
    • OS와 플렛폼에 의존하지 않고 독립적으로 java프로그램을 샐행가능하게 함
    • 메모리 관리 (Garbagecollection)를 해줌

     

    실행과정

    1. 프로그램이 실행되면 JVM은 OS로부터 프로그램이 필요로하는 메모리를 할당받아 용도에 따라 여러영역으로 나누어 관리
    2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어들여 자바 바이트코드(.class)로 변환
    3. Class Loader를 통해 class파일들을 JVM으로 로딩
    4. 로딩된 class파일들은 Execution engine을 통해 해석
    5. 해석된 바이트 코드는 Runtime Data Areas에 배치되어 실질적인 수행이 이루어지게 됨

    구성

     

    Class Loader

    JVM 내로 클래스(.class) 파일을 로드하여 link를 통해 배치하는 작업을 수행

    Runtime에 동적으로 클래스를 로드 함

    jar파일 내 저장된 클래스들을 JVM위에 올리고 사용하지 않는 클래스들은 메모리에서 삭제 함

    런타임에 참조하기 때문에 클래스를 처음 참조할때 해당 클래스를 링크함

     

    Excution Engine

    Class Loader가 Runtime Data Area에 올려둔 클래스(.class) 파일을 바이트 코드 단위로 실행시켜 기계가 실행 할 수 있는 형태로 변경함

    • Interpreter 방식인터프리터 언어 단점을 가짐(한 줄씩 실행하기 때문에 느림)
    • 자바 바이트 코드를 명령어 단위로 읽어서 실행
    • JIT (Just - In - Time) 방식바이트코드 전체를 미리 컴파일 하여 네이티브 코드로 바꾸어 사용함하지만 컴파일 시간이 오래걸리기 때문에 JIT 컴파일러를 사용하는 JVM은 메서드의 수행주기를 체크하여 기준치를 넘을때 컴파일 함
    • 네이티브 코드들은 캐쉬에 보관하고 이후 변경된 코드만 컴파일 하여 사용하기 때문에 한번 컴파일 된 코드는 빠르게 작동할 수 있음
    • Interpreter 방식의 단점 보안하기 위해 도입 됨

     

    Garbage colletor

    GC를 수행하는 쓰레드( 나중에 더 깊게 파악할 예정)

     

    Runtime Data Area

    JVM 메모리(OS에서 할당받은 메모리 공간)

    PC Register

    Thread 가 현재 실행중인 JVM 명령의 주소가 기록된 공간

    그렇기 때문에 각 스레드는 이 공간을 공유하지 않고, Thread마다 하나씩 존재

     

    JVM stack

    임시로 할당되는(동적으로 할당되지 않는) 데이터를 저장하기 위한 공간

    스택 프레임(메서드) 단위로 적재됨

    스택 프레임에는 호출된 메서드의 매개변수, 지역변수, 리턴 값, 연산시 일어나는 값들이 임시로 저장됨

    메서드가 종료되면 스택 프레임도 같이 제거 됨

    스택의 크기는 컴파일 타임에 결정되기 때문에 스택프레임의 크기도 메서드에 따라 고정 됨

     

    Native method stack

    자바 외의 언어로 작성된 C/C++ 같은 코드를 위한 스택

    Java Native Interface를 이용하여 바이트코드로 변환하여 저장 됨

    Method Area

    메모리에 클래스 정보를 최초에 올릴때 초기화되는 대상을 저장

    올라가는 데이터

    Field Information : 멤버 변수의 이름, 데이터 타입, 접근 제어자에 대한 정보

    Method Information : 메소드의 이름, 리턴타입, 매개변수, 접근 제어자에 대한 정보

    Type Information : class인지 interface인지 여부 저장, Type 속성, 전체 이름, super class의 전체이름(interface 이거나 object 인경우 제외)

    상수 자료형을 저장하여 참조하고 중복을 막는 Runtime Constant Pool이라는 별도의 관리영역 존재

    마찬가지로 GC의 대상이 됨

     

    Heap

    동적(new 생성자)으로 생성된 배열이나 객체들이 위치하게 됨

    GC의 대상이 되는 공간임

    Method Area에 초기화 되어 있는 클래스만 생성가능

     

    Permanent Generation

    생성된 객체들의 정보의 주소값이 저장된 공간

    Class loader에 의해 로드 되는 Class, Method 등에 대한 Meta 정보가 저장되는 영역이고 JVM에 의해 사용됨

    Reflection을 사용하여 동적으로 클래스가 로딩되는 경우에 사용된다. 내부적으로 Reflection 기능을 자주 사용하는 Spring Framwork를 이용할 경우 이영역에 대한 고려가 필요

    Reflection : 바이트코드를 이용해 클래스의 정보를 알아내는 방법

    Java 7버전까지만 존재하고 Java8부터는 Method Stack에 편입

     

    New/Young

    Eden : 객체들이 최초로 생성되는 공간

    Survivor 0/1 : Eden에서 참조되는 객체들이 저장되는 공간

    Minor GC가 일어남

     

    Old

    New/Young에서 살아남은 생명주기가 긴 객체들이 남아 있는 공간임

    Major GC가 일어남

     

     

     

    참고

    https://asfirstalways.tistory.com/158

    https://limkydev.tistory.com/51?category=957527

    https://d2.naver.com/helloworld/1230

    https://catsbi.oopy.io/df0df290-9188-45c1-b056-b8fe032d88ca#9d2fe782-ade7-4c8d-aaf6-20b8ac139a72

    https://velog.io/@pearl0725/JVM은-어떤-역할을-할까

     

     

    'Lang > Java' 카테고리의 다른 글

    트러블 슈팅으로 배우는 Java 기초 자료형  (0) 2022.12.20

    댓글