hyeonga_code

JVM_14_Space Reclamation 본문

JVM

JVM_14_Space Reclamation

hyeonga 2024. 5. 10. 07:59
반응형

 

 

JVM_17_GC 다시 알기 (수정사항)

1. GC 는 reachable 만 남기는 것GC 이름대로 unreachable이 중요한 것이 아니라 reachable한 객체를 어떻게 남기는 지가 중요한 것살아있는 객체를 어떻게 살릴것인지가 관건입니다.Oracle의 GC 개발자가 만

hyeonga493.tistory.com

 

Space Reclamation

Young 영역과 Old 영역을 구분하지 않고 힙 영역에 저장되어 있는 객체들을 상대로 메모리를 회수해 가는 과정입니다.

Old 영역에 여유 공간이 있는 경우 지워야 하는 객체가 있어도 메모리를 회수하지 않고 종료합니다.

G1 GC 는 애플리케이션이 동작하는 도중에 여유 공간이 충분하지 않은 경우 `Stop-the-World` 를 발생시키고 Major GC를 발생시켜 메모리를 압축하고 여유 공간을 확보합니다.

import java.util.*;

public class G1GCDemo {
    public static void main(String[] args) {
        // 메모리 사용을 위해 큰 사이즈의 배열을 반복적으로 생성
        for (int i = 0; i < 1000; i++) {
            int[] array = new int[1000000]; // 대략 4MB 크기
            try {
                Thread.sleep(10); // 약간의 딜레이를 줘서 GC의 작동을 관찰
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                System.out.println("Thread was interrupted, Failed to complete operation");
            }
            System.out.println("Generated " + (i + 1) + " arrays");
        }
    }
}

 

 

GC 컬렉션 로그 활성화 예시 (Jshell)


jshell -J-XX:+UseG1GC -J-Xlog:gc
더보기
> jshell -J-XX:+UseG1GC -J-Xlog:gc
[0.008s][info][gc] Using G1
[0.132s][info][gc] GC(0) Pause Young (Normal) (G1 Evacuation Pause) 3M->1M(8M) 1.961ms
[0.170s][info][gc] GC(1) Pause Young (Normal) (G1 Evacuation Pause) 2M->1M(8M) 1.798ms
[0.204s][info][gc] GC(2) Pause Young (Normal) (G1 Evacuation Pause) 2M->1M(8M) 1.124ms
[0.386s][info][gc] GC(3) Pause Young (Normal) (G1 Evacuation Pause) 2M->1M(8M) 1.797ms
[0.398s][info][gc] GC(4) Pause Young (Normal) (G1 Evacuation Pause) 2M->1M(10M) 1.342ms
[0.584s][info][gc] GC(5) Pause Young (Normal) (G1 Evacuation Pause) 3M->2M(10M) 1.216ms
[0.636s][info][gc] GC(6) Pause Young (Normal) (G1 Evacuation Pause) 4M->2M(10M) 1.797ms
[0.672s][info][gc] GC(7) Pause Young (Normal) (G1 Evacuation Pause) 4M->3M(10M) 1.816ms
[0.743s][info][gc] GC(8) Pause Young (Normal) (G1 Evacuation Pause) 5M->4M(12M) 1.863ms
[0.788s][info][gc] GC(9) Pause Young (Normal) (G1 Evacuation Pause) 6M->5M(12M) 2.059ms
[0.809s][info][gc] GC(10) Pause Young (Normal) (G1 Evacuation Pause) 6M->5M(12M) 2.054ms
[0.832s][info][gc] GC(11) Pause Young (Concurrent Start) (G1 Evacuation Pause) 6M->5M(12M) 1.826ms
[0.833s][info][gc] GC(12) **Concurrent Cycle**
[0.840s][info][gc] GC(13) Pause Young (Normal) (G1 Evacuation Pause) 6M->5M(15M) 1.774ms
[0.844s][info][gc] GC(12) **Pause Remark 6M->6M(15M) 2.017ms**
[0.847s][info][gc] GC(12) **Pause Cleanup 6M->6M(15M) 0.095ms**
[0.848s][info][gc] GC(12) **Concurrent Cycle 14.974ms**
[0.865s][info][gc] GC(14) Pause Young (Normal) (G1 Evacuation Pause) 7M->6M(15M) 1.492ms
[0.884s][info][gc] GC(15) Pause Young (Normal) (G1 Evacuation Pause) 8M->6M(15M) 1.493ms
[0.908s][info][gc] GC(16) Pause Young (Normal) (G1 Evacuation Pause) 8M->7M(15M) 1.937ms
[0.920s][info][gc] GC(17) Pause Young (Concurrent Start) (G1 Evacuation Pause) 9M->7M(21M) 1.826ms
[0.921s][info][gc] GC(18) **Concurrent Cycle**
[0.931s][info][gc] GC(18) **Pause Remark 8M->8M(21M) 2.465ms**
[0.934s][info][gc] GC(18) **Pause Cleanup 8M->8M(21M) 0.025ms**
[0.934s][info][gc] GC(18) **Concurrent Cycle 13.040ms**
[0.945s][info][gc] GC(19) Pause Young (Normal) (G1 Evacuation Pause) 10M->8M(21M) 2.254ms
[0.958s][info][gc] GC(20) Pause Young (Normal) (G1 Evacuation Pause) 12M->8M(21M) 1.703ms
[0.963s][info][gc] GC(21) Pause Young (Normal) (G1 Evacuation Pause) 11M->9M(21M) 1.464ms
[0.971s][info][gc] GC(22) Pause Young (Normal) (G1 Evacuation Pause) 12M->9M(39M) 1.952ms
[1.014s][info][gc] GC(23) Pause Young (Normal) (G1 Evacuation Pause) 18M->10M(39M) 4.156ms
[1.045s][info][gc] GC(24) Pause Young (Normal) (G1 Evacuation Pause) 21M->12M(39M) 4.734ms

 

`Pause Young (Normal) (G1 Evacuation Pause)`: Young 영역에서의 GC가 발생했음을 의미합니다.

- `Evacuation Pause` : 사용 가능한 메모리를 확보하기 위해 Young 영역에서 살아남은 객체들을 다른 곳으로 이동시키는 과정을 포함합니다.
- `3M->1M(8M)` : GC 전후의 메모리 사용량과 전체 할당 가능 메모리를 표시
`Concurrent Start` : 동시 마크 과정을 시작했다는 것을 의미합니다.
`Pause Remark` : 이는 리마크 단계를 나타내며, STW(Stop-The-World) 일시 중지가 발생합니다. 이 단계에서는 동시 마크 단계에서 놓친 참조들을 다시 확인하고, 가비지 컬렉션의 정확도를 높이기 위해 추가적인 마킹을 수행합니다.
`Pause Cleanup`: 정리 단계에서 발생하는 일시 중지로, 이 단계에서는 더 이상 필요하지 않은 메모리 공간을 실제로 정리합니다.
`Concurrent Cycle`: 동시 사이클의 완료를 나타내며, 이는 G1 가비지 컬렉터가 동시 마크와 관련된 모든 작업을 완료했음을 의미합니다.

반응형