[JAVA] GC(Garbage collector, Garbage collection)Web_Backend/Java2023. 6. 15. 13:22
Table of Contents
GC(Garbage collector)란?
📌 자바의 메모리 관리 방법 중 하나로 JVM의 Heap 영역에서 불필요한 메모리를 주기적으로 삭제하는, 즉 Garbage collection을 해주는 프로세스를 말함.
Mark and sweep과 Stop The World를 통함.
-
- JAVA에서 객체들은 실질적으로 Heap영역에 생성되고 Method Area나 Stack Area, Root Area에서는 Heap에 생성된 객체의 주소만 참조하는 형식 GC의 대상
- Heap 영역에 있는 객체들 중 어디서든 참조하고 있지 않는 (Unreachable한) 객체 GC의 대상
- 개발자가 메모리 관리, 메모리 누수(Memory Leak)에 대해서 완벽하게 관리하지 않아도 되며, 개발과 비즈니스 로직에만 더 집중할 수 있음
- JVM에 기본으로 탑재되어있는 Garbage collector가 Garbage Collection을 대신해 주기 때문
- 단점
- 메모리가 언제 해제되는지 개발자가 알 수 없음
- Java에서도 GC를 System.gc()를 이용해 호출할 수 있지만, 해당 메소드를 호출하는 것은 시스템의 성능에 매우 큰 영향을 미치므로 호출해서는 안됨
- GC가 동작하는 동안 Stop the world로 인해 다른 동작을 멈추기 때문에 오버헤드 발생
- 메모리가 언제 해제되는지 개발자가 알 수 없음
Young/Old Generation, Minor/Major GC
Young Generation
- Eden, Survival로 이루어져 있음
- Eden : 새롭게 생성된 객체가 할당(Allocation)되는 영역
- Survival1,2 : Eden이 꽉 찼을 경우 실행되는 GC에서 살아남은 객체가 저장되는 영역
- 대부분의 객체가 금방 Unreachable되기 때문에, 많은 객체가 해당 영역에 생성되었다가 금방 사라짐
- Young Generation에 대한 Garbage Collection을 Minor GC라고 함
Old Generation
- Young영역에서 Reachable을 유지하며 오래 살아남은 객체가 복사되는 영역
- Young영역보다 크게 할당되며, Garbage는 적게 발생
- Old Generation에 대한 Garbage Collection을 Mager GC라고 함
Mark and sweep이란?
✅ Garbage Collection이 동작하는 원리로, 3단계를 거쳐 실행됨
- Mark : Root로부터 그래프 순회를 통해 연결된 객체들을 찾아내어 각각 어떤 객체를 참조하고 있는지 찾아서 마킹
- Sweep : 참조하고 있지 않은 객체(Unreachable)은 Heap에서 제거
- Compact : Sweep 후에 분산된 객체들을 Heap의 시작주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 압축(GC종류에 따라 실행되지 않는 경우도 있음)
Stop The World란?
✅ GC를 실행하기 위해 JVM이 어플리케이션 실행을 멈추는 것
GC가 실행되면 GC를 실행하는 쓰레드 이외에 나머지 쓰레드는 모두 작업을 멈추고, GC작업이 완료된 이후에 작업을 실행
- GC튜닝 : stop-the-world시간을 줄이는 것
- GC를 튜닝하는 것은 최종적인 수단으로 두고 Code Level에서 해결하는 것을 많은 전문가 분들이 권고
G1GC (Garbage First Garbage Collector)란?
✅ 큰 메모리를 가진 멀티 프로세서 시스템에서 사용하기 위해 개발된 GC
Young, Old 영역을 명확하게 구분하던 전통적인 GC들과 다르게 물리적으로 구분하지 않음
가비지 컬렉터의 STW을 최소화 하면서, 따로 설정을 하지 않아도 가능한 한 처리량을 확보하는 것.
→ STW을 최소화했지만 완전히 없애지는 못함
'Web_Backend > Java' 카테고리의 다른 글
[Java] collectionFramework_Set_HashSet이란? (0) | 2023.09.18 |
---|---|
[JAVA] 재귀함수 vs 반복문 (0) | 2023.06.20 |
[JAVA] Stream API (0) | 2023.05.26 |
[JAVA] String, String Builder, String buffer 차이 (0) | 2023.03.19 |
[초보 개발자의 도서 리뷰] "곁에 끼고 자주 찾아볼 자바 교보재" 코딩 개념 잡는 자바 코딩 문제집 (0) | 2022.12.02 |
@Yanako :: Yana's coding story였는데요, 우당탕탕 개발일지가 맞는것같
야나의 코딩 일기장 :) #코딩블로그 #기술블로그 #코딩 #조금씩,꾸준히
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!