Garbage Collection(2)


2. garbage collection 과정

1) mark, sweep

garbage collection 과정(알고리즘)은 mark, sweep, compact 작업으로 구성된다.




2) young generation / old generation

예를 들어서, 생성된 java 객체가 시간이 지나면 쓰레기(garbage)가 되어 청소(garbage collection) 대상이 된다고 상상해 보자.
생성된 객체의 대부분은 짧은 시간 안에 쓰레기가 된다. -> 이런 특징을 또 이용해서 영역을 나눈다.

효율적인 쓰레기 청소를 위해서,
메모리 영역을 young generation 영역과 old generation 영역으로 나눈다.

객체를 처음 생성할 때 young generation 영역에 생성한다.
생성된 대부분의 객체는 금방 쓰레기가 되기 때문에, young generation 영역은 자주 청소(garbage collection) 해야 한다.

young generation 영역에서 정해진 시간 이상 제거되지 않고 오래 살아남은 객체는,
old generation 영역으로 옮겨 놓는다.

old generation 영역으로 옮겨진 객체들은, 비교적 오래 생존할 확률이 높다.
따라서 old generation 영역은 자주 청소할 필요가 없고, 가끔 청소하면 된다.


3) minor garbage collection / major garbage collection

young generation 영역은 자주 청소해야 한다. 이것을 minor garbage collection 이라고 부른다.

아주 가끔 old generation 영역과 young generation 영역을 전부 대청소 해주어야 한다.
이것을 major garbage collection 혹은 full garbage collection 이라고 부른다.


4) card table

old ganeration 영역의 객체의 멤버 변수가, young generation 영역의 객체를 참조하는 경우는 드물다.
(오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재하기 때문)

old ganeration 영역의 객체의 멤버 변수에 의해서 참조되는 객체는, garbage가 아니다.
따라서 young generation 영역을 청소할 때,
old generation generation 영역의 객체의 멤버 변수들도 다 뒤져서 mark 해야 하는데, 이 작업에 시간이 많이 걸린다.

young generation 영역은 자주 garbage collection 해야 하는데,
그때마다 old generation 영역의 멤버 변수들을 전부 뒤지는 것은 부담이다.

그래서 다음과 같은 방법을 사용한다.
old generation 영역의 멤버 변수가 young generation 영역의 객체를 참조하는 경우에,
이 정보를 card table에 기록한다.


이 card table 기록 방법의 장단점은 다음과 같다.

단점의 손해 보다, 장점의 이익이 훨씬 크기 때문에, card table 기록을 사용하여 garbage collection 한다.


5) Heap 영역 구조

스크린샷 2020-03-25 오후 1 41 48

Java8 부터는 Metaspace를 Heap 영역의 일부로 보지 않고, 독립된 영역으로 본다.




3. young generation 영역의 garbage collection 과정

1) eden 영역, survivor 영역

young generation 영역은 한 개의 eden 영역과 두 개의 survivor 영역으로 나뉜다.
두 survivor 영역을 각각 survivor0, survivor1 라고 하자.

처음 실행할 때, eden 영역과 두 survivor 영역이 전부 빈 상태이다.

생성되는 객체는 처음에 eden영역에 위치한다.





2) old generation 영역으로 승진



3) copying collector

young generation 영역의 garbage collection 작업을 담당하는 엔진을, copying collector 라고 부른다.
young generation 영역의 GC는 mark 작업과 copy 작업으로 구성된다.




4. Java Garbage Collector 종류

Java VM(Virtual Machine) 내부에서 garbage collection 작업을 수행하는 엔진을 garbage collector라고 부른다.
Java VM 내부에 garbage collector가 여러 개 구현되어 있고,
Java VM을 실행할 때 command line parameter로 garbage collector를 선택할 수 있다.


1) Serial Garbage Collector

CPU 코어 수가 1개일 때, serial GC가 사용된다.
minor GC, magor GC 둘 다 싱글 스레드로 실행된다.
compact 작업까지 수행한다.

CPU가 많은 서버에서도 serial GC를 사용하기도 하는데, 서버 한 대에 JVM 여러 개를 동시에 실행하는 경우다.
서버 운영체제에서 JVM 한 개는, 하나의 운영체제 프로세스(process)로 실행된다.
하나의 운영체제 프로세스 내부에 스레드가 여러 개 생성될 수 있다.
즉 서버 한 대에 여러 개의 JVM 프로세스가 실행되는 경우에, 각 JVM 내부에서는 serial GC를 사용하기도 한다.

JVM 프로세스 뿐만 아니라, 다른 프로세스들도 같이 실행되는 서버에서,
JVM 프로세스가 CPU 코어를 독점하는 것을 막기 위해, serial GC를 선택할 수 있다.





2) Parallel Garbage Collector

young generation영역의 garbage collection을 멀티 스레드로 실행한다.
CPU 코어가 여러 개인 경우에, parallel GC가 디폴트로 선택되고, 코어 수 만큼의 스레드로 GC를 수행한다.

parallel GC 는 parallel GC 와 parallel Old GC 로 나뉜다.

young generation 영역의 GC를 멀티 스레드로 실행하는 것은 parallelGC 와 parallelOldGC 에서 공통이다.
young generation 영역의 GC = mark + copy
mark + copy 작업은 멀티 스레드로 실행될 수 있다.





3) Concurrent Mark Sweep Collector

Concurrent Mark Sweep Collector에서 앞글자만 따서 CMS collector라고 부른다.
concurrent low pause collector 라고 부르기도 한다.
GC 작업 동안의 정지(stop-the-world) 기간을 최대로 줄이기 위해 선택한다.
GC 작업 동안 애플리케이션 스레드도 같이 실행될 수 있도록 고안된 GC 이기 때문에, 정지 기간이 매우 짧다.

CMS GC는 총 6단계의 작업으로 구성되는데, 이 중에서 2 단계만 애플리케이션이 정지되고,
4 단계에서는 애플리케이션 스레드와 GC 스레드가 동시에 실행된다.

GC 작업이 애플리케이션 스레드와 동시에 진행될 수 있어야 하기 때문에,
GC 작업이 약간 비효율적으로 진행된다.
이 비효율 때문에, 정해진 시간 동안 처리한 작업 양을 비교하면, CMS GC가 parallel GC 보다 뒤쳐진다.
그리고 comat 작업을 포함하지 않아서, 메모리도 낭비된다.

정해진 시간 동안 처리한 작업 양 = throughput






4) G1 Garbage Collector

G1 garbage collector는 Java7 부터 제공된다.
장기적으로 CMS collection를 대체하려고 개발된 GC이다.
4GB 이상 크기의 heap에 대한 효율적인 GC를 위해서 개발되었다.

full stop-the-world collection 작업 필요한 상황의 발생 확률이 CMS GC 보다 낮다.
CMS GC와는 달리 compat 작업을 포함한다.


5) JVM 프로세스 수



6) Java VM command line paramter

Java VM(Virtual Machine)을 실행하기 위한 java.exe 명령의 command line parameter 중에서
메모리 설정과 관련된 것들은 다음과 같다.