Open bsj805 opened 2 years ago
JVM has five types of GC implementations:
Serial Garbage Collector Parallel Garbage Collector CMS Garbage Collector G1 Garbage Collector Z Garbage Collector
가장 간단한 GC로, single thread에서 돈다.
이게 실행될 때 모든 어플리케이션 thread가 멈춘다.
멀티쓰레드 환경에서는 쓰기 좋지 않다.
java -XX:+UseSerialGC -jar Application.java
이런식으로 실행
1번과 다르게, heap space 관리를 위해 multiple thread를 사용한다. 하지만 여전히 다른 모든 어플리케이션 thread를 정지시켜야 GC를 할 수 있다. 이 GC에서는
java -XX:+UseParallelGC -jar Application.java
Concurrent Mark Sweep (CMS)는 여러 garbage collector thread를 써서 GC를 한다.
GC pause가 적어야 하는 어플리케이션이나, 어플리케이션 실행 중에도 프로세서를 GC와 같이 쓸 수 있는 경우를 위해 디자인 됐다.
이 GC는 concurrent하게 일어난다.
java -XX:+UseParNewGC -jar Application.java
JAVA 9 버전부터 deprecated
JAVA 14 버전부터 지원안함
G1 (Garbage First) garbage collector는 멀티 프로세서와 큰 메모리 공간을 가진 machine에서 실행되는 어플리케이션을 위한 것이다. JDK7버전부터 사용가능하고, CMS보다 performance가 좋다. G1 collector는 heap을 같은 사이즈의 heap region으로 나누어서, 각각을 연속된 가상 메모리 공간으로 사용한다. G1은 Marking phase를 먼저 실행해 object의 liveness를 파악하고,빈 공간으로 sweeping( 다른 오브젝트를 모은다)을 진행한다. 그래서 garbage first이다. java -XX:+UseG1GC -jar Application.java
같은 String을 표현하는데 global single char[] array를 쓰게 함으로써 heap을 optimize한다.
add -XX:+UseStringDeduplication
as a JVM parameter.
ZGC는 java11에 나와서, java15부터 사용되는 scalable low-latency garbage collector이다. ZGC는 모든 expensive work를 concurrently하게 진행한다.
G1 GC처럼 heap을 나누지만, 각각이 다른 사이즈일 수 있다.
To enable the Z Garbage Collector, we can use the following argument in JDK versions lower than 15:
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC Application.java
From version 15 on, we don't need experimental mode on:
java -XX:+UseZGC Application.java
ZGC가 default GC가 아니다. JAVA 11부터 쭉 G1GC가 default
https://www.baeldung.com/jvm-garbage-collectors