alt
Home JVM의 가비지 컬렉터
Post
Cancel

JVM의 가비지 컬렉터

: 유효하지 않은(더 이상 불필요한) heap의 객체 메모리를 JVM의 데몬이 정리해주는 것.


img

  • JVM의 GC 예시. C++이나 C에서는 free()를 통해 직접 할당 해제해줘야 한다.
  • 위의 그림에서 permanent 영역은 heap에서 제외


GC 설계의 바탕

: 대부분의 객체는 금방 unreachable 상태가 된다.

e.g) 메서드 종료 시 그 메소드에서 생성된 객체는 더이상 사용하지 않는 경우

e.g 2) User user = new User(); 과 같이 생성해 DB에 저장하거나 하는 등의 태스크를 수행하고 더이상 객체 자체는 사용이 안되는 경우


GC 동작 방식

Minor, Major GC?

  • Young 영역의 각 하위 영역이 가득 차면 Minor GC 발생.
  • Old 영역이 가득차면 Major GC(== Full GC) 발생.


Stop the world

: GC를 수행하는 데몬 스레드 외에 모든 스레드 작업 멈추는 상태이다. GC 완료 후 다시 스레드 들이 실행 상태된다. 따라서 당연하게 GC가 자주 수행 될수록 성능은 저하된다. 성능을 위해서라면 GC를 튜닝할 수도 있다.


동작 기법: Mark and Sweap

GC는 객체를 돌면서 각각이 어떤 객체를 참조하고 있는지 reference를 탐색하면서 mark해 참조가 되는 객체와 아닌 것을 체크한다. 이후 Sweap 과정에서는 불필요한 객체를 제거한다.


동작 과정

  1. 객체 생성 시 YG의 Eden으로 이동한다.
  2. Eden영역이 꽉차 Minor GC 발생하고, 살아남으면 Survivor 1로 이동한다.
  3. 이후 Survivor 1, 2 사이를 minor GC 발생에서 살아남을때마다 번갈아가며 이동한다.
  4. Minor GC에서 살아남은 횟수(age bit)가 지정해놓은 임계값을 넘게 되면, Old 영역으로 이동한다.
  5. Old 영역의 객체는 MajorGC때 참조 여부에 따라 살아남거나 제거된다.


G1(Garbage first) GC

img

  • java에서 사용되는 GC
  • 멀티 쓰레드로 Stop the world가 동작


Region 개념 도입

  • 힙을 균등하게 region으로 나누고, 가비지가 많은 region에 우선적으로 GC
  • Minor - Eden에 많다 싶으면 해당 지역 GC 하고, 살아남은 객체 다른 영역 이동. 복제되는 지역이 Available / Unused면 해당 영역은 Survivor이 되고, Eden이었던 곳은 Available/Unused 된다.
  • Major - GC가 많은 지역을 조합해 해당 지역에 GC 수행

  • 좋은 경우
    • Java heap 반 이상이 살아있는 객체일 때
    • GC가 너무 오래 걸려 튜닝이 필요할 때



Reference)

https://velog.io/@hygoogi/%EC%9E%90%EB%B0%94-GC%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C

https://github.com/WeareSoft/tech-interview/blob/master/contents/java.md

https://deveric.tistory.com/64

https://mangkyu.tistory.com/119

This post is licensed under CC BY 4.0 by the author.

OWT Websocket (socketIOServer) 코드 분석 및 시나리오별 정리

Kafka 아키텍처