JVM 내부 구조 & 메모리 영역

·2024년 5월 18일
0

CS

목록 보기
4/6
post-thumbnail

JVM 동작 방식


순서대로 정리

  1. 자바 프로그램을 실행하면 JVM 은 OS 로부터 메모리를 할당받는다.
  2. 자바 컴파일러 (javac) 가 자바 소스코드(.java) 를 자바 바이트 코드 (.class) 로 컴파일한다.
  3. 클래스 로더는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 Runtime Data Area (실질적으로 메모리를 할당 받아 관리하는 영역) 에 올린다.
  4. Runtime Data Area 에 로딩된 바이트 고드는 Execution Engine 을 통해 해석된다.
  5. 이 과정에서 Execution Engine 에 의해 Garbage Collector 의 작동과 Thread 동기화가 이루어진다.

조금 더 자세한 역할

JVM 구조 제대로 뜯어보기

  1. 클래스 로더

    JVM 내로 클래스 파일을 동적으로 로드, 링크를 통해 배치하는 작업을 수행하는 모듈

    즉, 로드된 바이트 코드를 엮어서 JVM 의 메모리 영역인 Runtime Data Area 에 배

  2. 실행 엔진

    1. 인터프리터 : 명령어 단위로 읽어서 실행
    2. JIT 컴파일러 : 바이트 코드 전체를 컴파일하여 Natice Code 로 변경
    3. 가비지 콜렉터 : Heap 메모리 영역에서 더이상 사용하지 않는 인스턴스 친구들 메모리 회수
  3. 런타임 데이터 영역 → 여기서 의존성 생

    1. 메소드
    2. PC Register
    3. 스택
    4. 네이티브 메서드

힙과 스택 영역

걍 힙에는 인스턴스가 저장되어 있는 거고 스택에는 변수들이 저장되어 있다고 생각하면 편함.

참조 타입, 기본 타입이 저장되어 있는데 가비지 콜렉터가 실행될 때마다 사용 안 하는 인스턴스들을 버려 주기 때문에 알아서 청소하는 거고 개발자는 메모리 관리를 해 줄 필요가 X → 가성비








면접 보러 다닐 때 jvm 구조를 자주 물어본다고 하셔서 공부했었는데 지금 업로드~
신기하게 의존성에 대해 이해를 하지 못하고 잇었는데 (아니 외부에서 실행된다는 게 뭔소리?) jvm 구조를 파악하고 나니까 조금 더 와닿았다.
그래서 의존성 주입 시 오류나면 전체 프로그램이 돌아가지 않는 거구나~ 인 것도 다시 알게 됨.

profile
자바 백엔드 개발자 개인 위키

0개의 댓글