일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 자바stream
- Programmers도둑질
- 프로젝트회고
- 스프링핵심요소
- 프로그래머스도둑질
- 자바스크립트filter
- 클라우드타입
- node의존성주입
- 모놀리틱 아키텍처
- 자바foreach
- 객체지향solid
- 자바reduce
- 자바배열정렬
- 자바 가비지컬렉션
- 우선순위큐자바
- 객체지향다형성
- 프로그래머스가장큰수
- 객체지향추상화
- 자바리스트정렬
- 자바Comparator
- 자바filter
- 자바스크립트map
- openvidu
- 자바Comparable
- webrtc
- 자바스크립트reduce
- Programmers가장큰수
- 자바스크립트foreach
- 팀프로젝트
- 도둑질자바
- Today
- Total
I'm pine thank you and you?
[JAVA] Garbage Collector 개념, 알고리즘, 원리 본문
가비지 컬렉터를 알아보기 전에 JVM 메모리 구조를 먼저 살펴보자.
Method Area ( == Static Area)
Heap
애플리케이션 실행 중에 생성한 모든 객체가 저장되는 영역 (new를 통해 생성한 모든 Object 타입의 인스턴스가 저장된다.)
메모리가 동적으로 할당된다. 👉 인스턴스가 소멸되면 같이 소멸
Heap 영역에 보관되는 메모리는 메소드 호출이 끝나도 사라지지 않고 유지되다가 이것을 JVM의 가비지 컬렉터 가 메모리 해제하여 처리 👉 자신을 참조하는 데이터가 없으면 메모리 정리 대상이 됨
Stack
PC Register
Native Method Stack
Garbage Collector란?
동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 역할
public class Main {
public static void main(String[] args) {
int num1 = 10;
int num2 = 5;
String name = "pine";
System.out.println(num1 + num2);
System.out.println(name);
}
}
메인 메서드가 실행되면 stack에 num1, num2가 쌓이게 되고, 메인 메서드 실행이 끝나면 stack에 있는 데이터들이 전부 pop 된다.
Heap 영역에 name 객체만 남게된다.
이런 객체를 Unreachable Object 라고 표현하고 가비지 컬렉터의 대상이 된다.
장점
- 메모리 누수 방지
- 해제된 메모리 접근 방지
- 해제한 메모리를 다시 이중 해제하는 것 방지
단점
- 개발자가 언제 GC가 메모리를 해제하는지 모름
- 실행중인 애플리케이션이 리소스를 GC 작업에 내줘야 하므로 오버헤드 발생할 수 있음
알고리즘
Reference Counting
Reference count란 객체에 접근 할 수 있는 방법 수를 의미한다.
해당 객체에 접근할 수 있는 방법이 없다면 즉, Reference count가 0이 되면 가비지 컬렉션의 대상이 된다.
But❗️
이 알고리즘은 순환참조의 문제가 발생할 수 있다.
Root Space에서 Heap space 접근을 모두 끊는다고 가정하면, 오른쪽 그림의 노란색 부분은 서로가 서로를 참조하고 있기 때문에 Reference count가 1로 유지되면서 사용하지 않는 메모리 영역이 해제되지 못하고 메모리 누수가 발생하게 됩니다.
Mark and Sweep
자바는 이 방식으로 GC를 진행한다!
Root space 에서부터 해당 객체에 접근 가능한지를 해제의 기준으로 합니다.
- 가비지 컬렉터가 Stack의 모든 변수를 스캔하면서 각각 어떤 힙에 있는 객체를 참조하고 있는지 찾아서 마킹한다. (Mark 과정)
- 마킹하고 있는 객체가 참조하고 있는 객체 또한 찾아서 마킹한다. (Mark 과정)
- 마킹되지 않는 객체를 Heap에서 제거한다. (Sweep 과정)
❓Root space가 어디야
언제? 어떻게?
용어
Young Generation에서 발생하는 GC는 Minor GC, Old Generation에서 발생하는 GC는 Major GC라고 부른다.
Young Generation은 Eden, Survival 0, Survival 1 영역으로 나뉜다.
- Eden
- 새롭게 생성된 객체들이 할당되는 영역
- Survival 0, 10 또는 1 둘중 하나는 반드시 비어있어야 한다.
- 둘로 나눠져 있는 이유는 메모리의 단편화를 막기 위해서
- Minor GC로부터 살아남은 객체들이 존재하는 영역
실행 과정
1. 새로운 객체가 계속 생성되다가 Eden 영역이 꽉차는 순간 Minor GC 실행
2. Mark and Sweep이 진행되고 Reachable이라고 판단되는 객체들은 Survival 0 영역으로 옮겨진다.
3. 다시 또 Eden 영역이 꽉차게 되면 다시 Minor GC 실행
4. 이번에는 Reachable이라고 판단된 객체들이 Survival 1 영역으로 옮겨진다.
5. Survival 칸이 꽉 차게 되면 해당 객체를 Old Generation으로 넘겨준다.
6. 언젠가 Old Generation 영역이 꽉차게되면(age를 초과했다고 표현한다.) 이때는 Major GC 실행
7. Mark and Sweep 방식을 통해 필요없는 메모리를 비워줍니다.
❓왜 Young Generation과 Old Generation으로 나눴을까
GC도 결국 비용이므로 메모리의 특정 부분만을 탐색하여 해제하면 효율적이기 때문에 Young Generation에서 최대한 처리하도록 나눔
G1 GC
Java9 이상 부터는 G1 GC를 기본 GC 방식으로 사용하기에 이 방법만 설명하겠다.
(나머지 방법은 이곳을 참고해주세요.)
G1는 Garbage First의 줄임말로, Heap을 일정 크기의 Region으로 나눠서 어떤 영역은 Young Generation, 어떤 영역은 Old Generation으로 활용한다.
실행 과정은 위와 같음.
'CS' 카테고리의 다른 글
[Spring] Spring 핵심요소 - IoC, DI, AOP, PSA (1) | 2023.07.10 |
---|---|
객체 지향 프로그래밍에 대해서 (1) | 2023.06.06 |
[DB] Redis 개념, 특징 (0) | 2023.03.22 |
WebRTC가 무엇일까? (용어, 샘플, openvidu) (0) | 2023.03.04 |
[아키텍처] MSA / 멀티모듈 단일프로젝트? 단일모듈 멀티프로젝트? (0) | 2023.02.12 |