Java 8 이후 Heap 메모리 구조의 이해와 변화

기훈·2025년 4월 22일

Java

목록 보기
2/6

자바8 버전을 기점으로 힙메모리 구조가 변경되었다. 어떠한 점이 변경되었는지, 각 구조의 역할은 무엇인지 알아보자.


Young Generation

  1. 메모리에 객체가 생성되면 end 영역에 객체가 지정된다.

  2. eden 영역에 객체가 가득 차면 eden에 있던 객체가 s0 또는 s1에 옮겨진다. 두 영역의 우선순위는 따로 없다. 옮겨지는 객체들은 어딘가에서참조되고 있는 객체들이다. 하나의 영역이 가득 차게 되면 공간이 남아있는 한 곳으로 이동한다.
    (이러한 메커니즘 때문에 s0, s1 둘 중 하나는 항상 비워있는 공간으로 유지된다)

이 과정에서 Minor GC가 발생한다. Minor GC는 Young 영역에서 발생하는 GC로 Eden영역 또는 s0 또는 s1에서 사용되지 않는 객체들을 삭제한다.


Old Generation

  1. s0,s1에서 오랫동안 살아남은 객체들이 이동되는 영역이다. 보통 Old 영역은 Young 영역보다 크게 할당하며, GC가 Young에 비해 적게 발생한다.
    Young 영역에서 Old 영역으로 넘어가는 객체 중, Survivor 영역을 거치지 않고 Eden 영역에서 바로 Old 영역으로 넘어가는 객체도 존재하는데, 이는 객체의 크기가 아주 클 경우 발생한다. 예를들어 Survivor영역의 크기가 16MB인데 객체의 크기가 20MB일 경우에 해당한다.

  2. Old 영역에서는 2차 GC인 Major GC(FULL GC)가 일어나게 되며 GC를 진행하는 Thread를 제외하고 이외의 모든 Thread를 멈춘 상태로 GC가 진행된다. 이와 같이 GC를 진행하는 Thread 이외에 모든 Thread를 멈추는 상태를 Stop-the-world라고 하며, 어떠한 GC알고리즘을 사용하더라고 Stop-the-World 상태를 피할수는 없다.

얼마나 살아남아야 이동 될 수 있을까?

Minor GC에서 살아남은 횟수를 기록하는 age bit 를 가지고 있으며, Minor GC가 발생할 때마다 age bit 값은 1씩 증가 하게되며, age bit 값이 MaxTenuringThreshold 라는 설정값을 초과하게 되는 경우 Old Generation 영역을 객체가 이동 되는 것이다. 또는 Age bit가 MaxTenuringThreshold 초과하기 전이라도 Survivor 영역의 메모리가 부족할 경우에는 미리 Old Generation 으로 객체가 옮겨질 수도 있다.


Metaspace

자바8 이전의 Permanent라고 불리던 영역은 Java8이후 Metaspace으로 불린다. 기존의 Permanet 영역에는 다음과 같은 정보들이 저장되었다.

  • Class의 Meta Data

  • Method의 Meta Data

  • Static Object 변수, 상수

  • JVM, JIT 관련 데이터 등

이 정보들은 JVM이 아닌 OS에 의해 관리되도록 변경되었다.
즉, 자바8 이후부터 static 객체는 heap 영역이 아닌 별도의 네이티브 메모리 영역에서 관리된다.

0개의 댓글