이번주에 회사에서 JVM 최적화 이야기가 나와서 한번 찾아봤다.
JVM 최적화를 위해서는 GC에 대해 알아야한다. JVM 튜닝의 대부분의 메모리 튜닝이다. GC가 바로 JVM에서 메모리를 관리해주는 역할을 해주기 때문이다.
Garbage Collector
(가비지 콜렉터)
JVM에서 메모리를 자동으로 관리해주는 것
JVM메모리 중 Heap 영역에서 사용하지 않는 객체를 삭제
stop the world
GC(G1GC제외) : Young Generation
과 Old Generation
로 분리
G1GC : young, old, survivor 영역이 2차원 바둑판 형태로 나누어짐
*Permanent 영역은 JAVA8부터 사라지고 Metaspace영역으로 전환됨
Young Generataion
Minor GC
Mark & Seep
과정 발생 → Minor GCpromotion
이라고 함Old Generation
Major GC
*Sweep과정에 의해서 삭제되면 메모리 단편화가 발생 → 이때,
compact
를 통해서 빈자리를 채워줌
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:+UseG1GC | G1GC 사용 |
-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:+FlightRecorder | JVM 진단 및 프로파일링을 하기위한 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