* 공부하기 위해 크롤링 후 공부
GC의 동작 방식
1. 힙 메모리 영역에서 다음 메모리 할당을 위한 포인터가 존재한다.
2. 힙에 무언가를 할당하면 그 크기만큼 포인터가 이동한다.
3. GC의 특정 조건이 만족되면 모든 스레드를 중단하고, GC 쓰레드를 활성화한다.
4. 레퍼런스가 존재하지 않는 메모리들을 삭제하고, 사용 중인 메모리들의 위치를 재조정한다.
장점
- 자동으로 메모리가 관리되기 때문에 프로그래머가 관리할 필요가 없다.
- 메모리 누수가 없어진다.
- 유효하지 않은 포인터에 접근하지 않는다.
- 이중해제 문제에서 자유롭다. (이미 해제된 메모리를 다시 해제하는 오류)
단점
- 해제할 메모리를 조사하는데 비용이 든다.
- 할당된 메모리가 해제되는 시점을 알 수 없다.
- 실시간 시스템에서 프로그램 동작 중 GC가 원하지 않는 순간 발생하면 프로그램 동작에 문제가 생길 수 있다.
세대별 GC
GC를 최적화하는 기법은 세대별 GC라는 것이 존재한다.
3가지 세대(0세대, 1세대, 2세대)로 구분되어
최초 GC를 실행한 뒤, 살아남은 객체는 1세대로 옮겨진다.
이후 새롭게 할당된 메모리들에 대해서만 레퍼런스를 검사하고 GC를 수행하다가
0세대가 용량 한계가 되면, 1세대에 대해서도 레퍼런스 검사를 하고 살아남은 1세대는 2세대로 옮긴다.
메모리에 남아있었던 객체의 메모리들은 2세대에 계속 남아있게 되며,
모든 메모리의 레퍼런스를 검사하는 것보다는 없어질 가능성이 높은 메모리들에 대해서만 먼저 검사를 하는 것.
잠깐 쓰고 사라져도 되는 객체를 상대적으로 크기가 작은 New 영역에 할당하고, New 영역에서 기준 시간 이상으로 오래 살아남은 객체가 있다면 Old 영역으로 이동시켜 "세대" 구분을 하는 방법이 사용되고 있다.
0세대 : GC가 아직 적용되지 않은 것
1세대 : 0세대와 2세대 사이
* 1세대는 GC 후 남은 것을 옮긴 객체임
2세대 : GC를 2번 이상 겪고도 힙에 저장되어 있는 객체임
GC가 실행되면 0->1->2 순으로 세대 변경이 되거나, 삭제됨.
0세대 -> GC를 시키면 1세대로 이동 -> 또 GC를 해서 살아남은 것은 2세대로 이동
* JAVA 8 과 JAVA 11의 GC 변경점
(추가) 없애는 날 전체 이해한 것으로...
출처 : https://mentum.tistory.com/482
https://namu.wiki/w/%EC%93%B0%EB%A0%88%EA%B8%B0%20%EC%88%98%EC%A7%91
https://cyk0825.tistory.com/88?category=1124085
댓글
댓글 쓰기