본문 바로가기

JAVA

JVM의 구조

728x90

 

전체 구조 

  • 클래스로더
  • 실행 엔진
    • 인터프리터
    • jit 컴파일러
    • 가비지 콜렉터
  • 런타임 데이터 영역
    • 메소드영역
    • 힙영역
    • PC Register
    • 스택 영역
    • 네이티브 메소드

 

실행 순서

  1. bytecode로 변환된 코드가 jvm에 들어오면
  2. class loader가 runtime data area로 로딩
  3. 실행 엔진을 통해 해석
  4. 런타임 데이터 각 영역에 배치되어 수행

클래스로더

  • 바이트코드(.class)들을 엮어서 로드하고 JVM 메모리영역인 Runtime Data Areas에 배치

로딩 순서

  1. Loading (로딩)
    • 클래스파일을 가져와 jvm의 메모리에 로드
  2. Linking: 로드한 클래스파일 사용을 위해 검증하는 과정
    • Verifying
      • 클래스가 JVM 명세에 명시된 대로 구성되어 있는 지 검사
    • Preparing
      • 클래스가 필요로 하는 메모리 할당
    • Resolving
      • 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경
  3. Initialization
    • 클래스 변수들을 적절한 값으로 초기화
      • static 필드들을 설정된 값으로 초기화

 

실행엔진

  • Runtime Data Area에 배치된 바이트 코드를 명령어 단위로 읽어서 실행
  • 기계가 실행할 수 있는 형태로 변경
  • 인터프리터와 JIT 컴파일러 두 가지 방식을 혼합하여 바이트 코드를 실행
  • 인터프리터 방식을 사용하다 일정 기준이 넘어가면 JIT 컴파일 방식으로 명령어를 실행

  • 가비지 컬렉터
    • 가비지 컬렉터를 이용해 HEAP 메모리 영역에서 더이상 사용하지 않는 메모리 자동 회수
    • JAVA는 Garbage Collector를 이용해 자동으로 메모리 실시간 최적화

런타임 데이터 영역

  • JVM 메모리 영역으로 자바 어플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역

  • 메서드 영역
    • 바이트 코드를 처음 메모리 공간에 올릴 때, 초기화 대상을 저장하는 메모리 공간
    • 프로그램이 종료 될 때까지 저장
    • 정적 필드와 클래스 구조만 갖고 있음
      • field info
        • 멤버변수의 이름, 데이터 타입, 접근 제어자 정보
      • method info
        • 메소드 이름, return 타입, 함수 매개변수, 접근 제어자 정보
      • type info
        • class / interface 여부 저장, type 속성, super class 이름
  • 힙 영역
    • 데이터를 저장하기 위해 런타임시 동적으로 할당하여 사용하는 영역
    • Reference Type이 저장
      • new 연산자로 생성되는 클래스, 인스턴스 변수, 배열 등
    • 메서드 영역에 저장된 클래스만이 생성되어 적재
    • 힙의 참조 주소는 스택이 갖고 있어, 해당 객체를 통해서만 힙 영역에 있는 인스턴스를 핸들링 할 수 있음

  • 참조하는 변수나 필드가 없다면 의미없는 객체로 여기고 가비지 컬렉터를 실행시켜 객체를 제거
 

가비지 컬렉션(Garbage Collection) 동작원리

가비지 컬렉터가 가비지 컬렉션을 수행 가비지 컬렉션 메모리 관리기법 힙내에 동적으로 할당했던 메모리 영역 중 필요 없게 된 영역을 해제하는 기능 가비지 컬렉터 동작원리 포인터 추적 방

ddevgrit.tistory.com

 

  • 스택영역
    • 임시적으로 사용되는 변수들이 저장되는 공간
    • 단 데이터 타입에 따라 스택과 힙에 저장되는 방식이 다름
      • 기본(원시)타입 변수는 스택 영역에 직접 값을 가짐
      • 참조타입 변수는 힙 영역이나 메소드 영역의 객체 주소를 가짐
      • Person p = new Person() 에서 클래스는 heap에, p는 stack에 저장
    • 쓰레드 마다 하나씩 존재, 쓰레드가 시작될 때 할당
  • PC 레지스터
    • 현재 수행중인 JVM 명령어 주소를 저장하는 공간
      • 데이터, 피연산 값 등
    • 주소
      • 쓰레드가 어떤 부분을 무슨 명령으로 실행해야 할 지에 대한 기록을 보유
    • 레지스터
      • CPU내의 기억장치
    • PC 레지스터
      • 현재 작업하는 내용을 CPU에게 연산으로 제공하기 위한 버퍼공간
    • jvm은 스택에서 비연산값(OPERAND)를 뽑아 별도의 메모리 공간인 PC Register에 저장

 

 

  • 모든 쓰레드가 공유하는 영역
    • Method area, Heap area
  • 각 쓰레드 마다 생성되는 영역
    • PC Register, Stack area, Native Method stack

 

출처: https://inpa.tistory.com/entry/JAVA-%E2%98%95-JVM-%EB%82%B4%EB%B6%80-%EA%B5%AC%EC%A1%B0-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD-%EC%8B%AC%ED%99%94%ED%8E%B8

728x90

'JAVA' 카테고리의 다른 글

스프링(Spring)에서 자주 사용하는 Annotation 종류  (0) 2024.02.22
가비지 컬렉션(Garbage Collection) 동작원리  (1) 2024.02.01
[JAVA] JIT 컴파일러란??  (0) 2024.01.26
JVM (Java Virtual Machine)  (0) 2024.01.25
Thread  (2) 2024.01.24