Garbage Collection

man soup·2020년 10월 7일
0

자바 공부

목록 보기
5/7

Automatic Garbage Collection이란?

힙 영역을 탐색해 어떤 객체들이 사용중인지 아닌지를 구별하고 사용하지 않는 객체들을 제거하는 과정
사용중인 객체 또는 참조된 객체란 당신의 프로그램중 어떤 부분이 그 객체를 가리키는 포인터를 가지고있다는 뜻이다.
C언어같은 경우 메모리 할당과 해제를 사용자가 할 수 있지만 자바에서 메모리 해제는 GC에 의해 자동적으로 이뤄진다.

Automatic Garbage Collection 과정

1. Marking

gc가 메모리 어떤 부분이 사용중인지 아닌지 확인한다.
참조된 객체들은 파란색, 아닌 객체들은 주황색으로 표시
모든 객체들이 marking 단계에서 스캔되어 이러한 결정이 정해진다.
시스템 안의 모든 객체들이 스캔되어야 할 경우 이것은 매우 시간이 오래 걸리는 과정이 될 수 있다.

2. Normal Deletion

참조 된 개체와 여유 공간에 대한 포인터를 남겨두고 참조되지 않은 개체를 제거한다.
메모리 할당자는 빈 공간들의 레퍼런스를 리스트로 관리하고 할당이 필요할 때마다 이 리스트를 검색한다.

2a. Deletion with Compacting

향상된 퍼포먼스를 위해 참조되지 않은 객체들을 제거하고 남겨진 참조된 객체들을 압축시킨다. 참조된 객체를 옮김으로
새로운 메모리 할장을 더욱 쉽고 빠르게 할 수 있게 된다.

Why Generational Garbage Collection?

1에서 말했듯이 JVM의 모든 객체들을 MARK하고 COMPACT하는 것은 비효율 적이다.
많은 객체들이 할당될수록 객체들의 리스트는 증가하고 증가는 GC 시간을 승가시킨다.
그러나 경험적 분석에 따르면 대부분의 객체들은 짧은 시간동안만 생존해있는다.

JVM Generations 분류

객체 할당 행동으로부터 배운 정보로 JVM 퍼포먼스 향상에 도움을 줄 수 있다.
그러므로 힙 영역을 더 작은 영역 또는 세대로 나눈다. ( young generation, old generation, permanent generation )

young generation

새로운 모든 객체들이 할당되고 나이를 먹는 곳이다. yg가 모두 차면, 이것은 minor garbage collection을 일으킨다

minor garbage collection

높은 객체 사망률을 가정함으로써 최적화 될 수 있다. 죽은 객체들로 가득 찬 young generation은 매우 빠르게 collect된다
몇몇의 생존한 객체들은 나이를 먹고 결국 old generation으로 옮겨간다.

STOP THE WORLD Event란?

모든 minor garbage collections은 STOP THE WORLD 이벤트이다.
모든 어플리케이션 쓰레드들이 collect operation이 완료될 때까지 멈춘다는 뜻이다.
minor garbage collection은 언제나 "STOP THE WORLD" 이벤트이다

Old Generation

오래 생존한 객체들을 저장하기 위한 공간이다.
보통 young generation 객체를 위해 역치가 설정되고 이 역치를 넘기면 객체는 old generation으로 옮겨간다.
결국 old generation도 collect되어야 한다. 이 이벤트를 major garbage collection이라고 한다.

Major garbage collection

minor와 같이 stop the world 이벤트이다.
종종 major collectino이 훨씬 느린데 모든 살아있는 개체들이 포함되어 있기 때문이다.
따라서 반응 형 애플리케이션의 경우 주요 가비지 컬렉션을 최소화해야한다.
major collection을 위한 stop the world 이벤트의 길이는 old generation 공간에 사용되는 garbage collector의 종류에 의해 영향을 받는다.

Permanent generation

JVM이 어플리케이션에서 사용되는 클래스들과 메소드들을 설명하기 위해 필요한 메타데이터를 포함한다.
런타임시 어플리케이션에 의해 사용되는 클래스를 베이스로 JVM에 의해 채워진다.
자바 SE 라이브러리 클래스들과 메소드들이 이곳에 저장될 수 있다.
JVM이 어떤 클래스들이 더이상 필요하지 않고 다른 클래스들을 위한 공간이 필요함을 찾아냈을 때 그 클래스들은 collect(unloaded)될 수 있다.
permanent generation은 full garbage collection에 포함된다.

Generational Garbage Collection Process

이제 왜 힙 영역이 왜 다른 세대들로 구분되어야하는지 이해했을 것이다.
어떻게 이 공간들이 상호작용하는지 알아보자
다음 사진은 JVM에서 객체 할당과 aging 프로세스가 어떻게 이뤄지는지 보여준다

  1. 새로운 객체들은 eden 공간에 할당된다. 두 survivor 공간은 모두 빈 상태로 시작된다.
  2. 에덴 공간이 모두 차면, minor garbage collection이 시작된다.
  3. 참조된 객체들은 s0 survivor 공간으로 이동된다. 참조되지 않은 객체들은 제거된다.
  4. 다음 minor gc 시 에덴에선 3번이 반복됨. 그러나 이경우 참조된 객체들이 에덴에서 s1 survival 공간으로 이동하는게 다르다
    또한 직전 minor GC에 의해 S0에 존재하는 객체들은 나이를 먹고 S1로 이동한다. 모든 생존한 객체들이 S1으로 이동하면 S0과 eden 공간이 제거된다.
  5. 다은 minor gc엔 같은 프로세스 반복. 다른점은 suvivor 공간이 교체된다. 참조된 객체들은 s0으로 옮겨가고 생존한 객체들은 나이를 먹는다. 에덴과 s1 공간이 제거된다.
  6. minor gc 후 나이먹은 객체들이 특정 age 역치를 넘으면 old generation으로 옮겨간다.
  7. minor gc가 계속되면서 생존한 객체들이 old generation 공간으로 옮겨간다.
  8. 결국 major GC가 수행되고 old generation을 collect하고 압축한다.

출처 : https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

profile
안녕하세요

0개의 댓글