새로운 블로그로 이전하였습니다!

JVM 메모리 구조와 라이프 사이클

JVM (Java Virtual Machtine)

  • JAVA와 OS 사이에서 중개자 역할
  • OS에 구애 받지 않고 프로그램을 실행하도록 도와준다.
  • 가비지 컬렉터를 통해 자동으로 메모리 관리
  • 스택VM 기반으로 동작

JVM 메모리 구조

1) Class Loader

  • JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
  • 런타임 시에 동적으로 클래스를 로드한다.

2) Execution Engine

  • 클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명령어 단위로 읽어서 실행한다.

3) Garbage Collector

  • 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체를 탐색 후 제거하는 역할
  • GC가 역할을 하는 시간은 언제 인지 정확히 알 수는 없음

4) Runtime Data Area

  • JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역
  • Method area
    • 모든 쓰레드가 공유하는 메모리 영역. 클래스, 인터페이스, 메소드, 필드, Static변수 등의 바이트 코드를 보관한다.
  • PermGen / Metaspace
    • 클래스의 메타 데이터가 저장되는 영역(클래스 이름, 생성정보, 필드정보, 메서드 정보)
    • JDK 1.7 이하에서는 PermGen이 매우 작은 크기의 고정 메모리로 할당 되어있어서 OOM이 종종 일어났으나 JDK 1.8부턴 Metaspace로 이름이 변경되고 동적 메모리로 할당 되어있다.
  • Heap area
    • 모든 쓰레드가 공유하며 new 키워드로 생성된 객체와 배열이 보관되는 영역
    • 메소드 영역에 로드된 클래스만 생성이 가능
    • GC가 참조되지 않은 메모리를 확인하고 제거하는 영역
  • Stack area
    • 메서드 호출 시마다 그 메서드만을 위한 공간(스택 프레임)을 생성한다.
    • 메서드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값 드을 저장한다.
    • 메서드 수행이 끝나면 프레임별로 삭제된다.
  • PC Register
    • 쓰레드가 시작될 때 생성되며, 쓰레드마다 공간이 하나씩 존재한다.
    • 쓰레드가 어떤 부분에 무슨 명령으로 실행할지에 대한 기록을 하는 부분.
    • 현재 수행중인 JVM명령의 주소를 갖는다.
  • Native method stack
    • 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역
복사했습니다!