GarbageCollection 4

[Java] Garbage Collection(4) - Young Generational GC, Old Generational GC

Young Generational GC 이번에는 Eden 영역에 대해 더 알아보자. 참고로 HotSpot VM에서는 보다 빠른 메모리 할당을 위해서 2가지 기술을 사용한다. 첫 번째는 bump-the-pointer라는 기술이고, 두 번째는 TLABs(Thread-Local Allocation Buffers)라는 기술이다. bump-the-pointer는 Eden 영역에 할당된 마지막 객체를 추적한다. 마지막 객체는 Eden 영역의 맨 위(top)에 있는데, 다음에 생성되는 객체가 있으면 해당 객체의 크기가 Eden 영역에 넣기 적당한지만 확인한다. 만약 해당 객체의 크기가 적당하다고 판단되면 Eden 영역에 넣게 되고 새로 생성된 객체가 맨 위에 있게 된다. 따라서 새로운 객체 생성 시 마지막에 추가된 ..

Java 2022.04.14

[Java] Garbage Collection(3) - Generational GC

Generational GC GC는 다음의 2가지 가정에 따라 만들어졌다. 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다. 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다. 이러한 가설을 Weak Generational Hypothesis라고 한다. 실제 통계로도 생성된 객체의 98%의 객체가 곧바로 쓰레기 객체가 된다고 한다. 이 가설의 장점을 최대한 살리기 위해서 HotSpot VM에서는 크게 2개로 물리적 공간(Young / Old)으로 나누었다. 이러한 경험적 사실들을 바탕으로 Generational GC가 디자인되었다. 우선 2번째 가설에 대해 살펴보면, Old 영역에는 512 Bytes의 덩어리(chunk)로 되어 있는 카드 테이블이 존재한다. 카드 테이블에는 ..

Java 2022.04.13

[Java] Garbage Collection(2) - 포인터 추적 방식

포인터 추적 방식 포인터 추적 방식이란 한 개 이상의 변수가 접근 가능한 메모리는 앞으로 사용할 수 있는 메모리로 간주하고 그 밖의 메모리를 해제하는 방식을 의미한다. 대부분의 GC는 포인터 추적 방식을 사용한다. 포인터 추적 방식의 종류 포인터 추적 방식에는 여러 가지 방법이 존재하는데 그 종류를 살펴보자. 표시하고 쓸기(Mark and Sweep) 표시하고 쓸기는 가장 단순한 방식이다. 먼저 각 메모리 할당 영역에 표시를 위해 1 비트의 메모리를 남겨둔다. 표시 단계에서 모든 변수가 가리키는 영역을 사용 중으로 표시하고 그 영역에서 가리키는 영역 또한 사용 중으로 표시한다. 이처럼 모든 메모리 영역을 표시하고 나면 표시되지 않은 영역은 접근 불가능한 메모리 영역이 된다. 접근 불가능한 메모리 영역들은..

Java 2022.04.12

[Java] Garbage Collection(1) - 개요

Garbage Collection이란? Garbage Collection이란 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요 없게 된 영역을 해제하는 것이다. JVM 메모리 구조 GC의 종류를 살펴보기 전에 JVM 메모리 구조를 먼저 알아보자. JVM의 메모리 구조는 크게 Heap / Perm / Thread로 나눌 수 있다. Heap은 다시 Young(New) 영약과 Old 영역으로, Young 영역은 다시 Eden / Survivor1 / Survivor2로 나눌 수 있다. Young 영역은 객체가 처음 생성 시 저장되는 영역을 나타낸다. 정확히는 new 연산자를 통해 생성되는 객체들은 Eden 영역에 저장된다. Old 영역은 Young 영역에 존재하던 객체들이 ..

Java 2022.04.11