프로그램이 동적으로 할당했던 메모리 영역중 (HEAP) 필요없게 된 영역 (참조 변수가 없을때) 을 알아서 해제 한다.
메모리를 수동 관리를 함으로서 발생되는 오류들을 막을 수 있다.
1. 메모리 누수 방지 (memory leak)
2. 해제된 메모리에 접근 방지
3. 해제한 메모리를 중복 해제 방지
-> 몇가지 방법으로 해당 객체에 접근 할 수 있는지를 count 하여 해당 count 가 0이 되면 객체를 GC 대상으로 삼는다.
-> 루트에서부터 해당 객체에 접근 가능한지에 따라 GC 대상 기준이 된다.
-> 루트로 부터 연결 된 객체들을 Reacheable , 연결되지 않았다면 Unreachable (Sweep 대상)
-> 자바와 자바스크립트 가 이용하는 알고리즘
Reference Counting 의 한계점을 해결 할 수 있다.
의도적으로 GC 를 실행시켜야한다. -> 어느 순간에서는 실행중인 어플리케이션이 GC에게 리소스를 내어줘야한다.
어플리케이션 실행과 GC 실행이 병핸된다.
어플리케이션의 사용성을 유지하면서 효율적으로 GC 를 실행하는 것이 꽤나 어렵고 중요한 작업이다.
"실행엔진" 에서 GC 실행!
Stack 의 로컬 변수
Method Area 의 static 변수
Native method stack 에 C/C++ JNI 참조
-> 둘중 한곳은 꼭 비어 있어야 한다.
Eden 영역이 꽉 차게 되면 Minor GC 가 동작하게 되고 살아남을 때마다 age-bit 가 1씩 증가된다.
일정 수준의 일정 bit 수를 넘어가면 자바에서 이 객체는 꾸준히 쓰이는 객체구나 라고 판별하여 Old generation 영역으로 옮긴다. (Promotion)
Java 8 기준 - age-bit 15 일때 Promotion 진행
Old generation 이 시간이 지나 다 차게 되면 , 그때 Major GC 가 동작 하여 Mark&Sweep 진행
객체의 생명주기를 분석해보니 대부분의 객체들은 수명이 짧다는 결과가 나왔다.
GC 도 결국 비용. 메모리 특정 부분만을 탐색하여 처리 한다면 훨씬 효율적이라 판단 .
어짜피 대부분의 객체들은 수명이 짧으니 특정 영역안에서 최대한 처리 하도록 하자 .
-> GC 를 실행하기 위해 JVM이 어플리케이션 실행을 멈추는 것
-> Stop The World 시간을 최소화 하자!
https://www.youtube.com/watch?v=FMUpVA0Vvj참조
https://www.youtube.com/watch?v=FMUpVA0Vvj참조
-> 메모리와 CPU 를 많이 사용하고 , Compaction (메모리 파편화 방지 하는 기술) 이 기본 제공 되지 않는다 라는 단점이 있다.
https://www.youtube.com/watch?v=FMUpVA0Vvj참조
런타임에 G1 GC 가 필요에 따라 영역별 Region 개수를 튜닝. -> Stop The World 시간 최소화