KATEKEITH / TIL_log

📚 Today I Learned.
0 stars 0 forks source link

Java JVM GC #29

Open KATEKEITH opened 10 months ago

KATEKEITH commented 10 months ago

Garbage Collection , GC 는 JVM 상에서 더 이상 사용되지 않는 데이터가 할당되어있는 메모리를 해제시켜주는 장치입니다 JVM 에서 자동으로 동작하기 때문에 Java 는 특별한 경우가 아니면 메모리 관리를 개발자가 직접 해줄 필요가 없습니다. GC 가 주로 동작하는 대상은 Heap 영역 내의 객체 중에서 참조되지 않은 데이터입니다.

public class Main {
    public static void main(String[] args) {
        Person person = new Person("a", "곧 참조되지 않음");
        person = new Person("b", "참조가 유지됨");
        //GC 발생 가정 시점
    }
}

//Person은 "name"과 "description"을 필드로 가지며, 생성자에서 차례대로 주입받게 됨.

위의 경우처럼 참조하는 대상을 바꾸거나 메소드가 끝나서 Stack 이 pop 이 되면 참조되지 않는 객체들이 생겨납니다. 참조되고 있는지에 대한 개념을 reachability 라고 하고, 유효한 참조를 reachable , 참조되지 않으면 unreachable 이라고 합니다. 그리고 GC 는 unreachable 한 객체들을 garbage 라고 인식하게 됩니다.

다음은 Heap 영역에서 reachable , unreachable 한 개념들을 도식화하였습니다.

image

그림에서 보았던 것처럼 Heap 영역 내부의 객체들은 Method Area , Stack , Native Stack 에서 참조되면 reachable 로 판정합니다. 이렇게 reachable 로 인식되게 만들어주는 JVM Runtime Area 들을 root set 이라고 합니다. 또한 reachable 이 참조하고 있는 다른 객체 역시 reachable 이 됩니다. 하지만 root set 의해 참조되고 있지 않은 객체들은 unreachable 로 판정이 되어, GC 의 대상이 됩니다. 예시 코드에서는 “a” 가 unreachable , “b” 가 reachable 상태입니다. 그래서 unreachable 상태인 “a” 를 상대로 GC 가 이루어집니다.

https://tecoble.techcourse.co.kr/post/2021-08-30-jvm-gc/

KATEKEITH commented 10 months ago

GC란 무엇이고, 왜 써야할까요?

이전 GC의 메모리 구조와 G1GC의 메모리 구조를 비교해보고, GC튜닝을 하는 궁극적인 목표에 대입해서 생각해보세요.

( 더 알아보면 좋을 GC의 종류 : ZGCShenandoah )

https://f-lab.kr/blog/java-backend-interview-2

https://thinkground.studio/2020/11/07/%EC%9D%BC%EB%B0%98%EC%A0%81%EC%9D%B8-gc-%EB%82%B4%EC%9A%A9%EA%B3%BC-g1gc-garbage-first-garbage-collector-%EB%82%B4%EC%9A%A9/

https://velog.io/@recordsbeat/Low-Pause-Shenandoah-GC