JAVA 메모리 관리

wjd15sheep·2024년 3월 22일

JAVA

목록 보기
2/2

이전 글에서 컴파일과 런타임에 대해서 자세하게 알아보았다면 이번 글에서는 JAVA가 어떻게 메모리를 관리하는지에 대해 알아보겠습니다.

1. Heap 이란?

객체와 배열이 저장되는 곳으로, 자바 런타임 중에 동적으로 할당됩니다. 힙 영역을 세분화되어 Young 영역과 Old 영역으로 나뉘며, 객체의 생면주기에 따라 관리가 됩니다.

아래 이미지는 Heap 영역 이미지 입니다.

Heap 영역을 보면 Young Generation과 Old Generation 그리고 Permanent 영역으로 나누어져 있습니다.

  • Young Generation 부분은 Eden과 Survivor 영역이 존재합니다.
  • Old Generation 부분은 말 그대로 오랫동안 사용된 객체가 위치힙니다.
  • permanent 영역은 계속 사용되는 객체가 위치하고 있습니다.

1.2 Eden 영역

처음 객체가 생성이 된다면 Eden 영역에 위치힙니다.
Eden 영역이 가득차면 Minor GC(Garbage Collection)이 발생하며 여기서 살아남은 객체들은 Survivor 영역으로 이동합니다.

Minor GC: Eden 영역에서 발생하는 GC로, 살아남은 객체들을 Survivor 영역으로 이동시키고, 참조되지 않는 객체들은 메모리에서 제거합니다.

1.3 Survivor 영역

Survivor 영역은 두 개(Survivor1, Survivor2 또는 From, To)가 있으며, Minor GC가 발생할 때마다 살아남은 객체들이 한 영역에서 다른 영역으로 이동합니다. 이 과정을 통해 더 오래 살아남은 객체들은 점차 Old 영역으로 이동하게 됩니다.

1.4 Old 영역

Old 영역은 Young영역(Eden 영역 및 Survivor 영역)에서 살아남은 객체들이 이동하는 곳으로 이 영역에서는 객체들이 더 오래 보관됩니다.

Major GC(Full GC): Old 영역이 가득차게 되면 Major GC 또는 Full GC가 발생합니다. Young 영역에서 발생하는 Minor GC 보다 오래걸리고 애플리케이션 성능에 영약을 줍니다.

1.5 permanent 영역

JVM에서 사용되던 메모리 영역입니다. 클래스의 메타데이터, 메소드의 메타데이터, 문자열 상수 등 JVM이 실행에 필요로 하는 데이터를 저장하는데 사용됩니다.
고정된 크기를 가진 정적인 데이터를 저장합니다.
가비지 컬렉션의 대상이 될 수 있지만 이 영역에서 발생하는 가비지 컬렉션은 다른 영역에 비해 빈도가 낮습니다.

2. 가비지 컬렉션(Garbage Collection)

자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체(garbage)를 모아 주기적으로 제거하는 프로세스를 말합니다.
C / C++언어에서는 이러한 가비지 컬렉션이 없어 프로그래머가 수동으로 메모리 할달과 해제를 일일이 해줘야 했습니다.

메모리 관리, 메모리 누수(Memory Leak) 문제에서 대해 관리하지 않아도 되어 오롯이 개발에만 집중할 수 있도록 해줍니다.

또한 가비지 켈렉션(GC)는 꼭 자바(Java)에만 있는 개념이 아닙니다.
파이썬, 자바스크립트, Go 언어 등 많은 프로그램밍 언어에서 가비지 켈렉션이 기본으로 내장되어 었다. 또한 브라우저 역시 가비지 켈렉션을 가지고 있습니다.

단점 :
메모리가 언제 해제되는지 정확하게 알 수 없어 제어하기 힘듭니다.
가비지 켈렉션(GC)이 동작하는 동안에는 다른 동작을 머추기(Stop-The-World) 때문에 오버헤드가 발생되는 문제점이 있습니다.

2.2 Stop-The-World

가비지 켈렉터(GC)가 동작하는 동안 애플리케이션의 모든 작업을 멈추게 하는 현상입니다.
GC는 객체의 주소값을 가지고 있는 변수가 없으면, GC는 해당 객체에 접근할 수 없다고 판단하여 메모리에서 제거합니다.
동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능을 가진 GC는 필요 없는 인스턴스를 처리하기 전에 반드시 Stop-the-World를 실행합니다.
Heap 영역은 스택에서 공통적으로 사용하는 객체들이기 때문에 변경이 생기기 전에 모든 동작을 정지합니다.

그로인하여 GC가 너무 자주 실행되면 소프트웨어 성능 하락의 문제가 생긴다.

2.3 가비지 켈렉션 Mark And Sweep

Mark-Sweep이란 다양한 GC에서 사용되는 객체를 솎아내는 내부 알고리즘이다.

  • Mark 단계
    가비지 컬렉터(GC)는 루트 집합에서 시작하여 참조되는 개체들을 따라가며, 도달 가능한 객체를 마킹합니다. 이 과정에서 도달 가능한 모든 객체는 '살아있는 것'으로 표시됩니다.

루트 집합은 가비지 켈렉션의 시작점으로 스택에 있는 지역 변수나 전역 번수 등이 이에 해당합니다.

  • Sweep 단계
    마킹 단계에서 살아남은 객체들을 제외한 나머지 객체들은 메모리에서 제거됩니다. 이 과정을 통해 실제로 사용되지 않는 메모리 공간이 회수됩니다.

스위핑 단계를 통해 회수된 메모리 공간은 새로운 객체가 생성될 때 재활용됩니다. 이로써 메모리의 효율적인 사용이 가능해집니다.

가비지 켈렉터의 성능과 알고리즘 선택은 애플리케이션의 성능에 영향을 미칩니다. 따라서 가비지 켈력션에 대한 이해는 메모리 관리와 애플리케이션 성능 최적화에 있어 매우 중요합니다.


참조

profile
성장 위해 노력하는 웹 개발자 주니어

0개의 댓글