Garbage-First Garbage Collector.pdf
0.33MB

GC : 프로그램이 동적으로 할당했던 메모리 영역중 필요업게 된 영역을 알아서 해제

장점 : 메모리 누수 방지, 해제된 메모리 접근 방지, 해제한 메모리의 해제 방지

단점 : GC작업은 순수 오버헤드

GC알고리즘

  1. Reference counting
    1. 힙영역에 선언된 객체들이 레퍼런스카운트 숫자를 갖는다.
    2. 레퍼런스 카운트가 0이면 GC대상
    3. 순환참조 문제발생 (메모리 릭 발생)
  2. Mark and sweep
    1. 순환 참조 문제해결
    2. 루트에서부터 해당 객체에 접근가능한지 기준
    3. Mark : 루트부터 연결된 객체찾는것 (reachable)
    4. Sweep : 연결이 끊어진 객체 지우는것(unreachable)
    5. Compaction : 메모리 파편화 막음 (필수 아님)
      1. Sweep 후에 분산된 객체들을 Heap 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 압축한다
    6. 단점 : 의도적으로 GC실행 시켜야함, 어플리케이션과 GC실행이 병행

Root space

  • JVM메모리의 stack의 로컬변수 , method area에 저장된 static변수 , native method stack의 C/C++ 작성되 JNI참조

Heap :

  1. Young
    1. Eden : minor GC
    2. Survival 0 : minor GC
    3. Survival 1 : minor GC (서바이벌0,1 둘중하나만차야함)
  2. Old : (young -> old : promotion)
    1. Major GC 발생

대부분 객체가 수명이 짧음

메모리의 특정부분만 처리(영부분)

Stop the world

GC실행을 위해 JVM이 어플리케이션 실행을 멈추는것

 

GC 방식

  1. Serial GC
    1. 하나의 스레드로 GC실행
    2. Stw 시간이 김
    3. 싱글 스레드 환경 및 heap이 매우 작을때 사용
    4. compaction
  2. Parallel GC
    1. 여러개의 스레드로 GC실행
    2. 멀티코어 환경에서 사용
    3. Java8 default GC
    4. Compaction (mark-summary-compaction)
  3. CMS (concurrent mark sweep)
    1. stw시간을 최소화하기위해 고안
    2. GC 작업을 어플리케이션과 동시에 실행
    3. G1 GC 등장에 따라 deprecated
    4. compaction이 기본적으로 제공되지않음
  4. G1 GC
    1. heap을 region으로 나누어 관리
    2. Java9 default
    3. Compaction 작업수행
    4. Heap을 일정크기의 리전으로 잘게 나눠서 어떤영역은 올드 ,영으로 나눠서 튜닝한다.전통적인 GC 힙구조와 달리 young 이나 old 영역이 인접해 있지 않고 영역의 사이즈에 따라서 동적으로 바뀔 수 있다.
    5. G1 GC 영역의 개념이 물리적으로 존재하지 않고 논리적으로 존재함으로써 공간과 시간을 아낄 있다.
    6. 메모리가 많이 차있는 리전을 인식하는 기능을 통해 메모리가 많이 차있는 리전을 우선적으로 GC한다.
    7. 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 종류 변화

  1. Serial GC
  2. Parallel GC
  3. Parallel Old GC
  4. CMS GC
  5. 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

+ Recent posts