[Java] 메모리 구조

정리


일반적인 프로그램과 자바 프로그램의 구조 비교

memory01

JVM의 내부구조

memory02

  • Java Source
    • 사용자가 작성한 Java 코드
  • Java Compiler
    • Java 코드를 Byte Code로 변환시켜 주는 기능
  • Class Loader
    • 프로그램 실행 시에, Class 파일을 메모리(Runtime Data Area)에 적재하는 기능
  • Execution Engine
    • JVM 메모리 공간에 저장 된 Byte Code를 하나의 명령어 단위로 읽어 들여 실행하도록 해줌.
  • Gabage Collector
    • 사용하지 않는 객체들을 메모리에서 해제하는 역할
  • Runtime Data Area
    • JVM 프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간

JVM의 메모리 구조

memory02

Method(Static) Area

  • JVM이 읽어들인 클래스와 인터페이스 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static 변수), 생성자와 메소드를 저장하는 공간
    • 각 데이터는 Runtime Constant Pool을 가진다.
    • Runtime Constant Pool
      • 메소드 영역에 포함되지만 독자적 중요성이 있다.
      • 클래스와 인터페이스 상수, 메소드와 필드에 대한 모든 Reference 값들을 저장
      • JVM은 런타임 상수 풀을 통해 해당 메소드나 필드의 실제 메모리 상 주소를 찾아 참조
  • 명시적으로 null 선언 시 GC 대상

Heap Area

  • 동적으로 생성 된 객체 또는 배열 등을 저장하는 영역
  • new 연산자를 통해 생성한 객체
  • 객체가 더 이상 쓰지 않거나 명시적으로 null 선언 시 GC 대상

Stack Area

  • 메서드 호출 시 Stack 영역에 각각의 메서드를 위한 메모리 할당 됨.
    • 각 메서드는 하나씩의 Stack을 가짐
  • 호출 된 메서드의 지역변수, 매개변수, 리턴 값 및 연산 값을 임시로 저장하는 공간.
  • 사용이 끝나면 Stack 영역에서 해제
  • 선입후출(FILO) 구조
  • 기본(원시)타입 변수는 스택 영역에 직접 값을 가진다.

PC Register

  • Program Counter
  • Thread가 생성될 때마다 생성되는 공간
  • 현재 실행되는 부분의 명령과 주소를 저장
  • 현재 실행되고 있는 명령이 종료되면 카운트 값을 증가시켜 다음 명령을 실행하게 함

Native Method Area

  • Java 외 언어(C, C++ 등)을 수행하기 위한 Stack 영역
  • 프로그램 도중 호출 된 메서드가 Native 방식을 사용하는 메소드 일 경우, 이 영역에 저장되어 처리

참고