Garbage Collection이 JVM에서 어떻게 작동하는지, 서로 다른 가비지 컬렉터들의 특징과 성능 차이에 대해 알아보자
JVM is a program that looks like a machine to the programs written to execute in it.
JVM은 그 안에서 실행되도록 작성된 프로그램에게 기계처럼 보이게 하는 프로그램이다.
운영체제 메모리 영역에 접근하여 메모리를 관리하는 프로그램
모든 프로그램은 실행을 위해 메모리를 할당받아 사용하며, 사용이 끝난 메모리는 시스템에 반환되어야 한다.
C, C++
등 가비지 컬렉션이 없는 언어는 할당했던 메모리를 반환하지 않는다.
시스템의 모든 RAM을 사용하고 프로그램과 컴퓨터가 머물 수도 있다.
메모리가 해제된 후 포인터를 통해 버퍼를 읽고쓰려 시도할때 무작위의 결과가 발생할 수 있다.(Dangling Pointer)
버퍼 오버런, 문자열 조작이 발생 할 수 있다.
⇒ 이러한 이유로 로그래머가 수동으로 메모리 할당과 해제를 일일이 해줘야 했었다.
파이썬, 자바스크립트, Go 언어 등많은 프로그래밍 언어에서 가비지 컬렉션이 기본으로 내장
JVM Heap 영역에서 사용하지 않는 객체를 삭제하는 프로세스
Garbage collection was invented to simplify manual memory mangagement.
동적으로 할당된 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능
Java에서는 메모리 할당 해제 프로세스가 가비지 컬렉터에 의해 자동으로 처리된다.
> "메모리가 5배 더 많다면 성숙한 비복사 공간이 있는 아펠(Appel)식 세대별 컬렉터의 성능은 도달 가능성 기반의 명시적 메모리 관리의 성능과 대등하다. 메모리가 3배 더 많다면 컬렉터의 실행 성능은 명시적 메모리 관리에 비해 평균 17% 느리다. 메모리가 2배인 경우 가비지 컬렉션의 성능은 70% 가까이 하락한다. 물리적 메모리가 부족하면 페이징으로 인해 가비지 컬렉션의 속도는 명시적 메모리 관리에 비해 훨씬 더 느리게 된다.
>
>
> [매튜 허츠와 에머리 D. 버거의 2005년 논문](https://people.cs.umass.edu/~emery/pubs/gcvsmalloc.pdf)
>
> !http://linkback.itworld.co.kr/images/onebyone.gif?action_id=e8e4beee07c904b8d7dde7c56153d87
>
> !http://linkback.itworld.co.kr/images/onebyone.gif?action_id=bf7c84ffcaf5b2a97163d6a70229b07
>
가비지 컬렉션(Garbage Collection)은 어떤 Object를 Garbage로 판단해서 스스로 지워버릴까?
= 메서드가 끝나는 등의 특정 이벤트로 Heap영역 객체의 메모리 주소를 가진 참조 변수가 삭제가 되면 Heap 영역에서 어디서도 참조하고 있지 않은 객체들이 발생 ⇒ 이 Object들을 주기적으로 제거
JVM의 Heap 영역은 동적으로 레퍼런스 데이터가 저장되는 공간으로서, GC에 대상이 되는 공간이다.
하나의 Heap 영역을 세부적으로 쪼개 객체의 생존기간을 세밀하게 제어
Heap 영역 설계 전제 'weak generational hypothesis’
즉 객체는 대부분 일회성이고, 메모리에 오래 남아있는 경우는 드물다
Heap 영역 구분
Young Generation
: 새로운 객체들이 할당되는 영역Old Generation
: Young Generation 오래동안 살아남은 객체들이 존재하는 영역Young Generation에서의 GC
Old Generation에서의 GC