JVM 최적화

개발새발·2023년 5월 14일
0

java

목록 보기
11/12

이번주에 회사에서 JVM 최적화 이야기가 나와서 한번 찾아봤다.

JVM 최적화를 위해서는 GC에 대해 알아야한다. JVM 튜닝의 대부분의 메모리 튜닝이다. GC가 바로 JVM에서 메모리를 관리해주는 역할을 해주기 때문이다.

GC란?

Garbage Collector(가비지 콜렉터)
JVM에서 메모리를 자동으로 관리해주는 것
JVM메모리 중 Heap 영역에서 사용하지 않는 객체를 삭제

  • stop the world
    • 메모리가 관리되는 동안 Java Application이 멈추는 현
    • 이 현상이 발생하는 동안 GC스레드 외에 모든 스레드가 멈춤
    • 해당 현상이 발생하는 시간을 줄이기 위한 JVM 튜닝이 필요

Heap 영역

GC(G1GC제외) : Young Generation과 Old Generation 로 분리
G1GC : young, old, survivor 영역이 2차원 바둑판 형태로 나누어짐

https://memostack.tistory.com/228*Permanent 영역은 JAVA8부터 사라지고 Metaspace영역으로 전환됨


  • Young Generataion
    • Eden 영역 / Survivor 영역
    • 해당 영역에서 발생하는 GC = Minor GC
    • Eden
      • 새롭게 생성된 객체가 위치한 공간
      • 해당 영역이 꽉차면 GC발생 → Mark & Seep 과정 발생 → Minor GC
      • 사용중인 객체는 Survivor 영역으로 이동하고 Eden 영역은 비워짐
    • Survivor
      • Survivor 영역으로 이동된 객체는 age가 증가
      • 계속해서 살아남은 객체들은 2개의 Survivor 영역으로 이동하고 특정 age가 넘어가면 Old Genertaion으로 이동 → 이 과정을 promotion이라고 함
  • Old Generation
    • Young영역보다 크기가 큼
    • GC가 적게 발생하고 시간이 오래걸림. 즉 객체를 더 많이 가질 수 있기에 꽉 차고, 제거될 때 오래걸림.
    • Young Generation에 Survivor영역에서 살아남은 객체들이 Old Generation 으로 이동
    • 해당 영역에서 발생하는 GC = Major GC

GC 동작순서

  1. Heap 영역에 존재하는 객체들에 접근이 가능한지 확인
  2. GC Root에서 시작하여 참조값을 따라 접근 가능한 객체들에 Mark
  3. Mark되지 않은 객체(접근할 수 없는 객체)는 Sweep(제거)되상이 되고 객체들을 제거

https://velog.io/@mu1616/가비지-컬렉션-GC*Sweep과정에 의해서 삭제되면 메모리 단편화가 발생 → 이때, compact를 통해서 빈자리를 채워줌


  • GC Root가 될 수 있는 대상?
    • JVM 메모리 Stack영역에 존재하는 참조변수
    • Method 영역의 static 데이터
    • JNI에 의해 생성된 객체들
      https://d2.naver.com/helloworld/329631

GC종류

Serial GC

  • -XX:+UseSerialGC
  • 가장 단순한 방식의 GC
  • 싱글스레드 → 동작이 느리고, Stop the World 시간이 다른 GC에 비해 길다.
  • Mark & Sweep & Compact 알고리즘 사용
  • 따로 명시 하지 않으면 싱글 코어 환경에서는 SerialGC가 기본값
  • 메모리 사용량이 적은 소규모 애플리케이션은 **SerialGC **사용을 고려가능하지만 실무에서 보통 사용하는 경우가 없음

Parallel GC

  • -XX:+UseParallelGC
  • Java 8의 기본 GC
  • Young 영역의 GC를 멀티 스레드 방식으로 사용
  • Serial GC에 비해서는 상대적으로 stop the world 가 짧음

Parallel Old GC

  • -XX:+UseParallelOldGC or XX:+ParallelGCThreads=n
  • Young 영역 + Old 영역 모두 멀티스레드 방식으로 사용
  • 멀티스레드 갯수를 지정할 수 있음(ex- XX:+ParallelGCThreads=3)

CCMS GC

  • stop the world 로 Java Application이 멈추는 현상을 줄이고자 한 GC
  • 4step으로 reacable 한 객체를 찾음

G1 GC

  • -XX:+UseG1GC
  • Java 9+의 기본 GC
  • 현존하는 GC 중 stop the world 시간이 제일 짧음
  • Heap을 Region이라는 일정한 부분으로 나누어 메모리를 관리→ 부분적으로 Region 단위로 탐색하여 각 Region에만 GC가 발생
  • 권장하는 방식
    https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html

JVM 메모리 설정

  • 기본적인 메모리 설정방식
    JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m 
    -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+DisableExplicitGC"
  • 옵션 확인 명령어
    jinfo -flags 1
    VM Flags:
    -XX:CICompilerCount={value}
    -XX:InitialHeapSize={value}
    -XX:MaxHeapSize={value}
    -XX:MaxNewSize={value}
    -XX:MinHeapDeltaBytes={value}
    -XX:NewSize={value} 
    -XX:NonNMethodCodeHeapSize={value}
    -XX:NonProfiledCodeHeapSize={value}
    -XX:OldSize={value}
    -XX:ProfiledCodeHeapSize={value}
    -XX:ReservedCodeCacheSize={value}
    -XX:+SegmentedCodeCache
    -XX:+UseCompressedClassPointers
    -XX:+UseCompressedOops
    -XX:+UseFastUnorderedTimeStamps
    -XX:+UseSerialGC
  • 자주 사용하는 옵션들
    옵션설명
    -server서버 모드로 설정
    -XX:+UseG1GCG1GC 사용
    -Xms{value}g
    -Xmx{value}g
    Xms{value}g : java힙의 초기 크기 제어 / Heap 크기가 작으면 성능이 저하 될 수 있음 → 때문에 시스템 전체 메모리에서 50% 사용을 권장
    Xmx{value}g : java힙의 최대 크기 제어 / 최소 값이 작다면 더 잦은 GC 발생 및 추가 메모리 할당으로 일시 정지 시간이 커질 수 있음→ 최소, 최대 크기를 같은 값으로 사용
    -XX:MetaspaceSize={value}m
    -XX:MaxMetaspaceSize={value}m
    Heap 메모리와 분리된 Native 메모리 영역
    -XX:MaxGCPauseMillis={value}최대 일시 정지 희망 시간
    -XX:+FlightRecorderJVM 진단 및 프로파일링을 하기위한 JDK Flight Recorder (JFR) 활성화
    -Xlog자세한 GC 로그를 기록
    -XX:+HeapDumpOnOutOfMemoryError
    -XX:HeapDumpPath
    JVM에서 OutOfMemoryError가 발생했을 때 HeapDump를 생성


cc. https://memostack.tistory.com/228 ,https://memostack.tistory.com/229, https://epthffh.tistory.com/entry/JVM-메모리-관련-설정, https://memostack.tistory.com/228, https://d2.naver.com/helloworld/329631, https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html

profile
발새발개

0개의 댓글

관련 채용 정보