-
GC
GC
- 프로그램이 동적으로 할당했던 메모리 영역 중 필요 없게 된 영역을 해제하는 기능이다.
- JVM의 Heap영역을 관리한다.
- 장점
- 동적으로 할당한 메모리 영역의 전체를 완벽하기 관리할 필요가 없어진다.
- 다음과 같은 버그를 줄이거나 완전히 막을 수 있다.
- 유효하지 않은 포인터 접근: 이미 해제된 메모리에 접근하는 버그.
- 이중 해제: 이미 해제된 메모리를 다시 해제하는 버그.
- 메모리 누수: 더는 필요하지 않은 메모리가 해제되지 않고 남아있는 버그.
- 단점
- 어떤 메모리를 해제할지 결정하는데 비용이 발생한다.
- GC가 일어나는 타이밍이나 점유 시간을 예측하기 어렵다. 그러므로 프로그램이 예측 불가능하게 일시적으로 정지할 수 있으므로 실시간 시스템에는 적합하지 않다.
GC의 종류
- Minor GC
- JVM Heap의 Young영역(객체가 처음 생성될때 저장되는 영역)에서 돌아가는 GC이다.
- 활성 객체만 남기고 비활성 객체는 Clear된다. 계속해서 활성 객체로 생존하는 객체들은 시간이 지남에 따라 Old영역으로 이동한다.
- Full GC
- JVM Heap의 Old영역(Young영역에 존재하던 객체들이 오래되어 저장되는 영역)에서 돌아가는 GC이다.
- Old영역이 Full이 되면 수행되며 Old영역을 스캔하여 참조되지 않는 객체를 해제한다.
- Full GC가 일어나는 동안 JAVA 애플리케이션은 멈추기 때문에 속도가 느리고 성능에 아주 큰 영향을 끼친다.
GC동작 과정
- 처음 생성된 객체는 Young영역의 일부인 Eden영역에 위치한다.
- Micor GC가 발생하면 다른 곳에서 참조되지 않는 객체는 메모리에서 제거된다.
- Eden영역에서 살아남은 객체는 Young영역의 또다른 일부인 Survival영역으로 이동한다.
- Survival영역은 Survival1과 Survival2영역으로 구성되어 있는데, Minor GC가 발생할 때마다 Survival1영역에서 Survival2영역으로 또는 Survival1영역에서 Survival2영역으로 객체가 이동한다.
- 이 과정에서 더이상 참조되지 않는 객체는 메모리에서 제거된다.
- Minor GC가 발생하는 동안 Survival1, Survival2 영역을 오가며 살아남은 객체는 최종적으로 Old영역으로 옮겨진다.
- Old영역에 있다가 미사용 된다고 식별되는 객체들은 Full GC를 통해 메모리에서 제거된다.
포인터 추적 방식
- 대부분의 GC기법은 포인터 추적 방식을 사용한다.
- 한 개 이상의 변수가 접근 가능한 메모리는 앞으로 사용할 수 있는 메모리로 간주하고 그 밖의 메모리를 해제한다.
reference
goodgid.github.io/Java-Garbage-Collection-(1)/
goodgid.github.io/Java-Garbage-Collection-(2)/
mirinae312.github.io/develop/2018/06/04/jvm_gc.html
'CS > Java' 카테고리의 다른 글
JAVA - 오버로딩, 오버라이딩 (0) 2021.02.18 JAVA - 인터페이스와 추상클래스 (0) 2021.02.18 JAVA - JVM (0) 2021.02.17 JAVA - 접근 제어자 (0) 2021.02.17 JAVA - 객체지향 (0) 2021.02.17