코드 그라데이션

Heap 영역에 대해 ++ 본문

백엔드 면접

Heap 영역에 대해 ++

완벽한 장면 2024. 3. 29. 18:59

Heap 영역의 관리

관리는 크게 세 가지 구조적인 부분으로 나눌 수 있다.

 

 

새로운 객체 할당

  • 객체가 생성될 때, 힙 영역에 메모리 공간을 할당한다.
  • 객체의 크기에 따라 동적으로 메모리를 할당하며, 할당된 메모리는 객체의 데이터와 함께 초기화된다.

 

객체 사용 및 참조

  • 생성된 객체는 프로그램의 다른 부분에서 참조됩니다.
  • 이때, 힙 영역 내부에는 객체의 주소를 참조하는 레퍼런스 변수들이 존재합니다.
  • 여러 레퍼런스 변수가 동일한 객체를 참조할 수 있으며, 객체의 필드나 배열 요소 등을 통해 객체 내부의 데이터에 접근할 수 있습니다.

 

가비지 컬렉션 (Garbage Collection)

  • 힙 영역에서는 더 이상 참조되지 않는 객체들이 가비지 컬렉션에 의해 정리된다.
  • 가비지 컬렉터는 주기적으로 실행되거나 힙 영역이 꽉 찼을 때 동작하여 더 이상 참조되지 않는 객체를 식별하고 제거한다.
  • 이렇게 해제된 메모리는 다시 새로운 객체가 할당될 때 사용될 수 있다.

 

힙 영역은 크게

- Young Generation

- Old Generation

- Permanent Generation (Java 7 이전) 또는 Metaspace (Java 8 이후) 의 세 부분으로 나뉠 수 있다.

 


Heap 영역의 구성요소

Young Generation (젊은 세대)

  • Young Generation은 새로 생성된 객체들이 할당되는 공간이다.
  • 이 영역에서는 Eden 영역과 두 개의 Survivor 영역(S0, S1)으로 나뉜다.
  • 새로운 객체는 Eden 영역에 할당되며, 첫 번째 가비지 컬렉션 후 살아남은 객체는 하나의 Survivor 영역으로 이동한다.
  • 계속해서 가비지 컬렉션이 발생하며, 살아남은 객체들은 계속해서 다른 Survivor 영역으로 이동하고, 일정 횟수 이상 살아남은 객체는 Old Generation으로 이동한다.

 

Old Generation (늙은 세대)

  • Old Generation은 Young Generation에서 일정 기간 동안 살아남은 객체들이 이동하는 영역이다.
  • Young Generation에서 가비지 컬렉션을 여러 차례 거친 객체 중 살아남은 객체들은 Old Generation으로 이동하게 됩니다.
  • 이 영역은 상대적으로 큰 메모리 공간을 가지며, 오랜 시간 동안 살아남은 객체들이 저장됩니다.
  • 주기적으로 가비지 컬렉션이 발생하여 Old Generation에서 더 이상 사용되지 않는 객체를 정리합니다.

 

Permanent Generation (Java 7 이전) 

  • Permanent Generation은 클래스 메타데이터, 정적 변수(static variable), 상수 등의 정보를 저장하는 영역이었다.
  • 클래스로더에 의해 로드된 클래스와 관련된 정보들이 여기에 저장됐다.
  • 그러나 Permanent Generation의 크기가 고정되어 있어 클래스 로딩이나 어플리케이션의 동적인 특성에 대해 적응하기 어려웠고, 이로 인한 문제들이 존재했다

 

Metaspace (Java 8 이후)

  • Java 8부터는 Permanent Generation이 Metaspace로 대체되었다.
  • Metaspace는 힙 영역이 아니라 네이티브 메모리에 할당되며, 클래스 메타데이터와 관련된 정보를 저장한다.
  • Metaspace는 동적으로 크기를 조절할 수 있어, Permanent Generation에서 발생했던 메모리 부족 문제 등을 해결했다.
  • 클래스 로딩이나 어플리케이션의 동적 특성에 더 적응적으로 동작한다.

 

 

728x90

'백엔드 면접' 카테고리의 다른 글

APM과 부하 테스트  (0) 2024.04.01
GC와 JVM에 대해서  (0) 2024.03.30
JVM Runtime data area +  (0) 2024.03.28
JVM 기본 구조(2)  (0) 2024.03.27
JVM 기본 구조 (1)  (0) 2024.03.27
Comments