[Java(자바)] 메모리 관리와 가비지 컬렉션

2024. 5. 12. 07:34·Java/Java

JVM 구조

  • 자바 프로그램이 실행되면 JVM(자바 가상 머신)은 OS로부터 메모리를 할당받고, 그 메모리를 용도에 따라서 여러 영역으로 나누어 관리함

JVM 의 전체적인 구조

  • Source Code (.java) 파일을 Java Compiler를 통해서 Byte Code(.Class)파일로 변환 (컴퓨터가 이해할 수 있는 코드로 변환)
  • Byte Code로 변환된 파일을 JVM의 Class Loader 로 보냄
  • Class Loader는 말 그대로 Class 파일을 불러와서 메모리에 저장하는 역할
  • Execution Engine 은 Class Loader에 저장된 Byte Code를 명령어 단위로 분류하여 하나씩 실행하게 하는 엔진
  • Garbage Collector 는 사용하지 않거나 필요없는 객체들을 메모리에서 소멸시키는 역할
  • Runtime Data Area (Memory Area) 는 JVM이 프로그램을 수행하기위해 운영체제로부터 할당받은 메모리 공간

자바 변수의 종류

변수 종류 선언 위치 설명 생성 시기 소멸 시기 저장 메모리
클래스 변수(Static variable) 클래스 영역 static 키워드가 붙고 여러 객체에서 공통으로 사용 할 때 사용 클래스가 메모리에 올라갈때 프로그램 종료 시 Static
인스턴스 변수(Instance variable) 클래스 영역에서 static이 아닌 변수 인스턴스가 생성될 때 인스턴스 소멸시 Heap
지역 변수(Local variable) 메서드 영역 메서드 내부에서 선언된다. 
초기 값을 지정해야 사용가능.
블록 내에서 변수의 선언문이 실행 될 때 블록을 벗어날 때 Stack
  • 클래스 변수, 인스턴스 변수: 전역변수(global variable), 멤버변수(member variable), 필드(filed)

메모리 영역 (Runtime Data Area)

  • JVM의 메모리 공간(Runtime Data Area)은 세 가지 영역으로 구분되고 데이터 타입(자료형)에 따라 각 영역에 나눠서 할당
    1. Method(Static) 영역
    2. Stack 영역
    3. Heap 영역

Memory Area 의 구조

Method(Static) 영역

  • JVM이 동작해서 클래스가 로딩될 때 생성
  • JVM이 읽어들인 클래스와 인터페이스에 대한 런타임 상수 풀, 멤버 변수(필드), 클래스 변수(Static 변수), 상수(final), 생성자(constructor)와 메소드(method) 등을 저장하는 공간
  • 어느곳에서나 접근 가능
  • 데이터가 프로그램의 시작부터 종료가 될 때까지 메모리에 남아있음
    그래서 static 메모리에 있는 데이터들은 프로그램이 종료될 때까지 어디서든 사용이 가능
    그러나 static 데이터를 무분별하게 많이 사용할 경우 메모리 부족 현상이 일어남

Stack 영역

  • 메소드 내에서 정의하는 기본 자료형에 해당되는 지역변수의 데이터 값이 저장되는 공간
  • primitive 타입의 데이터(int, double, byte, long, boolean 등) 에 해당되는 지역변수, 매개 변수 데이터 값이 저장 
  • 메소드가 호출 될 때 메모리에 할당되고 종료되면 메모리에서 사라짐
  • 후입선출 LIFO(Last-In-First-Out)
  • 스코프(Scope) 의 범위를 벗어나면 스택 메모리에서 사라짐

Heap 영역

  • JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역
  • 참조형(Reference Type) 데이터 타입을 갖는 객체(인스턴스), 배열 등이 저장 되는 공간
  • 단, Heap 영역에 있는 오브젝트들을 가리키는 레퍼런스 변수는 Stack에 적재
  • Heap 영역은 Stack 영역과 다르게 보관되는 메모리가 호출이 끝나더라도 삭제되지 않고 유지
  • 어떤 참조 변수도 Heap 영역에 있는 인스턴스를 참조하지 않게 되면, GC(가비지 컬렉터)에 의해 메모리에서 청소됨
  • Stack은 스레드 갯수마다 각각 생성되지만, Heap은 몇개의 스레드가 존재하든 상관없이 단 하나의 Heap 영역만 존재

가비지 컬렉션

  • 힙 영역에 저장된 객체들 중에서 더 이상 사용되지 않는 객체들을 찾아내어 메모리를 해제
  • 메모리 누수를 방지하기 위해 필요

가비지 컬렉션의 동작 방식

공통 동작 방식

  1. Stop The World
  2. Mark and Sweep

Stop The World

  • 가비지 컬렉션을 실행하기 위해 JVM이 애플리케이션의 실행을 멈추는 작업
  • GC가 실행될 때는 GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업이 중단되고, GC가 완료되면 작업이 재개
  • 모든 쓰레드들의 작업이 중단되면 애플리케이션이 멈춤
    • GC의 성능 개선을 위해 튜닝을 한다고 하면 보통 stop-the-world의 시간을 줄이는 작업을 함

Mark and Sweep

  • Mark: 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업
  • Sweep: Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업
  1. Stop The World를 통해 모든 작업을 중단
  2. GC는 스택의 모든 변수 또는 Reachable 객체를 스캔하면서 각각이 어떤 객체를 참고하고 있는지를 탐색
  3. 사용되고 있는 메모리를 식별 (=Mark)
  4. 이후에 Mark가 되지 않은 객체들을 메모리에서 제거 (=Sweep)
저작자표시 비영리 변경금지 (새창열림)

'Java > Java' 카테고리의 다른 글

[Java(자바)] Java 21 - Virtual thread  (0) 2024.05.12
[Java(자바)] 자바의 Thread(쓰레드)  (0) 2024.05.12
[Java(자바)] Java 접근제어자  (0) 2024.05.12
[Java(자바)] 동일성 / 동등성  (0) 2024.05.12
[Java(자바)] JPA에서 복잡한 쿼리 작성  (0) 2024.05.12
'Java/Java' 카테고리의 다른 글
  • [Java(자바)] Java 21 - Virtual thread
  • [Java(자바)] 자바의 Thread(쓰레드)
  • [Java(자바)] Java 접근제어자
  • [Java(자바)] 동일성 / 동등성
주민1호
주민1호
개발/알고리즘 등등
  • 주민1호
    개발바라기별
    주민1호
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • 🏚️
    • 🏷️
    • ✏️
    • ⚙️
    • All (40)
      • Data (0)
        • 💯DASP (0)
        • 💯SQLD (0)
        • 💯ADSP (0)
      • Java (17)
        • Java (11)
        • Spring Framework (6)
      • Python (0)
        • Python (0)
        • Flask (0)
        • TensorFlow (0)
      • JavaScript (1)
        • React (0)
        • Vue (0)
      • Lang (11)
        • C (11)
        • C++ (0)
      • Infra (0)
        • Docker (0)
        • Kubernetes (0)
        • AWS (0)
      • Algorithm (9)
      • 운영체제 (0)
        • Linux (0)
      • Etc. (1)
        • Git (1)
        • Network (0)
        • 컴퓨터과학개론 (0)
        • 멀티미디어시스템 (0)
      • AI (0)
      • Projects (0)
        • 2022 OSSCA (0)
      • Review (0)
      • 회고 (0)
  • hELLO· Designed By정상우.v4.10.3
주민1호
[Java(자바)] 메모리 관리와 가비지 컬렉션
상단으로

티스토리툴바