GC

이원석·2022년 4월 20일
0

Java

목록 보기
4/9
post-thumbnail

1. GC(Garbage Collection)


String[] array = new String[1];

array[0] = '0'
...

array = new String[] {'1');

위의 코드에서 새로 String 배열이 array에 할당될 때, 기존에 할당된 '0'은 주소를 잃어버려 사용할 수 없는 메모리가 되며, 이를 자바에서 Garbage라고 합니다. 또한 앞으로 사용하지 않지만 메모리에 할당된 객체 또한 Garbage에 포함됩니다.

GC는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은(참조가 끝난) 객체들을 탐색 후 제거해 메모리에서 해제 시키는 역활을 합니다.



GC가 수행하는 작업들

가비지 컬렉터(Garbage Collector, GC)는 Java 가상 머신(JVM)에서 자동으로 수행되는 프로세스로, 객체가 사용하지 않는 메모리를 식별하고 반환하여 프로그램의 메모리 관리를 자동화하는 역할을 합니다. GC가 수행하는 작업은 다음과 같습니다.

  1. 메모리 할당 (Memory Allocation)
    객체가 생성될 때, JVM은 자동으로 메모리 공간을 할당합니다. 이때, JVM은 할당받은 메모리 공간의 주소를 객체 참조 변수에 저장합니다.
  1. 사용중인 메모리 인식 (Identification of Used Memory)
    GC는 JVM의 힙 영역(Heap)에서 사용 중인 객체들을 식별합니다. 이때, 객체를 참조하는 변수나 다른 객체의 필드 등을 이용하여 객체의 접근 가능 여부를 판단합니다.

  2. 미사용 메모리 인식 (Identification of Unused Memory)
    사용 중인 객체가 아닌, 더 이상 참조되지 않는 객체(즉, 쓰레기 객체)를 식별합니다. GC는 쓰레기 객체를 찾기 위해, 모든 객체를 순회하며 참조 관계를 분석합니다. 이때, GC는 도달 가능성(Reachability)을 기준으로 쓰레기 객체를 판단합니다. 도달 가능한 객체는 GC의 대상이 아니며, 도달할 수 없는 객체는 쓰레기 객체로 판단하여 메모리를 해제합니다.

  3. 메모리 해제 (Memory Reclamation)
    쓰레기 객체로 판단된 객체의 메모리 공간을 해제합니다. 이때, GC는 먼저 쓰레기 객체로 판단된 객체의 메모리 공간을 해제합니다. 그리고 해당 객체를 참조하는 모든 변수를 찾아서 해당 변수가 참조하는 객체도 쓰레기 객체인지 판별합니다. 만약 해당 객체도 쓰레기 객체라면, 도달 가능한 객체에서 제외됩니다. 이후 GC는 다시 쓰레기 객체를 찾아내어 메모리를 해제하며, 해당 객체를 처리하지 않습니다.



2. Stop the World


JVM은 GC를 실행 시에 GC를 제외한 모든 스레드를 멈추게 됩니다. GC 작업이 완료된 후에 JVM은 멈추었던 스레드들을 다시 실행 상태로 변경시킵니다.

GC가 작업을 진행하는 힙 메모리에는 3가지 영역(Young Area, Old Area, Permanent)이 있습니다.


1. Young Area

최초로 생성된 객체들은 Young 영역에 위치하게 됩니다. Young 영역에 위치하는 객체는 각 하위 영역이 가득 차게되면 Minor GC가 동작하여 더 이상 참조되지 않는 객체들을 메모리상에서 제거합니다.

동작과정

  1. 객체를 최초 생성하면 Young 영역의 Eden 영역에 위치한다.
  2. Edend 영역에서 Minor GC 발생시, 아직 참조되는 객체라면 Survivor1로 이동한다.
  3. Survivor1 영역에서 Minor GC 발생시, 아직 참조되는 객체라면 Survivor2로 이동한다.
  4. Survivor2 영역에서 Minor GC 발생시, 아직 참조죄는 객체라면 Survivor1로 이동한다.
  5. Survivor 영역이 가득찰 때 까지 참조되는 객체들은 Survivor1 과 2로 이동을 반복한다.
  6. Survivor 영역이 가득 차면 Young 영역에서 오래 살아남은 객체는 Old 영역으로 이동합니다.
    6-1. 객체마다 가지고 있는 age bit(Minor GC에서 살아남은 횟수)를 확인하겨 살아남은 기간을 정한다.



2. Old Area

Young 영역에서 아직 참조상태를 유지한 객체들은 Old 영역으로 복사됩니다. Young 영역보다 크며 GC는 적게 발생합니다.

동작과정

  1. Old 영역에 있는 객체는 Major GC가 발생시, 아직 참조되는 객체는 유지되며 그렇지 않다면 제거된다.





[참고문헌]
https://d2.naver.com/helloworld/1329
https://github.com/WeareSoft/tech-interview/blob/master/contents/java.md
https://velog.io/@litien/%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%ED%84%B0GC

0개의 댓글