Real My SQL 4장에 등장한 CS 용어 정리
교착상태?
두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태
교착 상태가 발생할 수 있는 조건
-
상호 배제
-
점유와 대기
-
비선점
-
원형 대기
프로세스들이 원의 형태로 자원을 대기하는 것
교착 상태 해결 방법
-
예방
교착 상태의 발생 조건 중 하나를 충족하지 못하게 하는 방법
-
회피
교착 상태가 발생하지 않을 정도로만 자원을 할당하는 방식
-
검출 후 회복
교착 상태 발생을 인정하고 사후에 조치하는 방식이다.
- 선점을 통한 회복
- 프로세스 강제 종료를 통한 회복
객체를 런타임에 표현하는 방법
- 런타임에 oop 라는 구조체로 자바 객체를 나타낸다.
- 참조형 변수 안에 위치
- 스택 프레임으로부터 힙 영역 내부를 가리킨다.
- instanceOop
- oop를 구성하는 여러 자료구조 중 하나
- 자바 클래스의 인스턴스를 나타낸다.
- 메모리 레이아웃
- header (
Mark 워드
+ Klass 워드
) Mark 워드 : 인스턴스 관련 메타데이터 가리키는 포인터 Klass 워드 : 클래스 메타데이터를 가리키는 포인터
삼색 마킹(tri-color making) 알고리즘
작동 원리
- GC 루트를 흰색 표시한다.
- 다른 객체는 모두 흰색 표시한다.
- 마킹 스레드가 회색 노드로 랜덤하게 이동한다.
- 이동한 노드를 검은색 표시하고 이 노드가 기리키는 모든 흰색 노드를 회색 표시한다.
- 회색 노드가 하나도 남지 않을 때까지 위 과정을 되풀이한다.
- 검은색 객체는 모두 접근 가능(reachable)한 것이므로 살아남는다.
- 흰색 노드는 더 이상 접근 불가한 객체이므로 수집 대상이 된다.
Concurrent Mark Sweep
- 동시 수집은 SATB (snapshot at the beginning) 일단 스냅샷 뜨기 라는 기법을 적극 활용한다.
- 수집 사이클을 시작할 때 접근 가능하거나
- 그 이후에 할당된 객체를 라이브 객체로 간주하는 것
- 단점
- 변경자 스레드가 수집을 하는 도중에 검은색 상태, 수집을 안 하는 동안에는 흰색 상태로 객체를 생성할 수 있다.
- 변경자 스레드가 변경한 것 대문에 라이브 객체가 수집되는 현상을 방지하려면 몇가지 로직이 더 추가돼야 한다.
G1 힙 레이아웃 및 영역
- G1 힙은 region 으로 구성된다.
- 에덴, 서바이버 영역으로 이루어진 영 세대 개념은 같지만, 세대를 구성하는 영역이 연속되어 있지 않다는 차이점이 있다.
- G1 수집기가 하는 일
- 동시 마킹 단계를 이용
- 방출 수집기다
- 통계적으로 압착한다.
Collector 종류
-
serial collector
싱글 스레드에서 동작하는 GC
-
concurrent collector
어플리케이션 스레드와 GC 스레드가 동시에 동작한다.
STW 는 mark/re-mark 시에만 발생한다.
-
parallel collector
멀티 CPU를 사용해 mark/sweep 을 수행한다.
Old 영역에서 GC 를 병렬로 처리한다.
언제 무엇을?
- CMS
- 메모리가 많을 때
- CPU 가 많을 때
- 응답 시간이 짧아야 할 때
- 병렬 수집기
- 메모리가 적을 때
- CPU 수가 적을 때
- STW 시간을 어느 정도 허용하면서 높은 처리량이 필요한 App일 때
GC 장점 & 단점
장점
- 메모리 누수 방지
개발자의 실수로 인해 메모리 할당 해제를 누락하는 경우나, 메모리 관리를 잘하지 못하는 상황으로 인한 메모리 누수를 방지해준다.
- 해제된 메모리에 접근 방지
- 해제한 메모리 또 해제 방지
단점
- stop the world : GC 작업은 순수 오버헤드
- 개발자는 언제 GC 가 메모리를 해제하는지 모름
GC 의 원칙
- GC 알고리즘은 모든 가비지는 반드시 회수해야 한다.
- 살아있는 객체를 회수해서는 안된다.
GC 용어
- allocated list, 할당 리스트 : 할당했지만, 아직 회수되지 않은 객체를 가리키는 포인터를 저장하는 리스트
- free list, 프리 리스트 : 동적 메모리 할당을 위해서 계획적으로 사용된 자료 구조로,
메모리의 할당되지 않은 영역들을 연결 리스트로 연결해서 운용한다.
- STW : GC 사이클이 발생하여 가비지를 수집하는 동안에는 모든 어플리케이션 스레드가 중단된다.
STW 하는 이유 : GC 수행동안 어플리케이션 코드가 힙 상태를 변경하면 안되기 때문에?
- 동시 : GC 스레드는 어플리케이션 스레드와 동시 실행될 수 있다. CMS 사실상 준 동시 수집기(mostly concurrent)
- 병렬 : 여러 스레드를 동원해서 가비지 수집을 한다.
- 정확 : 정확한 GC 스킴은 전체 가비지를 한방에 수집할 수 있게 힙 상태에 관한 충분한 타입 정보를 지니고 있다.
- compaction : 살아남은 객체는 GC 사이클 마지막에 연속된 단일 영역으로 배열된다. 메모리 단편화를 방지한다.
- 방출 : 수집 사이클 마지막에 할당된 영역을 완전히 비우고 살아남은 객체는 모두 다른 메모리 영역으로 이동한다.