저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다
1. 루트 노드 열거
- GC 루트 노드로부터 참조 체인을 찾는 작업
- 스택 프레임을 비롯하여 정적 변수, 레지스터 등을 포함하여 추적
- 루트 노드를 열거하려면 stop the world를 피할 수 없음
OopMap
- Object Offset Map
- 각 스레드의 스택에 있는 객체 참조의 위치를 기록하는 맵
- 안전 지점이라는 특정한 위치에만 기록
- OopMap을 모든 명령어에 생성하지 않음
객체 이동 지원
- GC에 의해 참조가 변경될 경우, 스레드 스택에 있는 참조가 올바르게 갱신되도록 합니다.
2. 안전
안전 지점
- 일시 정지 상태를 트리거하는 지점
- jvm이 스레드의 상태를 안전하게 분석하고, 참조 관계를 변경하지 않을 것임을 보장
자발적 멈춤
- 플래그 비트 사용
- 각 스레드들은 플래그 비트를 폴링
- 플래그가 켜지면 가까운 안전 지점에서 스스로 멈춤
- GC가 스레드 수행에 관여 X
선제적 멈춤
- JVM이 인터럽트를 발생시켜 강제로 스레드들이 안전 지점까지만 실행되도록 함
- 스레드의 코드가 GC 고려 안함
- 예외
- sleep, blocked 된 상태의 스레드는인터럽트 요청에 응답 못함
- GC가 발생할 때, 안전 지점까지 수행될 수 없음
- 이로 인해 거의 사용 안됨
예시
- GC 실행
- GC가 필요한 지점에 호출되도록 셋팅됨
- GC가 실행되면 모든 스레드가 가장 가까운 안전 지점까지 실행하고 멈춤
- 스레드 상태 확인
- 메서드 호출
안전 지역
- GC가 실행되는 동안 스레드가 참조 관계를 변경하지 않도록 보장되는 영역
- 사용자 스레드는 안전 지역에 진입했음을 표시함
성능 최적화
- 안전 지역에 있다면 안전 지점까지 도달하지 않아도 GC가 제대로 동작할 수 있음
3. 기억 집합
- 비회수 영역에 있는 객체들이 회수될 참조들을 기록하는 데이터 구조
- 젊은 세대와 노년 세대간의 참조 관계를 추적하는 데 사용됨
정밀도
워드 정밀도
- 메모리 워드 단위로 참조를 기록
- 관리단위가 작음
- 정확성 높음
객체 정밀도
- 객체 하나에 대한 참조를 기록
- 효율적인 공간 사용
- 특정 객체 내 참조 위치를 정확히 파악하기 어려움
카드 정밀도
- 메모리 블록 단위로 참조를 기록
- 효율적인 공간 사용
- 특정 객체 내 참조 위치를 정확히 파악하기 어려움
카드 테이블
- 카드 정밀도로 참조를 기억할 때의 기록 공간
- 바이트 배열로 참조 관리
카드 페이지
- 메모리 블록 하나 사이즈
- 한 카드 페이지는 특정 메모리 영역을 가리킴
- 카드 페이지의 데이터가 변경되는 시점
- 참조 타입 필드에 값이 대입되는 순간
객체 회수
- 카드 테이블 확인
- 더럽혀진 카드 페이지만 확인
- 세대 간 참조 확인
- 해당 영역에 세대간 포인터를 포함하는지 확인
4. 쓰기 장벽
- 카드 페이지 관리 방식
AOP Aspect
- 참조 타입에 객체가 대입되면 어라운드 어드바이스가 생성되어, 대입 전후로 추가 동작을 하도록 함
- 보통 대입 후로 추가동작이 실행됨
단점
- 오버헤드 발생
- 거짓 공유
- 낮은 수준에서 동시성을 동기화할 경우 발생하는 문제
- CPU의 캐시 시스템은 캐시 라인 단위로 관리
- 공유하는 변수가 같은 캐시 라인에 있다면 동기화를 진행
- 실제 공유하고 있지 않더라도 동기화, 라이트백, 무효화 등의 추가작업이 발생
- 성능이 떨어짐
- 낮은 수준에서 동시성을 동기화할 경우 발생하는 문제
매개 변수
- -XX: +UseCondCardMark: 거짓 공유 체크 활성화
5. 동시 접근 가능성 분석
삼색 표시 기법
- 객체 그래프 탐색 중, 객체를 세가지 색으로 구분하여 어떤 상태인지 추적하는 알고리즘
- 마주치는 객체들에 특정 조건의 방문 객체임을 체크
흰색
- 가비지 컬렉터가 방문한 적 없는 객체
- 최종 상태에서 흰색으로 남아있으면 회수됨
검은색
- 가비지 컬렉터가 방문한 적 있는 객체
- 해당 객체를 가리키는 모든 참조가 스캔이 완료된 상태
- 확실히 생존함을 뜻함
- 이미 검은색이라면 체크 안해도 됨
회색
- 가비지 컬렉터가 방문한 적 있는 객체
- 해당 객체를 가리키는 일부의 참조만이 스캔된 상태
객체 사라짐 문제
- 사용자 스레드와 GC가 동시 수행 시, 문제 발생
- 살아있는 객체를 죽었다 표시
- 회수되지 않아야 할 객체가 회수됨
'Java' 카테고리의 다른 글
[JVM 밑바닥까지 파헤치기] 3-5. 가비지 컬렉터와 메모리 할당 전략: 저지연 가비지 컬렉터 (0) | 2024.12.21 |
---|---|
[JVM 밑바닥까지 파헤치기] 3-4. 가비지 컬렉터와 메모리 할당 전략: 클래식 가비지 컬렉터 (0) | 2024.12.21 |
[JVM 밑바닥까지 파헤치기] 3-2. 가비지 컬렉터와 메모리 할당 전략: 가비지 컬렉션 (0) | 2024.12.21 |
[JVM 밑바닥까지 파헤치기] 3-1. 가비지 컬렉터와 메모리 할당 전략: 회수 (1) | 2024.12.19 |
[JVM 밑바닥까지 파헤치기] 2. 자바 메모리 영역과 메모리 오버플로 (1) | 2024.12.19 |