[Java] JVM

김성록·2023년 10월 27일
0

자바

목록 보기
5/6

JVM에 대해 좀 더 자세히 알아보자.


JVM의 구조

JVM의 구조는 크게 클래스 로더(Class Loader), 런타임 데이터 영역(Runtime Data Area), 실행 엔진(Execution Engine), 그리고 가비지 컬렉터(Garbage Collector)로 나뉜다.

  • 클래스 로더

    : 자바는 동적으로 클래스를 읽어오기 때문에 프로그램이 실행 중인 런타임에서 모든 코드가 JVM과 연결된다. 이렇게 동적으로 클래스를 로딩해주는 역할을 하는 것이 클래스 로더이다. 클래스 로더는 .class파일을 묶어서 런타임 데이터 영역으로 적재한다.

  • 런타임 데이터 영역

    : 런타임 데이터 영역은 JVM이 프로그램을 수행하기 위해 운영체제로부터 독립적으로 할당받은 메모리 공간을 말한다. 크게 5가지 영역으로 나눌 수 있다.

    • 메서드 영역(Method Area)
      : 모든 스레드가 공유하는 메모리 영역으로, 클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보와 같은 각종 필드 정보들과 메서드 정보, 데이터 타입 정보, Constant Pool, static 변수, final class 등이 생성된다.
    • 힙 영역(Heap Area)
      : 런타임 시점에 동적으로 할당하여 사용되는 영역이다. 클래스를 이용해 인스턴스를 생성하면 Heap에 저장된다. 즉, new 연산자를 이용해 생성된 객체를 저장하는 영역이다. 또한 주기적으로 가비지 컬렉터가 제거하는 영역이다.
    • 스택 영역(Stack Area)
      : 지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역이다. 메서드를 호출할 때마다 각각의 스택 프레임(메서드를 위한 공간)이 생성된다. 메서드 수행이 끝나면 프레임별로 삭제를 한다.
    • PC 레지스터(PC Register)
      : 스레드가 생성될 때마다 생성되는 영역으로, 프로그램 카운터, 즉 현재 스레드가 실행되는 부분의 주소와 명령을 저장하고 있는 영역이다.
    • 네이티브 메서드 스택(Native Method Stack)
      : 자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역이다. 자바 외의 언어로 작성된 native 코드들을 위한 스택이다.
  • 실행 엔진
    : .class파일이 런타임 데이터 영역의 Method Area에 배치된 이후에 JVM은 Method Area의 바이트 코드를 실행 엔진에 제공하여 정의된 내용대로 바이트 코드를 실행시킨다. 이 때, 로드된 바이트 코드를 실행하는 런타임 모듈이 실행 엔진이다. 실행 엔진은 바이트 코드를 명령어 단위로 읽어서 실행한다. 인터프리터 방식과 JIT Compiler 방식을 사용한다.

  • 가비지 컬렉터(GC, Garbage Collector)
    : 유효하지 않은 메모리인 가비지(Garbage)를 정리해 메모리를 관리하는 역할을 한다. GC의 과정 등 더 자세한 내용은 다음에 알아보자.


  • 모든 스레드가 공유해서 사용(GC의 대상)

    • 힙 영역
    • 메서드 영역
  • 스레드마다 하나씩 생성

    • 스택 영역
    • PC 레지스터
    • 네이티브 메서드 스택
profile
예비 개발자

0개의 댓글

관련 채용 정보