배민 유투브를 통해 봤던 내용들을 정리합니다.
자바가 기준입니다.
Garbage Collection
JVM의 heap영역에서 사용하지 않는 객체를 삭제하는 프로세스
힙 영역에는 Object타입의 객체들이 들어간다.
GC Root
gc root는 stack의 데이터들, method영역의 static데이터, jni에 의해 생성된 객체들이 된다.
gc root -> heap으로 찾아서 없앤다
어떻게 garbage를 찾을까유
mark and sweep, compact
- GC root에서부터 참조하는 객체들을 하나씩 찾아간다
- reachable object, unreachable object를 찾아서 사용중인 객체들을 mark한다
- unreachable 객체를 sweep(삭제)한다
- reachable한 객체들을 한곳에 몰아서 메모리를 관리한다 compact
GC 실행과정
meta space : gc시에 필요한 것들이 쌓임
suvivor1이 있으면 0이 비어져있어야하고 0이 있으면 1이 비어져야한다 -> rolling?
- 새로운 객체는 young generation에 할당된다.
- minor gc 발생
- mark
- unreachable은 eden에서 지워지고 suvivor1에 할당(순서상관없음)
- 다시 young generation에 객체들이 쌓이고
- minor gc발생
- mark
- unreachable은 eden에서 지워지고 suvivor1에 할당된 객체들과 young generation의 reachable객체들이 suvivor0으로 이동
- minor gc가 발생될때마다 살아남은 객체들의 값이 1씩 증가
- 오브젝트 값들이 특정 임계점이 넘으면 old generation으로 이동 promoted
- 이때 old generation이 꽉차면 major gc가 일어난다
왜이렇게 구찮게...?
1. 대부분의 객체는 금방 접근 불가능한 상태가 된다.
: young generation은 빨리빨리 gc가 일어나서 비워줘야한다
2. old generation의 객체들은 young generation을 참조할 가능성이 적다.
: old는 가끔해도 돼
stop-the-world
gc를 실행하기 위해 gc를 실행하고 있는 스레드를 제외한 모든 스레드를 멈추는 것
- setial GC : 싱글
- parallel GC: java8 멀티스레드
- parallel old gc : old 영역까지 멀티스레드
- cms gc: compact과정이 없음
- g1 gc(garbage first) : 힙 영역을 region으로 나누고 전체 힙이 아닌 region단위로 탐색 후 compact진행 할당된 region에 대해서만 gc를 실행한다.
'etc' 카테고리의 다른 글
카프카가 실패시 처리하는 방법 (0) | 2021.04.01 |
---|---|
Master the JavaScript Interview: What is Functional Programming? (0) | 2020.10.30 |