Java Garbage Collection의 모든것 -1편

Android Chen·2021년 11월 11일
0
post-custom-banner

가비지컬렉션이란

  • 힙 영역에 있는 더이상 사용하지 않는 메모리를 가비지라고 한다. 이러한 가비지를 JVM의 가바지 컬렉터가 알아서 정리해 준다. C언어에서 동적할당 이후 free를 선언해주는 것을 자동으로 해주는 것이다.

  • 가비지컬렉터는 메모리를 주기적으로 검사하여 정리한다.

Minor GC와 Major GC

JVM의 힙영역은 다음과 같은 두가지 전제로 설계되었다.

  • 대부분의 객체는 금방 접근 불가능한 상태가 된다.
  • 오래된 객체에서 새로운 객체로의 참조는 아주 드물게 존재한다.

즉 객체는 대부분 일회성이며 메모리에 오래 남아있는 경우는 드물다. 따라서 객체의 생존 기간에 따라 Old, Young영역으로 나뉘게 되었다. (Java8이전에는 Perm영역도 존재했다고 함)

Young 영역

  • 새롭게 생성된 객체가 할당됨
  • 대부분의 객체는 일회성이기 때문에 많은 객체들이 Young영역에 생성되었다가 사라짐
  • Young영역에 대한 가비지컬렉션을 Minor GC라고 부른다.

Old 영역

  • Young영역에서 접근 불가능한 상태로 오래 살아남아 객체가 복사되는 영역
  • 복사되는 과정에서 대부분 Young영역보다 크게 할당되며 크기가 큰 만큼 가비지는 적게 발생함
  • Old영역에 대한 가비지컬렉션을 Major GC라고 부른다.

예외케이스

  • Old 영역의 객체가 Young 영역의 객체를 참조할 경우 Young 영역에서 가비지 컬렉션이 실행될 때마다 Old영역의 객체를 모두 검사하여 확인하는 것이 비효율적이기 때문에 Young영역에서 가비지컬렉션이 실행될 때 Old영역의 512바이트의 카드테이블을 조회하여 가비지컬렉션 대상인지 식별할 수 있다.

가비지컬렉션의 동작 방식

Old, Young영역은 다른 구조이지만 공통적으로 아래와 같은 단계를 거친다.

[1] STOP THE WORLD

  • 가비지컬렉션 실행을 위해 JVM이 애플리케이션의 실행을 멈추는 과정이다. GC가 실행될 때는 GC를 실행하는 쓰레드를 제외한 모든 쓰레드의 작업이 중단되고 GC가 완료되면 작업이 재개된다.

[2] MARK AND SWEEP

  • Mark : 사용되는 메모리와 사용되지 않는 메모리를 식별한다.

  • Sweep : Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제한다.

Minor GC의 동작방식 부터 다음편에 살펴보도록 하자

profile
https://github.com/Userz1-redd
post-custom-banner

0개의 댓글