Java의 메모리 관리

2026. 5. 17. 02:02·CS/Java

1. 메모리 관리란?

프로그램에 필요한 저장 공간을 할당하고 해제하는 것

목적

  • 프로그램 실행에 필요한 데이터를 저장하기 위해 사용
  • 효율적인 메모리 사용과 안정성 확보

2. C언어 메모리 관리

특징

  • 개발자가 메모리를 직접 다룰 수 있음

대표 함수

  • malloc() : 메모리 할당
  • free() : 할당된 메모리 해제

장점

  • 중간 과정 없이 직접 다루므로 속도가 빠름
  • 메모리 사용 효율이 좋음

단점

  • 사람이 직접 관리하므로 실수 발생 가능

대표적인 문제

  • 메모리 누수(Memory Leak) : 사용이 끝난 메모리를 반납하지 않는 문제
  • 해제된 메모리 접근 : 이미 free() 한 메모리를 다시 접근하는 문제

3. Java 메모리 관리

특징

  • JVM 실행 시 운영체제로부터 메모리를 할당받음
  • JVM이 메모리를 관리함

즉, Java에서는 개발자가 직접 메모리를 할당하거나 해제할 필요가 없습니다.

대신 JVM은 메모리를 크게 Stack과 Heap 두 영역으로 나누어 관리합니다.


4. 스택(Stack)

실행 흐름을 담는 메모리 공간

비유

  • 개인 작업대

특징

  • 지역변수(Local Variable) 저장
  • 메서드 호출 정보 저장
  • 메서드 실행 종료 시 자동 반납
  • 메모리 관리가 비교적 쉬움

5. 힙(Heap)

공용으로 사용하는 메모리 공간

비유

  • 공유 주방

특징

  • 객체(Object)와 인스턴스 데이터를 저장
  • 메서드 종료 후에도 객체가 바로 사라지지 않음
  • 여러 곳에서 함께 참조 가능

왜 스택과 힙을 나누는가?

  • 메모리 관리 효율성과 실행 성능 향상을 위해

Stack의 특성

  • 빠른 생성 및 제거 가능
  • 실행 흐름 관리에 적합

Heap의 특성

  • 크기가 큰 데이터 및 객체 저장에 적합
  • 여러 객체가 공유 가능

핵심 정리

Stack은 메서드 실행 중심, Heap은 객체 저장 중심


6. GC(Garbage Collector)

힙 메모리 영역에서 더 이상 사용되지 않는 객체를 제거하는 기능

역할

  • 참조되지 않는 객체 제거
  • 사용 가능한 메모리 확보
  • 메모리 누수 방지 도움

동작 기준

객체가 제거되는 경우는 다음과 같습니다.

  • GC Root를 기준으로 참조 관계를 탐색했을 때
  • 더 이상 참조되지 않는 객체인 경우 제거

GC Root 예시

  • 스택의 지역 변수
  • static 변수
  • JNI 참조 등

동작 과정

  1. GC Root를 기준으로 참조 관계 탐색
  2. 사용 중인 객체와 사용되지 않는 객체 구분
  3. 참조되지 않는 힙 메모리 제거
  4. 메모리 정리 수행

Stop-The-World

  • GC 과정에서 일부 Stop-The-World가 발생할 수 있음
  • 이 과정에서 프로그램 실행이 잠시 멈춤

최신 JVM GC인 G1 GC, ZGC, Shenandoah 등의 저지연 GC는 이 정지 시간을 줄이기 위해 지속적으로 개선되고 있습니다.

메모리 압축(Compaction)

  • GC는 메모리 압축을 수행하기도 함
  • 흩어진 메모리를 정리하여 메모리 단편화(Fragmentation)를 줄임

7. 전체 흐름 요약

Stack

  • 메서드 실행을 관리하는 공간
  • 지역 변수 저장
  • 자동 생성 및 자동 제거

Heap

  • 객체를 저장하는 공간
  • 여러 곳에서 참조 가능
  • GC가 관리

마치며

자바의 메모리 관리는 결국 "개발자 대신 JVM이 알아서 해준다"는 한 문장으로 요약할 수 있습니다.

하지만 그 내부에는 다음과 같은 구조가 숨어 있습니다.

  • Stack : 빠르게 생성되고 제거되는 실행 흐름 공간
  • Heap : 객체가 살아가는 공유 공간
  • GC : Heap을 청소하는 자동 관리자

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

컴퓨터 언어 정리  (0) 2026.05.17
Java 기초 정리  (0) 2026.05.17
'CS/Java' 카테고리의 다른 글
  • 컴퓨터 언어 정리
  • Java 기초 정리
jupeternotebook
jupeternotebook
JUPETER의 취준, 개발, 일상
  • jupeternotebook
    JUPETER의 Notebook
    jupeternotebook
  • 전체
    오늘
    어제
    • 분류 전체보기 (18)
      • CS (18)
        • 자료구조 (2)
        • 알고리즘 (0)
        • 네트워크 (0)
        • 운영체제 (0)
        • 데이터베이스 (0)
        • 코딩테스트 (12)
        • GitHub (1)
        • Java (3)
      • 개발일지 (0)
      • 이모저모 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코딩테스트
    정렬
    스택
    해시
    GC
    heap
    git
    jre
    우선순위큐
    프로그래머스
    덱
    jvm
    해시셋
    jdk
    힙
    해시맵
    java
    stack
    프로그래밍언어
    메모리
    큐
    자료구조
    github
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
jupeternotebook
Java의 메모리 관리
상단으로

티스토리툴바