본문 바로가기

Java/기술 스터디

Garbage Collection

목차

    Garbage Collection

    가비지 컬렉터에 대해 설명을 드리기 전에,

    스택메모리와 힙 메모리에 대한 설명을 잠깐 드리겠습니다.

     

    스택 메모리 (stack memory) 와 힙 메모리(heap memory)

     

    스택메모리는 int와 같은 기본형 데이터의 값이 저장되는 영역입니다.

    그리고 참조형 변수 st의 주소값이 저장됩니다.

     

    위 참조형 변수 st의 값 데이터는 힙 메모리에 저장됩니다.

     

    이렇게 스택 영역에 stack이라는 이름으로 생성된 변수는 힙 영역의 힙이라는 스트링을 레퍼런스하게 됩니다.

     

     

    그리고

    String 클래스는 문자열을 결합할 때

     

    이미 있는 heap 문자에 memory 문자가 추가되는 것이 아니라

     

    새로 힙 메모리라는 문자열을 만들어 힙 메모리에 값이 저장이 됩니다.

     

    Garbage

    stack영역과는 달리 heap에서는 지워지지 않고 남습니다.

     

    이 가비지를 자바에서는 JVM(Java Virtual Machine)이 처리하는데 이것을 가비지 컬렉터라고 합니다.

     

    예시는 stack 영역으로 들었지만,

    stack 뿐만 아니라 method영역, static영역 모두에서 참조하는 객체가 모두 수거 대상이 됩니다.

     

    이렇게 heap memory 문자열처럼 연결되어있는 객체를 reachable한 객체,

    heap 문자와 같이 연결이 되어 있지 않은 객체를 unreachable한 객체라고 부르겠습니다.

     

    다른 언어

     

    C언어나 C++은 이러한 가비지 컬렉션이 없어 프로그래머가 수동으로 메모리 할당과 해제를 일일이 해줘야 하는 반면 Java는 JVM에 탑재되어 있는 가비지 컬렉터가 메모리 관리를 대행해줍니다.

     

    개발자 입장에서 메모리 관리, 메모리 누수(Memory Leak) 문제에서 대해 완벽하게 관리하지 않아도 되어 오롯이 개발에만 집중할 수 있다는 장점이 있습니다.

     

    Heap 영역의 구조

    가비지 컬렉션의 동작 구조를 설명 드리기에 앞서, 힙 영역의 구조에 대해 살펴보겠습니다.

     

    힙 메모리는 간단히 young과 old generation으로 나뉩니다.

     

    설명하기 쉽게, 어린이와 어른이 영역이라고 이야기하겠습니다.

     

    어린이 영역은 새로운 객체들이 할당되는 영역,

    어른이 영역은 어린이 영역에서 오랫동안 살아남은 객체들이 존재하는 영역 입니다.

     

    young generation

     

     

     

     

    어린이 영역은 또 eden과 survivor0, survivor1로 나뉩니다.

     

    Minor GC

    새로운 객체는 eden 영역에 할당됩니다.

    eden영역이 가득찼을 때 발생하는 GC를 minorGC라고 합니다.

     

    minorGC가 발생하면,

    reachable 객체들은 survivor 영역으로 옮겨지고 eden 영역이 클리어 될 때 unreachable 객체들은 함께 메모리에서 사라집니다.

     

    다음 MinorGC가 발생할 때도 방금과 같은 과정이 발생합니다.

    unreachable 객체는 지워지고, reachable 객체들은 survivor 영역으로 이동합니다.

    기존에 있었던 reachable 객체들은 s1으로 옮겨지는데, 이때 age값이 증가되어 옮겨집니다.

     

    old generation

     

    young영역에서 계속해서 살아남으며 age값이 증가하는 객체들은 age값이 특정값 이상이 되면 old 영역으로 옮겨집니다.

     

    Major GC

     

    계속 반복되면 old 영역도 가득 차게 되고 이 때 발생하는 GC는 MajorGC라고 합니다.

     

    GC 종류

     

     

    컬렉션 알고리즘은 이게 끝이 아니라 GC의 종류는 정말 다양합니다.

     

    하드 웨어의 성능에 따라 싱글 스레드를 사용하는 Serial GC 부터 지속적으로 다양하게 발전하여 parallel GC, CMS GC, G1 GC, Z GC 등이 등장했습니다.

     

    그 안에서도 또 stop the world 처리 시간을 줄이는 등 여러 가비지 컬렉션 알고리즘이 존재합니다.

     


    참고 자료

    https://beststar-1.tistory.com/15

    https://beststar-1.tistory.com/16

    https://www.youtube.com/watch?v=Fe3TVCEJhzo

     

     

     

    'Java > 기술 스터디' 카테고리의 다른 글

    DTO & VO  (0) 2023.09.18
    ENUM  (0) 2023.09.17
    Cookie & Session  (0) 2023.08.14
    HTTP & HTTPS  (0) 2023.08.14
    MVC (Model View Controller)  (0) 2023.08.12