GC

정지원·2022년 5월 31일
0
post-thumbnail

왜 필요할까?

GC

프로그램이 동적으로 할당했던 메모리 영역중 (HEAP) 필요없게 된 영역 (참조 변수가 없을때) 을 알아서 해제 한다.

장점

메모리를 수동 관리를 함으로서 발생되는 오류들을 막을 수 있다.
1. 메모리 누수 방지 (memory leak)
2. 해제된 메모리에 접근 방지
3. 해제한 메모리를 중복 해제 방지

단점

  1. GC 작업은 순수 오버헤드 (어떠한 처리를 하기위해 들어가는 간접적인 처리 시간)
  2. 개발자는 언제 GC가 메모리를 해제하는지 모른다.

어떻게 동작할까?

Reference Counting 알고리즘

-> 몇가지 방법으로 해당 객체에 접근 할 수 있는지를 count 하여 해당 count 가 0이 되면 객체를 GC 대상으로 삼는다.

한계점

  • 힙 영역에서 객체끼리 순환 참조를 하게 될 경우 사용하지 않는 객체인데도 불구하고 GC 대상이 되지 않는다.

Mark And Sweep

-> 루트에서부터 해당 객체에 접근 가능한지에 따라 GC 대상 기준이 된다.
-> 루트로 부터 연결 된 객체들을 Reacheable , 연결되지 않았다면 Unreachable (Sweep 대상)
-> 자바와 자바스크립트 가 이용하는 알고리즘

장점

Reference Counting 의 한계점을 해결 할 수 있다.

단점

의도적으로 GC 를 실행시켜야한다. -> 어느 순간에서는 실행중인 어플리케이션이 GC에게 리소스를 내어줘야한다.

어플리케이션 실행과 GC 실행이 병핸된다.

어플리케이션의 사용성을 유지하면서 효율적으로 GC 를 실행하는 것이 꽤나 어렵고 중요한 작업이다.

JVM 에서의 GC

"실행엔진" 에서 GC 실행!

JVM 에서의 RootSpace

Stack 의 로컬 변수
Method Area 의 static 변수
Native method stack 에 C/C++ JNI 참조

Heap 영역

  • Young generation 과 Old generation 각각의 영역에서 사용하는 GC 가 다르다. (Minor/Major GC or Young/Full GC)

Young generation

  • Eden : 새롭게 생성된 객체들이 할당 되는 영역
  • Survival : Minor GC 로부터 살아남은 객체들이 존재 하는 영역

Survival 0 , Survival 1

-> 둘중 한곳은 꼭 비어 있어야 한다.

GC 동작방식

Eden 영역이 꽉 차게 되면 Minor GC 가 동작하게 되고 살아남을 때마다 age-bit 가 1씩 증가된다.
일정 수준의 일정 bit 수를 넘어가면 자바에서 이 객체는 꾸준히 쓰이는 객체구나 라고 판별하여 Old generation 영역으로 옮긴다. (Promotion)

Java 8 기준 - age-bit 15 일때 Promotion 진행

Old generation 이 시간이 지나 다 차게 되면 , 그때 Major GC 가 동작 하여 Mark&Sweep 진행

왜 나눴을까?

객체의 생명주기를 분석해보니 대부분의 객체들은 수명이 짧다는 결과가 나왔다.

GC 도 결국 비용. 메모리 특정 부분만을 탐색하여 처리 한다면 훨씬 효율적이라 판단 .
어짜피 대부분의 객체들은 수명이 짧으니 특정 영역안에서 최대한 처리 하도록 하자 .

Stop The World

-> 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 시간 최소화

profile
지속적인 발전, 태도

0개의 댓글