일하다가 알게된 상식정리

GC(Garbage Collector) 관련

Winter_Snow 2023. 8. 1. 22:49

현업에서 일하다 보니 OOM도 만나게 되고, 메모리 누수, 원인모를 에러 등.. 많은 부분을 겪어보게 되었다. 
개인 프로그램에서는 신경도 쓰지 않았던 것들을 생각해야 했고, 원인을 해결하기 위해서 폭 넖은 생각과 다양한 지식이 필요했다. 
그 중 중요하게 생각하는 것 중 하나는 GC이다. 

GC란? 
Heap 영역에서 동적으로 할당했던 메모리  필요 없게 된 메모리 객체(garbage)를 모아 주기적으로 제거하는 JVM의 프로세스이다. 

장점 : 개발자가 안쓰는 힙 영역 객체를 지우거나 하는 작업을 안해도되며, 힙영역의 메모리가 부족해지면 알아서 작동한다. 

단점 : GC가 언제 작동하지 모르며, Major GC가 동작할 때는 모든 쓰레드가 멈추며, 이를 Stop-The-World 라고 부른다. 

학교 다닐 때, 단점은 어디다 던져버리고 장점만 알려준 교수를 찾고 싶어졌다.
단점이 매우 중요해보이지 않는가? 무려 몇 초동안 프로그램이 아무것도 안한다는데...

 

GC의 동작과정 

힙 영역

YG(Young generation) 은 참조하는 시간이 짧은 객체들이 존재하는 곳
Eden : new 로 새롭게 생성된 객체가 존재함. 
Survival 0,1 : GC가 동작하면서 Eden중에 아직 참조(사용)하고 있는 객체를 age를 1씩 늘려가면서 저장함. 
                     Survival0, Survival1 중 하나에만 객체가 들어감. GC가 동작하면서 SWAP하는 듯 함
OG(Old generation) : Survival0,1에서 설정한 임계값에 도달할 때까지 살아남은 객체를 보관함. (YG보다 훨신 큰 메모리공간을 차지함)

YG 메모리 공간이 가득차서 GC가 작동하는 것을 Minor GC라고 하며, OG의 객체를 건드리지 않음.  짧은 시간 이루어지며 1초안에 끝나는 것으로 보임. 
OG 메모리 공간이 가득차서 GC가 작동하는 것을 Major GC, Full GC라고 하며, 전체 스레드를 멈추고 OG의 객체를 삭제하는 작업을 거치게 된다. 이는 오래가면 수 십초가 경과되는 것 같다. 

JDK 버전에 따라 이 GC 알고리즘이 달라서 시간이 달라질 것으로 보인다. 
현재 참여하고 있는 프로젝트의 Java 버전은 8버전으로.. GC 때문에 고생 꽤나 할 듯 하다.



참조 페이지 : https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98GC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC

'일하다가 알게된 상식정리' 카테고리의 다른 글

OOM(Out Of Memory) 관련  (0) 2023.08.01