jvm위에 동작하는 분산스토리지를 운영하기 위해, GC개념을 좀 더 정립하고가려한다.

아주 쉽게 정리된 글이 있어, 참고하여 정리해보았다.
https://d2.naver.com/helloworld/1329

불러오는 중입니다...

 

1. GC. General Garbage Collection.
java에서 메모리를 두 가지 영역으로 나눈다.
Young 영역과 Old 영역.

young generation 영역
old generation 영역

 

Q) old영역에 있는 객체가 young영역의 객체를 참조하는 경우는 어떻게 처리 될까?
A) old영역에는 512바이트의 덩어리로 되어 있는 카드 테이블이 존재.
카드 테이블에는 old영역에 이는 객체가 young 영역의 객체를 참조할 때마다 정보가 표시됨.
young영역의 GC를 실행할 때에는 old 영역에 있는 모든 객체의 참조를 확인하지 않고,
이 카드 테이블만 뒤져서 GC대상인지를 파악한다.
카드 테이블은 write barrier를 사용하여 관리함. 

2. Young 영역의 구성
 young영역은 1개의 eden영역과 2개의 survivor영역으로 나뉘고,
새로 생성한 객체 대부분이 eden영역에 생성됨.

위의 절차를 보면 survivor영역 2개 중 하나는 반드시 비어있는 상태로 남아있어야한다는것을 알수있음.
만약 두 survivor영역에 모두 데이터가 존재하거나, 두 영역 모두 사용량이 0이라면 시스템의 비정상이라고 생각하면 된다.

참고. bump-the-pointer, TLABs(Thread-Local Allocation Buffers)
HotSpot VM에서는 보다 빠른 메모리 할당을 위해 사용하는 기술.
bump-the-pointer는 Eden영역에 할당된 마지막 객체를 추적.
새로운 객체를 생성할 떄 마지막에 추가된 객체만 점검하도록함.
그러나 멀티 스레드 환경이라면?
Thread-safe하기 위해 여러 스레드 사용하는 객체를 Eden영역에 저장하려면, lock이 발생.
lock-contention 때문에 성능 저하.
그래서 TLABs 가 각각의 스레드가 각각의 몫에 해당하는 Eden영역의 작은 덩어리를 가질 수 있도록 하는 것.

3. Old영역에 대한 GC
serial GC, parallel GC, parallel old GC, Concurrent Mark&Sweep GC, G1GC 있다.

JAVA버전 마다 사용가능한 GC방식은 다른데, 
나는 CMS와 G1GC방식만 살펴봐야지.

3-1. CMS GC
Serial GC와 비슷한데, 다른 점은 GC가 발생하면서도 다른 스레드들을 실행중인 상태에서 동시에 진행됨.
클래스 로더에서 가장 가까운 객체 중 살아있는 객체만 찾음
concurrent mark단계에서 방금 살아있다고 확인한 객체에서 참조하고 이는 객체들을 확인.
remark단계에서는 concurrent단계에서 새로 추가하거나 참조가 끊기 객체를 확인.
concurrent sweep단계에서는 쓰레기를 정리하는 작업을 실행.
mark, seep 단계가 concurrent하게 진행됨. 즉, 다른 스레드가 실행되고 이는 상황에서 진행됨.
초기 mark와 remark에서만 stop-the-world갈 발생하므로 짧다!

그런데 단점이 존재하니, 
* 다른 GC방식보다 메모리와 cpu를 더 많이 사용하고,
* compaction단계가 기본적으로 제공되지 않는다.

따라서, 
* CMS GC를 사용할 때에는 신중히 검토한 후에 사용해야함.
* 조각난 메모리가 많아 compaction작업을 실행하면 다른 GC의 stop-the-world시간보다 더 길어질 수 있기에
* compaction 작업이 얼마나 자주, 오랫동안 수행되는지 확인해야한다.

각종 그림은 아래 오라클 기술섹션에서 볼수있다.
https://www.oracle.com/java/technologies/

 

Oracle Java Technologies | Oracle

In this issue, we examine three leading frameworks for microservices: Javalin, which is a very lightweight, unopinionated Kotlin-based web framework; Micronaut, which handles all feature injection at compile time and so loads extremely fast; and Helidon, w

www.oracle.com

 

3-2. G1 GC
지금까지의 Young영역과 old영역을 잊고, 그냥 큰 바둑판의 각 영역에 객체를 할당하고 GC를 실행한다.
어떤 GC보다 빠르고, JDK7에서 정식으로 G1 GC를 포함하여 제공하낟.

 

--------------

 

이것으로 오늘 아침 GC 공부를 마침.
나중에 오라클 홈페이지에서 jvm옵션들좀 봐야겠다아.

+ Recent posts