-
[JAVA] Garbage CollectorCS/Java 2021. 7. 17. 21:37
📝 Garbage Collector
✨ 해당 글은 아래 [10분 테코톡]을 듣고 작성했습니다.✨
🙋♀️ 먼저 JVM에 대해 간단하게 알아보고 가자.- OS의 메모리 영역에 접근하여 메모리를 관리하는 프로그램이다.
- 자바 바이너리 코드(.class) 를 읽고 검증하며 실행 환경의 규격을 제공한다.
- 메모리 관리, GC를 수행한다.
📌 GC란 무엇일까?
🔎 먼저 간단하게 알아보자.
- Garbage Collector
- 동적으로 할당된 메모리 영역 중 사용하지 않는 영역을 탐지하여 메모리에서 해제하는 기능을 제공한다.
🔎 동적으로 할당된 메모리란 무엇일까?- JVM의 Runtimdata Area
- JVM의 메모리 영역으로 자바 어플리케이션 실행시 사용되는 데이터를 적재하는 영역이다.
- Method, Stack, Heap, PC Register, Native Method Area가 있다.
- JVM의 Stack 영역- 정적으로 할당된 메모리 영역이다.
- 지역변수, 파라미터 리턴값, 연산에 사용되는 임시 값 들을 저장한다.
- JVM의 Heap 영역- 동적으로 할당된 메모리 영역이다.
- new 키워드로 생성된 객체와 배열이 저장된다.
- 이 영역을 관리하는 것이 GC이다.
📌 GC 과정을 알아보자.
🔎 먼저 간단하게 알아보자!
- GC가 Stack의 모든 변수를 스캔하며 각각 어떤 Heap의 객체를 참조하고 있는지 찾아서 마킹한다.
- 해당 객체가 또 참조하고 있는 객체가 있다면 찾아서 마킹한다.
- 마킹되지 않은 객체를 Heap에서 제거한다.
🔎 GC는 언제 일어날까?
- Heap의 영역은 다음과 같은 영역으로 나누어져 있다.- Young영역 - Eden, Survivar1, Survival2
- Old영역
- Heap의 데이터는 다음과 같은 순서대로 영역에 저장된다.- 새로운 객체 생성 -> Eden영역 -> (Survival1 영역 <-> Survival2 영역) -> Old 영역
- Heap의 각 영역에 따라 발동되는 GC 또한 다르다.- Minor GC - Young영역에서 더 이상 참조되지 않는 객체의 메모리를 해제한다. 각 영역의 메모리가 다 차게 되면 실행된다.
- Full GC - Old영역에서 더 이상 참조되지 않는 객체의 메모리를 해제한다. Old 영역의 메모리가 다 차게 되면 실행된다.
🔎 그럼, GC 동작과정을 전체적으로 살펴보자.
- 처음 생성된 객체는 Young의 Eden에 저장된다.
- Eden영역이 다 차게 되면 Minor GC가 발동되어 참조되지 않는 객체를 메모리에서 해제한다.
- 이때 살아남은 객체는 Survival영역으로 이동한다.
- Survival 영역은 두 영역으로 나뉘어져 있다. 한 영역이 꽉 차서 Minor GC가 발동될 때마다 Survival1 영역에 있던 객체가 Survival2 영역으로 이동한다. (또 GC 발생시 반대로 이동)
- Survival1 영역과 Survival2 영역을 오가며 살아남은 객체는 최종적으로 Old 영역으로 옮겨지게 된다.
- Old영역이 Full이 되면 Full GC가 발동되고, 이때 JAVA 어플리케이션은 멈추기 때문에 성능에 큰 영향을 끼치게 된다.
📌 추가적으로 GC의 종류에 대해 알아보자.
🔎 Serial GC
- GC를 처리하는 스레드가 1개이다.- CPU 코어가 1개만 있을때 사용하는 방식이다.
- Mark-Cpmpact Collection 알고리즘을 사용한다. - GC후 남은 메모리를 한 곳으로 모아주어서 단편화를 없애준다.
🔎 Parallel GC
- GC를 처리하는 스레드가 여러개이다.- Serial GC보다 빠르게 처리할 수 있다.
- 메모리와 코어의 개수가 충분할 때 사용하면 좋다.
🔎 Concurrent Mark Sweep GC (CMS)
- Full GC시 자바 어플리케이션이 중단되는 시간을 줄인다.- Old 영역에서 사용된다.
- 응답 시간이 빨라야 할 때 사용한다.
- 다른 GC보다 메모리와 CPU를 많이 사용한다.
🔎 G1 GC
- 각 영역을 Region 영역으로 나눈다. (Eden, Survival, Old 내부에서 Region으로 또 나눠준다.)- GC가 일어날 때, 전체 영역(Eden, Sruvival, Old)을 탐색하지 않는다.
- 꽉 찬 Region 영역에 대해서만 GC를 수행한다.
- 자바 어플리케이션이 중단되는 시간이 짧다.
'CS > Java' 카테고리의 다른 글
[JAVA] 함수형 프로그래밍 (0) 2021.08.07 JAVA - 프레임워크, 라이브러리 (0) 2021.03.01 JAVA - 디자인 패턴 (0) 2021.03.01 JAVA - 데이터 타입, 변수 (0) 2021.02.28 JAVA - Servlet (0) 2021.02.28