GC : 프로그램이 동적으로 할당했던 메모리 영역중 필요업게 된 영역을 알아서 해제
장점 : 메모리 누수 방지, 해제된 메모리 접근 방지, 해제한 메모리의 해제 방지
단점 : GC작업은 순수 오버헤드
GC알고리즘
- Reference counting
- 힙영역에 선언된 객체들이 레퍼런스카운트 숫자를 갖는다.
- 레퍼런스 카운트가 0이면 GC대상
- 순환참조 문제발생 (메모리 릭 발생)
- Mark and sweep
- 순환 참조 문제해결
- 루트에서부터 해당 객체에 접근가능한지 기준
- Mark : 루트부터 연결된 객체찾는것 (reachable)
- Sweep : 연결이 끊어진 객체 지우는것(unreachable)
- Compaction : 메모리 파편화 막음 (필수 아님)
- Sweep 후에 분산된 객체들을 Heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 압축한다
- 단점 : 의도적으로 GC실행 시켜야함, 어플리케이션과 GC실행이 병행
Root space
- JVM메모리의 stack의 로컬변수 , method area에 저장된 static변수 , native method stack의 C/C++ 작성되 JNI참조
Heap :
- Young
- Eden : minor GC
- Survival 0 : minor GC
- Survival 1 : minor GC (서바이벌0,1 둘중하나만차야함)
- Old : (young -> old : promotion)
- Major GC 발생
대부분 객체가 수명이 짧음
메모리의 특정부분만 처리(영부분)
Stop the world
GC실행을 위해 JVM이 어플리케이션 실행을 멈추는것
GC 방식
- Serial GC
- 하나의 스레드로 GC실행
- Stw 시간이 김
- 싱글 스레드 환경 및 heap이 매우 작을때 사용
- compaction
- Parallel GC
- 여러개의 스레드로 GC실행
- 멀티코어 환경에서 사용
- Java8 default GC
- Compaction (mark-summary-compaction)
- CMS (concurrent mark sweep)
- stw시간을 최소화하기위해 고안
- GC 작업을 어플리케이션과 동시에 실행
- G1 GC 등장에 따라 deprecated
- compaction이 기본적으로 제공되지않음
- G1 GC
- heap을 region으로 나누어 관리
- Java9 default
- Compaction 작업수행
- Heap을 일정크기의 리전으로 잘게 나눠서 어떤영역은 올드 ,영으로 나눠서 튜닝한다.전통적인 GC 힙구조와 달리 young 이나 old 영역이 인접해 있지 않고 영역의 사이즈에 따라서 동적으로 바뀔 수 있다.
- G1 GC는 영역의 개념이 물리적으로 존재하지 않고 논리적으로 존재함으로써 공간과 시간을 아낄 수 있다.
- 메모리가 많이 차있는 리전을 인식하는 기능을 통해 메모리가 많이 차있는 리전을 우선적으로 GC한다.
- https://luavis.me/server/g1-gc
Compaction :
- 더 이상 참조되지 않는 오브젝트가 해제된 이후 오브젝트들 사이의 빈공간을 없애기 위해 재배치
- 여유 공간을 큰 덩어리로 통합
- 선형
- TLAB (스레드 로컬 할당 버퍼)
GC튜닝
올드영역 객체최소화하기
Major GC시간 짧게
java -XX:+PrintCommandLineFlags -version
-XX:ConcGCThreads=3 -XX:G1ConcRefinementThreads=10 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=268435456 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=4294967296 -XX:MinHeapSize=6815736 -XX:+PrintCommandLineFlags -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC
openjdk version "18.0.2.1" 2022-08-18
OpenJDK Runtime Environment (build 18.0.2.1+1-1)
OpenJDK 64-Bit Server VM (build 18.0.2.1+1-1, mixed mode, sharing)
GC 종류 변화
- Serial GC
- Parallel GC
- Parallel Old GC
- CMS GC
- G1
CMS GC : 메모리 단편화발생
G1 GC :메모리 단편화 해결
GC 알고리즘
자바 GC
자바 GC 실행 방법
Jim memory leak
Scouter
Riverbed
NPM
CMS에서는 compaction을 직접해줘야하나 ?
STW는 정확히 언제 발생하는가 ?
G1 에서는 STW가 특정 구간에만 발생할 수 있는 이유는 ?
https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html
https://d2.naver.com/helloworld/329631
https://d2.naver.com/helloworld/1329
http://imp51.tistory.com/entry/G1-GC-Garbage-First-Garbage-Collector-Tuning https://thinkground.studio/%EC%9D%BC%EB%B0%98%EC%A0%81%EC%9D%B8-gc-%EB%82%B4%EC%9A%A9%EA%B3%BC-g1gc-garbage-first-garbage-collector-%EB%82%B4%EC%9A%A9/
'* > What I did today' 카테고리의 다른 글
How to Achieve More (3) | 2023.03.14 |
---|---|
DB Connection Pool (0) | 2023.02.15 |
Tree (0) | 2023.01.10 |
null 대신 Optional 클래스 (0) | 2023.01.02 |
static 변수는 JVM의 어디에 저장될까 ? (0) | 2022.12.25 |
JVM (0) | 2022.12.24 |
Java - static 사용의 지양 (0) | 2022.12.17 |
Cache (2) | 2022.12.15 |