티스토리 뷰

728x90
반응형

목차

     

    지난 글에선 JVM의 대략적인 구조와 Workflow에 대해 알아보았다.

     

    2022.10.30 - [Development/Technical Interview] - [Java]JVM 구조(1), JVM Workflow

     

    [Java]JVM 구조(1), JVM Workflow

    JVM(Java Virtual Machine) JVM(Java Virtual Machine)이란 이름 그대로 자바 바이트코드를 실행할 수 있는 가상 머신이다. 여기서 자바 바이트코드란 JVM이 실행할 수 있는 언어로 이루어진 명령어의 집합을 가

    gnidinger.tistory.com

    이번 글에선 내용을 나누어 다루기로 했던, 런타임 데이터 영역에 대해 알아보겠다.

     

    먼저 지난 글에서 살펴본, JVM의 구조에 대해 그림으로 복습하고 가자.

     

    JVM은 크게 나누면 위와 같이 Class Loader, Execution Engine, Runtime Data Area로 이루어진다.

     

    모든 작업이 당연하게도 메모리 영역과 연결되어 있는 것을 확인할 수 있다. 계속해보자.

     

    Runtime Data Area

     

    런타임 데이터 영역은, 한 마디로 말하면 O/S로부터 배정받은 메모리를 용도에 맞게 분할하는 역할을 한다.

     

    크게 보면 아래와 같이 다섯 개의 영역으로 이루어지며,

     

    혹은 스레드를 추가해 아래와 같이 표현하기도 한다.

     

     

    이어서 각 영역에 대해 간략히 살펴보자.

     

    Method(static) Area

     

    • JVM 구동 시 클래스 로딩과 함께 생성, 종료 시까지 유지됨
    • 힙 영역과 함께 모든 스레드가 공유해서 사용하며 GC의 대상이 된다.
    • 주로 인스턴스 생성에 필요한 다음의 정보를 생성 및 분류해 저장하는 영역

      • 클래스 정보(멤버 변수의 이름)
      • 변수 정보(데이터 타입, 접근제어자 정보)
      • 메서드 정보(메서드 이름, 리턴 타입, 파라미터, 접근제어자 정보)
      • static변수, final class변수, Constant pool(상수 풀 : 문자 상수, 타입, 필드, 객체 참조 저장)
    • 다른 메모리 영역에서 정보에 대한 요청이 오면, 실제 물리 메모리 주소로 변환해서 전달

     

    Heap Area

     

     

    • 런타임 시 사용자에 의해 (new 키워드를 통해) 동적으로 할당해 사용하는 영역
    • new 키워드를 이용해 생성된 객체 및 참조형 데이터 타입 자료가 저장된다.
    • 낮은 메모리 주소에서 높은 주소의 방향으로 할당된다.
    • 메서드 영역과 함께 모든 스레드가 공유해서 사용해 스택 영역에 비해 처리 속도가 느리다.
    • 또한 Thread Safe가 보장되지 않아 synchronized와 같은 추가 처리가 필요하다.
      *Thread Safe - 멀티스레드 환경에서 하나의 객체에 여러 스레드가 접근하더라도 항상 올바른 결과가 나오는 것
    • GC의 대상이 되며, 효율적인 GC를 위해 위 그림과 같이 구분된 영역을 갖는다.
      • Young - 갓 생성된 자바 객체가 저장되는 곳.
                      생성된 객체는 Eden에서 시작해 Survivor의 빈 공간으로 재 할당되거나 참조 여부에 따라 회수된다.
      • Old - Young 영역이 가득 차게 되면 역시 참조 여부에 따라 Old 영역으로 이동되거나 회수된다.
      • Minor GC - 위 두 단계에서 일어나는 비교적 짧은 GC를 Minor GC라고 부른다.
      • Major GC - Old 영역까지 가득 차면 Old 영역의 모든 객체를 검사해서 참조되지 않는 객체를 한 번에 삭제해 메모리를 회수하는
                            GC가 실행된다. 시간이 오래 걸리는 작업이며, Major GC가 실행되는 동안은 나머지 모든 스레드는
                            작업을 멈추고 대기한다. 이를 'Stop-the-World'라고 부른다.

     

    Stack Area

     

    • 메서드가 호출될 때마다, 스레드 별로 하나씩만 생성된다. 다른 스레드와 공유되지 않는다.
    • 높은 메모리 주소에서 낮은 주소의 방향으로 할당된다.
    • 메서드에서 사용되는 값과 매개변수, 지역변수, 리턴 값 및 연산에 사용되는 값과 중간결과 등을 저장한다.
    • 스레드 내부에 할당되기 때문에 힙 영역과 비교해 상대적으로 처리속도가 빠르며 Thread Safe 하다.
    • 각 스레드는 내부적으로 메서드, 힙, 스택 영역을 가지며 메서드/힙 영역을 공유한다.
    • 메서드 실행이 끝나면 제거(pop)된다.

     

    • 객체 생성 시 위와 같이 서로 다른 영역에 저장되며, 생성된 c가 힙 영역에 생성된 객체의 주소 값을 가지고 참조하게 된다.

     

    PC(Program Counter) Register

     

    • 스레드가 시작될 때, 스레드 별로 하나씩 생성된다. 다른 스레드와 공유되지 않는다.
    • 개별 스레드가 어떤 부분을 어떤 명령으로 실행해야 하는지에 대한 기록을 담당
    • Thread Safe 환경을 위해 현재 수행 중인 JVM 명령의 주소 값을 저장하는 영역

     

    Native Method Stack

     

    • JNI(Java Native Interface), 즉 자바 이외의 언어를 실행하기 위한 메모리 공간. 다른 스레드와 공유되지 않는다.
    • Native Method Interface 및 Native Method Libraries와 상호작용하며 Execution Engine에 필요한 라이브러리를 제공한다.
    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/11   »
    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
    글 보관함