Java memory model 정리

Java Memory Model

JVM

  • 운영체제로부터 할당받은 메모리 공간을 기반으로 자바 프로그램 실행
  • 운영체제로부터 할당받은 메모리 공간을 이용해서 자기 자신과 자바 프로그램 실행

JVM의 메모리 모델

메모리 공간 활용의 효율성을 높이기 위해 메모리 공간을 세 개의 영역으로 구분

  • 메서드 영역: 메서드의 바이트 코드, static 변수
  • 스택 영역: 지역 변수, 매개 변수
  • 힙 영역: 인스턴스 (객체)

바이트코드(Bytecode) 고급 언어로 작성된 소스 코드를 가상 머신이 이해할 수 있는 중간 코드로 컴파일 한 것을 말한다. 가상머신은 이 바이트 코드를 각각의 하드웨어 아키텍처에 맞는 기계어로 다시 컴파일하며 어셈블리어에 가까운 형태이다.

메서드 영역

  • 메서드의 자바 바이트 코드는 JVM이 구분하는 메모리 공간 중에서 메서드 영역에 저장
  • static으로 선언된 클래스 변수도 메서드 영역에 저장
  • 이 영역에 저장된 내용은 프로그램 시작 전에 로드되고, 프로그램 종료 시 소멸

스택 영역

  • 매개변수, 지역변수가 할당되는 메모리 공간
  • 프로그램이 실행되는 도중에 임시로 할당되었다가 바로 소멸되는 특징이 있는 변수가 할당
  • 이 영역에 저장된 변수는 해당 변수가 선언된 메서드 종료 시 소멸
스택의 흐름
  • 지역 변수는 스택에 할당
  • 스택에 할당된 지역변수는 해당 메서드를 빠져나가면 소멸
  • 할당 및 소멸의 특성상 그 형태가 장작을 쌓는 것과 유사해서 스택이라 이름 지어짐
  • 할당 및 소멸의 특성상 메서드 별 스택 구분

힙 영역

  • 인스턴스(객체)가 생성되는 메모리 공간
  • JVM에 의한 메모리 공간의 정리(Garbage Collection)가 이뤄지는 공간
  • 할당은 프로그래머가, 소멸은 JVM이 처리
  • 참조변수에 의한 참조가 전혀 이뤄지지 않는 인스턴스가 소멸의 대상이 되며 JVM은 인스턴스의 참조관계를 확인하고 소멸 대상선정
Garbage Collection
  • GC는 한 번도 발생하지 않을 수 있음
  • GC가 발생하면, 소멸의 대상이 되는 인스턴스는 결정되지만 이것이 실제 소멸로 바로 이어지지 않음
  • 인스턴스의 실제 소멸로 이어지지 않은 상태에서 프로그램이 종료될 수 있으며, 종료가 되면 인스턴스는 소멸됨