gc는 별도 스레드에서 동작한다고 알고있는데
스레드 공부하다보니 살짝 의문이..
언어별로 가비지 수거 요청 시에 즉시 수행된다고 하는 설명도 있고(c#)
힌트는 주지만 즉시 수행을 보장하지는 않는다는 설명도 있습니다.(java)
제가 보기에 둘 다 이론상으로는 가능한 방식으로 보이기는 합니다..
호출시 잠들어 있던 가비지 컬렉터를 깨우고 주도권을 넘겨 작동하게 하는 방식이면 전자도 가능할 것 같고
항시 수행중인 gc가 특정 시점에 플래그를 확인하고 수거하는 방식이면 후자도 가능해 보였기 때문입니다.
보통 어떤 방식으로 작동하나요?
이 글 쓸 시간에 g1gc 찾아봤을듯
1. 운영체제를 통해서 무언가를 깨우는 건 즉시 일어나지 않음 2. 가비지 컬렉팅 도중에 새 메모리 할당 요청을 받는 경우 쓰레드 경쟁이 일어남. 이것에 대한 대책이 필요한데 어느 방법이든 성능을 떨어트릴 수 밖에 없음 (stop-the-world이든, 유사 Lock-free이든) 그래서 가비지 컬렉터에 따라서 요청 즉시 하는게 아니라 적절한 타이밍에 알아서 수거를 돌리는 구조가 성능면에서 나을 수 있음
그렇기 때문에 어느 GC가 더 나은지는 어떤 애플리케이션인가에 따라 다름 Stop-the-world가 깔끔하고 성능이 괜찮지만 반응성이 떨어질 수도 있고 Lock-free는 좋은 반응성을 보여주지만 경쟁이 치열해지면 할당/해제 시도 횟수가 늘어나 성능이 하락함 C#(.NET)은 안 써봐서 모르겠는데 Java는 GC 선택해서 끼울 수 있음. 나중에 최적화할 때 여러 GC로 벤치마크 해보고 적절한 GC를 고르는 게 좋음