새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.

1 분 소요

오늘은 가비지 컬렉션에 대해 학습했습니다.

가비지 컬렉션과 관련된 키워드부터 정리해보겠습니다.

불필요한 객체 생성으로 GC를 일하게 하는 행위

  • String operation (“+”)
  • 오토박싱 / 언박싱
  • 방어적 복사

Old Generation으로 만드는 행위

  • 중첩 클래스
  • 가변 객체

GC하기 어려운 대상

  • static
  • 클래스 메타데이터

가비지 컬렉션이란

가비지 컬렉션은 동적 메모리 공간(Heap & Metaspace)에서 사용되지 않은 메모리를 해제하는 역할을 합니다.

기존 C,C++을 사용할 때는 별도의 소멸 메소드를 사용하거나 모두 사용한 뒤에는 동적 메모리 영역을 제거하는 행위를 합니다.

자바에서는 자동으로 동적 메모리 영역의 사용되지 않는 메모리를 제거합니다.

heap-memory

public static void main(String[] args){
    Integer five = new Integer(5); // Eden 추가
}

새 인스턴스를 생성하면 힙 메모리 영역중 Young Gen내부에 있는 Eden에 저장됩니다.

이후 새 인스턴스가 계속 추가되어 Eden이 꽉 차게 된다면 Minor GC가 동작합니다.

동작할때 Mark,Sweep,Compact 방식으로 청소를 하게 됩니다.

  1. Mark - 살아있는 객체를 찾아 마킹을 합니다.
  2. Sweep - 참조하고 있지 않는 쓰레기 객체를 Heap에서 제거합니다.
  3. Compact - 살아있는 객체를 한 곳으로 모읍니다.

GC는 이 과정이 모두 종료되는 Eden에 있는 객체를 S0(Survivor)에 저장하게 됩니다.

이때 Eden > S0영역으로 이동 후 살아남은 객체의 age를 1증가합니다.

다시 Eden이 꽉차게 되면 GC가 동작하게 되고 1~3번이 동작후 이번엔 S1에 영역을 옴깁니다.

이때 S0에 있는 살아있는 객체도 이동하게 되며 똑같이 age를 1 증가합니다.

Desired survivor size 22020096 bytes, new threshold 7 (max 15)

이렇게 VM 옵션을 통해 OldGeneration으로 가기 위한 현재 조건을 확인할 수 있습니다.

  • YoungGen을 정리하는 GC를 MinorGC라고 합니다.

  • OldGen영역을 정리하는 GC를 MajorGC라고 합니다.

GC가 동작할 때 모든 GC는 STW(Stop the world)로 모든 어플리케이션이 일시정지가 됩니다.

MinorGC는 지연 시간이 짧고, MajorGC는 훨씬 긴 초 단위로 어플리케이션이 정지됩니다.

따라서 어플리케이션을 사용할 때 최대한 GC가 동작하지 않도록 코드를 작성하는 것이 중요합니다.

학습 정리

모르고 있던 내용

  • static이 GC 대상이다.
  • Major,Minor GC가 언제 동작하는지
  • Method 영역(PermGen) 이나 MetaspaceClass가 저장되는지
  • 중첩 클래스, 오토박싱이 대량의 데이터에서 왜 사용하지 말라고 하는 이유

참고

댓글남기기