JVM_Garbage Colletion

Today Jeeho Learned·2022년 10월 7일
0

JAVA

목록 보기
4/4

Intro

JVM을 학습하면서 기록을 남겨놓았는데, 첫번째 기능인 운영체제의 독립적인 부분의 위주로 작성이 되었던 것 같다. 메모리를 관리해주는 GC도 엄청난 기능인데, 머리속으로 알고만 있는 것을 좀 더 구체적으로 작성해서 기록하고자 한다.

Garbage Collection이란 ?

가비지 컬렉션은 자바의 메모리 관리 방법 중의 하나로 JVM의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리 영역을 주기적으로 삭제하는 프로세스를 말한다.

개발자가 직접 메모리관리를 하지 않고, 개발에만 집중할수 있는 장점이 있지만 단점도 존재한다.

가비지 컬렉션의 단점

  1. 개발자가 메모리가 언제 해제되는지 정확히 알 수 없다.
  2. 가비지 컬렉션이 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생한다.

문제가 발생할 수 있는 부분은 GC가 동작하는 동안에는 JVM의 다른 동작들은 잠깐 멈추기 때문에 오버헤드가 발생한다는 점이다. 이로 인해 GC가 너무 자주 실행되면 소프트웨어 성능 하락의 문제가 되기도 한다. 이러한 특성으로 인해 실시간으로 계속 동작해주어야 하는 시스템들에는 적합하지 않을 수 있다.

Garbage Collection의 대상이 되는 객체들

객체들은 heap영역에 생성되고, method, stack영역등 root area에서는 heap에 생성된 객체의 주소만 참조하는 형식으로 구성된다.
이렇게 생성된 객체들은 메서드가 끝나면 객체의 메모리 주소를 가지고 있는 변수가 삭제되는현상이 발생하면 빨간색 객체와 같이 어디든 참조하고 있지 않은 객체가 된다. 이것을 unreachable객체라고하고, 주기적으로 가비지 컬렉터가 제거해준다!

정리하면

  • Reachable : 객체가 참조되고 있는 상태
  • Unreachable : 객체가 참조되고 있지 않은 상태(GC의 대상)

대표적인 알고리즘 : Mark And Sweep

mark and sweep 알고리즘은 가비지 컬렉션이 동작하는 원리로 루트에서부터 해당 객체에 접근 가능한지에 대한 여부를 메모리 해제의 기준으로 삼는다. 총 3가지의 과정을 나뉘게 된다.

  1. mark
    먼저 root로 부터 그래프 순회를 통해 연결된 객체들을 찾아내어 각각 어떤 객체를 참조하고 있는지 찾아서 마킹한다.
  2. sweep
    참조하고 있지 않은 객체 즉 unreachable 객체들은 heap에서 제거한다.
  3. compact
    sweep 후에 분산된 객체들을 heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 압축한다.

긍까 쉽게말하면 !
순회하면서 heap에서 참조안되고 남아있는 unreachable객체들을 찾아서 제거하고 분산되어있는 객체를 다시 시작주소로 모아서 메모리가 할당된 부분과 그렇지 않은 부분으로 압축한다!!

GC의 대상이 되는 Heap영역

GC가 열일하는 Heap에 대해서 자세히 알아보자!


영제너레이션과 올드제너레이션으로 크게 두가지로 나뉘고 영제너레이션에서는 에덴 서바이벌로 또 나뉘는 구조다.

동작과정

Heap의 구조에 대해서 알았다면 동작과정도 살펴보자
JVM GC 기본적으로 Weak Genertation Hypothesis를 전제로 설계되었다. 이게 뭔 무슨말이냐면 두 가설로 전제되었는데 아래와 같다.
1. 대부분의 객체는 생성된 이후 짧은 시간안으로 unreachable상태가 된다.
2. 생성된지 오래 된 객체에서 방금 생성된 객체로의 참조는 아주 적다.

여기서 우선 적으로 첫번째 사항을 고려해야하는데, 대부분 객체들은 메소드 안에서 생성되어 사용되다가 메소드의실행이 종료되면 사용되지 않는다. 즉 객체를 참조할 stack변수들이 메소드의 종료와 함께 사라지기때문에 Unreachable상태가 된다, 반면에!! 한번 살아남은 객체들은 오래동안 살아남을 가능성이 있다. 끈질긴 녀석들!

그치만 가비지 컬렉션이 일어날때마다 heap전체를 스캔하는 것은 매우 비효율적이다. 그래서 young generation과 old generation 영역을 구분해서 사용하는데, young generation은 다시 eden과 survive영역(s0,s1)으로 나누어 관리한다.

다시 가설로가면 대부분 young generation에서 생성되고 금방 사라지기를 반복하는데, 여기서 객체가 회수되는 작업을 Minor GC라고 한다. 상대적으로 빈번하게 발생하지만 짧게 끝난다.

몇 번의 Minor GC를 겪으며 살아남은 끈질긴 객체들은 old generation으로 옮겨저 Minor GC의 대상에서 제외된다. 이렇게 Old generation으로 이동하는 것을 Promotion이라고 한다.

old generation영역으로 넘어간 객체들이 많아질수록 여기서도 gc가 수행되야하는데 이것을 Major GC라고 한다. minor gc에 비해서 빈도가 적지만 gc하는데 꽤 긴 시간이 발생한다.

마치며

GC에 대해서 전보다 훨씬 자세하게 머리속에 팍팍 넣으면서 정리했다.
훨씬 더 자세하고 복잡한 내용들이 많이 있지만, 학습하는 과정에서는 이정도 수준의 정리면 괜찮을 것 같다고 생각했다.

간략하게 정리하면
1. GC는 메모리를 정리해준다.
2. heap에서 참조하지 않는 객체들을 쓱싹 쓱싹 정리해준다.
3. 힙 구조에서 신과 구로 나뉘고, 힙은 신에서 구로 차근차근 쌓인다.
4. 신에서 minor gc, 구에서는 major gc라고 한다!

CS차근차근 쌓으면서 탄탄한 개발자가 되자!!

출처

https://kotlinworld.com/340
https://mangkyu.tistory.com/118
https://tecoble.techcourse.co.kr/post/2021-08-30-jvm-gc/
감사합니다 :) ☺️

profile
기록해야 (살아)남는다 !

0개의 댓글

관련 채용 정보