티스토리 뷰
여태까지의 Garbage Collector는 Young영역과 Heap 영역으로 나뉘었었다.
하지만 이 Colletor는 region이라는 여러 사각형이 모인 바둑판같은 모양의 많은 영역으로
구성되어 있다.
이 region이라는 구역은 약 2천개정도로 각각 크기는 기본 1MB부터 최대 32MB까지 지정가능하다.
이 구역들이 각각 Eden, Survivor, Old의 역할을 번갈아가면서 하고,
Humongous라는 영역도 존재한다.
Young GC의 수행
1. 몇 개의 구역을 선정하여 Young 영역으로 지정
2. 이 구역에 객체가 생성되면서 데이터가 쌓인다.
3. Young 영역으로 할당된 구역에 데이터가 꽉 차면 GC를 수행한다.
4. GC를 수행하고 살아있는 객체만 Survivor 구역으로 이동시킨다.
이렇게 살아남은 객체들이 이동한 구역은 새로운 Survivor 영역이 된다.
그리고 Young GC가 발생하면 계속 이 구역에 쌓는다.
그러면서 여러번의 Young GC후에도 살아있는 객체는 Old영역으로 보낸다.
Old GC의 수행
1. 초기표시 : Old에 있는 객체에서 Survivor의 객체를 참조하는 객체를 표시
2. 기본구역스캔 : Young GC가 일어나기 전에 Old 참조를 위해 Survivor을 훑는다.
3. Concurrent 표시 : 전체 힙 영역에 살아있는 객체를 찾는다. 이 때 Young GC가 발생하면 잠시 멈춘다.
4. 재표시 : 힙에 살아있는 객체들의 표시작업을 완료한다. 이 때 Snapshot-at-type-beggining 알고리즘을
사용하며 이는 CMS GC에서 사용하는 방식보다 빠르다.
5. 청소 : 살아있는 객체와 비어있는 구역을 식별하고 필요없는 객체를 지운 다음 비어있는 구역을 초기화한다.
6. 복사 : 살아있는 객체를 비어있는 구역으로 모은다.
이 중 1,4,5,6 단계는 Stop-the-world가 발생한다.
이 콜렉터는 성능이 매우 빠르지만, 아직 안정화가 되지 않았기에
무작정 사용하면 장애를 일으킬 가능성도 있다.
'JAVA' 카테고리의 다른 글
[자바9] 자바9에서 변화될 try-with-resource문 (0) | 2015.05.09 |
---|---|
[GC] 강제로 GC시키기 (0) | 2015.04.24 |
[GC의 종류] Concurrent Mark-Sweep (CMS) Collector (0) | 2015.04.24 |
[GC의 방식] Parallel Compacting Collector (0) | 2015.04.24 |
[GC의 방식] Parallel Collector (0) | 2015.04.24 |
- Total
- Today
- Yesterday
- react
- RAMDA
- 메모리
- 날짜
- 알람
- 자료구조
- 코어
- Jackson
- 성능
- Swift 2.0
- json
- 컴퓨터 시간
- 람다
- Stream
- 리액트
- Docker
- 시간
- Java8
- gitlab
- javascript
- opensource
- 퍼포먼스
- 자바
- 자바 성능
- rambda
- Clojure
- 클로저
- 성능개선
- 프로세서
- Java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |