[TIL] JVM의 메모리 구성

insightp25·2023년 2월 14일
post-thumbnail

JVM은 메모리를 여러가지 다른 영역에 있는 메모리를 관리한다. 각 영역은 고유의 목적과 작동방식이 있으며, 주 메모리 영역들은 다음과 같다.



1. 힙 영역heap area

  • 프로그램의 모든 스레드가 공유(멀티스레드 사용시 동기화에 주의 필요)
  • 프로그램에서 생성된 모든 객체 저장
  • 런타임 시 동적으로 할당
  • JVM의 garbage collector가 관리
  • Young Generation, Old Generation, Permanent Generation- Metaspace 등 세부 영역 구성(Java 8+)


2. 스택 영역stack area

  • 스레드별로 stack 1개씩 존재, 각각 고유 stack 영역 차지
  • 각 스택 안 stack frame이라는 자료구조가 메서드 호출시마다 생성(push)되어 stack에 쌓이며, 메서드 종료 또는 예외 발생시 제거(pop)되어 소멸
    • stack frame: local variable array, operand stack, frame data 포함
      • frame data: Constant Pool, 이전 stack frame 정보, 현재 메서드가 속한 클래스/객체에 대한 참조 등 정보 포함
  • 호출된 메서드와 그 지역변수가 쌓이는 영역
  • 메서드 호출의 발생 기록


3. 메서드 영역method area

  • 프로그램의 모든 스레드가 공유(멀티스레드 사용시 동기화에 주의 필요)
  • 클래스 로더가 바이트코드 클래스 파일(.class)을 읽어오면 클래스 정보를 파싱, 이 영역에 저장
  • 클래스와 메서드에 대한 metadata: field, method names, data types, code 등
  • permanent generation 또는 non-heap memory라고도 한다.
  • 프로그램의 모든 스레드가 공유


4. 네이티브 메서드 영역native method stacks

  • 스레드별로 stack 1개씩 존재, 각각 고유 stack 영역 차지
  • 성능 향상 등을 목적으로 Java 바이트코드가 아닌 다른 언어(C/C++)로 작성된 메서드에 대한 별도의 stack 영역
  • 호출된 네이티브 메서드 저장
  • 운영체제OS, 기타 네이티브 라이브러리와 상호작용 시 사용


5. PC 레지스터 영역program counter register

  • 스레드별로 stack 1개씩 존재, 각각 고유 stack 영역 차지
  • 스레드에 의해 실행되는 코드 현 위치(바이트코드 몇 번째 줄이 실행중인지) 저장






참고자료

profile
backend, data-streaming, AI

0개의 댓글