일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 백준알고리즘
- 1과목
- 공부일지
- softeer
- 코틀린
- MYSQL
- 백준 알고리즘
- python
- SQL
- SW봉사
- 스프링
- BFS
- 소프티어
- 자바
- CJ UNIT
- 알고리즘
- 시나공
- 파이썬
- programmers
- 정보처리산업기사
- 문제풀이
- 회고
- 프로그래머스
- 코딩봉사
- 데이터베이스
- kotlin
- 코딩교육봉사
- C++
- java
- 백준
- Today
- Total
JIE0025
[Java] GC(Garbage Collection) 가비지컬렉션이란? 본문
✅ 개요
자바의 가장 큰 장점 2가지를 말하라 하면
첫째는JVM을 이용하여 운영체제에 독립적이라는 것과
둘째는 JVM의 가비지 컬렉터를 통해 메모리 해제를 개발자가 컨트롤하지 않아도 된다는 점이다.
가비지 컬렉션이란 무엇일까?
가비지컬렉터는 어떤 영역의 메모리를 관리해줄까?
왜 해당 영역의 메모리 해제가 필요할까?
가비지 컬렉터는 어떤 방식으로 작동할까?
내부적으로 어떻게 움직이는지 살펴보면서 가비지컬렉션에 대해 잘 이해해보자.
✅ 자바 메모리 구조
우리는 JVM의 동작원리를 살펴보면서,
JVM 내부적으로 어떤것들이 존재하고,
각각 어떤 역할을 하는지에 대해 미리 살펴본적이 있다.
https://jie0025.tistory.com/229
JVM 내부 그림은 다음과 같았다.
클래스로더가 컴파일된 바이트코드(.class)를 로딩하고, Runtim Data Area에 배치하면,
실행엔진이 Runtime Data Area 에 배치된 코드를 동작하며 실행된다.
1. 인터프리터 (Interpreter) : 바이트 코드를 기계어로 해석하여, 한줄씩 실행
2. JIT Compiler : 인터프리터의 느린 성능을 보완하기 위해 성능을 향상시킨 컴파일러
반복되는 코드를 컴파일해서 사용함
3. Garbage Collector
메모리를 자동으로 관리하는 자바 프로그램
- 데몬스레드에서 항상 백그라운드로 실행
- 힙영역의 메모리를 판단해, 더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제함
✔️ 가비지 컬렉션 - 메모리관리방법(시스템에서 더이상 사용하지않는 동적할당된 메모리 블록을 회수하는 것)
✔️ 가비지 컬렉터 - 가비지컬렉션을 수행하는것.
✅ Runtime Data Area
1. Method Area : 클래스 수준의 정보 저장
클래스 멤버 변수 이름, 데이터 타입, 리턴타입, 상수풀, static변수 등
2. Heap Area : 생성된 Object, 배열등이 저장
3. Stack Area : 스레드가 생성될 때마다 생성되는 영역
지역변수 저장
메소드 호출할 때마다 스택이 개별적으로 생성 -> 동시성 문제를 해결하기 위해서 메소드에 동기화 블럭 지정
4. PC Register : 스레드가 생성될 때마다 생성되는 영역
PC = Program Counter로 현재 스레드가 실행하는 부분의 주소와 명령을 기억하고 있음.
5. Native Method Stack : 자바 언어 이외의 언어로 작성된 코드를 저장하는 메모리 영역, Native 키워드가 붙은것들이 저장
⏺ Stack, Heap의 이해
아래 영상이 스택과 힙에 어떻게 데이터가 생기고 참조하는지 잘 설명하는 것 같아 가져왔다.
https://tv.kakao.com/v/426964287
✅ GC가 다루는 메모리의 영역
Heap영역에는 모든 Object타입(Integer, String 등)이 생성된다.
new연산자로 생성된 객체나 배열등이 저장되어있는데, 언젠가 해당 값들은 참조되지 않을것이다.
✅ 왜 Heap영역의 데이터를 삭제해주는걸까?
멀티스레드의 관점에서 각 영역을 어떻게 사용하는지 확인해야한다.
메소드영역과 힙영역은 모든 스레드가 공유하고,
스택영역, PC Counter는 각 스레드 별로 하나씩 생성된다.
다시 말하면
스레드마다 고유하게 생기는 스택영역은 다른 스레드에서 접근이 불가능하지만
메소드영역, 힙영역은 모든 스레드에서 접근이 가능하다는 이야기이다.
프로그램의 메모리는 한정되어있는데, 많은 스레드에서 힙영역에 계속해서 메모리가 할당해버리면, 메모리 누수가 발생한다.
메모리 누수를 방지하기 위해, 더이상 참조되지 않는 객체들을 지우는 것이 필요하다.
🤔 자바와 다른언어의 메모리 해제
실제로 Low Level의 언어인 C, C++에선 개발자가 직접 메모리해제를 해야한다.
하지만 자바에서는 Garbage Colletor가 이 역할을 수행한다.
📣 가비지 컬렉터의 동작 방식
가비지컬렉터는 간단하게 요약하면 다음과 같이 동작한다.
👩💻 Stop The World
가비지 컬렉션을 수행하기 위해 JVM이 애플리케이션의 실행을 일시 정지한다.
가비지 컬렉션이 실행되면 GC작업을 맡은 스레드를 제외하고, 나머지는 모두 멈춘다.
GC작업이 종료되면 다시 재개된다.
👩💻 Mark and Sweep
Mark : 객체를 찾아 마킹한다
1. Garbage Collector가 스택의 모든 변수를 스캔하며, 각각 어떤 객체를 참조하고 있는지 찾아서 마킹
2. Reachable Object(참조되고 있는 객체)도 찾아서 마킹한다.
Sweep : 사용되지 않는 객체를 쓸어내린다.
3. 마킹되지 않은 객체 == UnReachable Object를 Heap영역에서 제거한다.
✏️ Minor GC & Major GC
Heap에는 Young Generation영역과 Old Generation영역으로 나눠진다.
* Young Generation영역은 eden과 Survivor 0, Survivor 1로 다시 나뉜다.
- Young Genration에서 일어나는 GC = Minor GC
- Old Generation에서 일어나는 GC = Major GC
1. 새로운 객체가 생성되면 이 객체는 Eden영역에 위치하게 된다.
2. eden영역이 꽉차면 GC가 발생한다. (Mark And Sweep)
3. 이때 살아남은 객체는 Survivor Space에 이동한다.
4. Suvival0이 꽉차면, GC가 발생된다. 이때 살아남은 객체들은 Survival1영역으로 이동하고,
Eden에서 살아남은 객체들은 Survival1로 쌓이게 된다 (현재 쌓이고 있는 영역으로_)
** 0과 1중 한 영역은 무조건 비어있다.
5. Survival1이 꽉차면 Survival0으로 이동 0이 꽉차면 1로 이동 ... 등등을 반복한다.
6. Survival 영역에선 객체들에 age값을 부여하는데, age가 특정값보다 커지면 이때 old Generation으로 이동한다.
7. OldGeneration영역마저 다 사용되면 또 GC가 발생하는데 이것이 Major GC이다.
⏺ GC를 통해 얻는 장점
개발자가 동적으로 할당되는 메모리를 관리할 필요가 없어진다.
>> 비즈니스 로직 자체에만 집중할 수 있다.
⏺ 단점
가비지컬렉션이 수행되는 정확한 시점을 알 수 없다.
가비지 컬렉션이 수행될 때는 반드시 애플리케이션을 중지시키는 Stop the World가 수행되는데, 이것이 오버헤드를 일으키고 성능저하의 원인이 될 수 있다.
프로그램이 예측 불가능하게 일시정지 된다는 특징 때문에 실시간 시스템엔 적합하지 않다.
다음은 좀더 깊게 GC의 4가지 종류에 대해서 알아봐야겠다 :)
https://d2.naver.com/helloworld/1329
https://spurdev.tistory.com/10
https://youtu.be/vZRmCbl871I
https://blog.metafor.kr/163
'개발 > Java, Kotlin' 카테고리의 다른 글
[Kotlin] 코틀린이란 (왜 필요하고, 왜 배워야할까) (0) | 2023.05.23 |
---|---|
[Java] Collection Framework (List, Queue, Set) & Map (0) | 2023.05.06 |
[Design Patten] Proxy (0) | 2022.12.12 |
[Design Patten] Singleton (0) | 2022.12.07 |
[WhiteShip][13주차] I/O (0) | 2022.11.26 |