반응형
JVM이란
특정 플랫폼에 구애받지 않고 자바 소스로 개발한 프로그램을 컴파일하여 만들어지는 바이트코드를 실행시키는 가상머신을 말한다.
가비지컬렉터
동적으로 할당된 메모리(heap)의 영역 중 사용하지 않는 영역을 해제하는 것을 말한다.
메소드가 실행되면 스택과 힙(큐)에 데이터가 저장되는데
오브젝트의 경우 stack에 주소값이 저장되고 힙에 데이터가 저장된다.(스택: 주소값 저장, 힙(큐): 데이터 저장)
스택에 저장된 테이터들은 메스드가 끝나는 동시에 사라지고
이때 힙에는 데이터가 남아있지만 스택에서 주소값 정보가 사라진다.
가비지컬렉터는 이때 스택에 데이터가(주소값) 가리키는 정보가 큐에 없을 경우 데이트를 삭제하는 것 을 말한다.
가비지 컬렉터 과정
1. 가비지 컬렉터가 Stack의 모든 변수를 스캔하면서 변수들이 객체를 참조하고 있는지 마킹한다.
2. 1에서 마킹한 객체가 또다른 객체를 참조하고 있는지 마킹한다.
3. 마킹이 없는 객체를 힙에서 제거한다.
과정 상세
힙은 New Generation과 Old Generation으로 나뉘어져 있다.
New Generation은 Eden과 Survival0 Survival1로 나뉘어져 있다.
| Heap |
| New Generation | Old Generation |
| Eden | Survival0 | Survival1 | Old Generation |
우선 Eden에 데이터들이 쌓이고 Eden 영역의 모든 메모리들이 사용이 되었다면 가비지 컬렉터가 발생한다.
이때 가비지 컬렉터 과정(marker and sweep)이 일어나고 제거되고 남은 데이터들은 Survival0으로 이동한다.
Survival0의 영역의 메모리들이 사용된다면 다시한번 가비지 컬렉터 과정이 일어나면 제거되고 남은 데이터들은 Survival1으로 이동하는데 이때 Age의 값이 증가한다.
Survival0이 비워지고 Survival1에 데이터가 쌓이게되면 Eden에서 가비지 컬렉팅 과정이 일어날 때 비어있는 Survival0에 데이터가 쌓이는게 아니라 이미 차 있는 Survival1에 데이터가 쌓인다.(Age가 0인 데이터와 1이상인 데이터가 공존하게 된다.) 이때 Survival1이 가득차게 되면 가비지 컬렉팅 과정이 일어나고 데이터를 다시 Survival0으로 옮기면서 Age를 증가신킨다. 이러한 과정들이 일어나면서 특정 Age를 넘는 데이터들이 존재하게 되면 이를 Old Generation으로 이동시키는데 이를 Promotion이라고 한다. Promotion이 계속일어나면서 Old Generation 또한 가득 차게 되면 다시한번 가비지 컬렉터가 발생하는데 이를 메이저 가비지 컬렉팅 이라고한다.
반응형
'코틀린' 카테고리의 다른 글
비동기 callback을 동기로 처리하기 suspendCoroutine, suspendCancellableCoroutine (0) | 2022.05.23 |
---|---|
코틀린 StateFlow 및 SharedFlow (2) | 2022.05.21 |
코루틴 채널 개념 및 예제 (0) | 2022.05.07 |
코틀린 코루틴 개념 및 기본 사용 용도 정의 (0) | 2021.06.23 |
primitive wrapper (0) | 2021.05.19 |