diff --git "a/ch14/\354\265\234\355\230\201.md" "b/ch14/\354\265\234\355\230\201.md" new file mode 100644 index 0000000..9236e9e --- /dev/null +++ "b/ch14/\354\265\234\355\230\201.md" @@ -0,0 +1,108 @@ +--- +marp: true +paginate: true +--- + +# G1GC JVM 설정 + +## 최 혁 + +--- + +# Intro + +- 10장에서 vCPU가 1개이고, 메모리가 1G인 환경에서는 SerialGC로만 구동 가능하다고 발표했다. +- 이는 VM 옵션을 제대로 기입하지 않아서 생긴 오해이다. +- CPU Core를 2개 이하이며 Memory가 2G 이하인 환경에서는 SerialGC가 기본으로 채택될 뿐, 설정을 통해 변경할 수 있다. +- 따라서 G1GC 튜닝을 진행해보겠다. + +--- + +# 로그 설정을 위한 flag 추가 + +> -Xlog:gc\*=debug:file=./logs/gc-%t.log:t,level,tags:filecount=50,filesize=100M + +- GCEasy 사이트를 활용하여 튜닝이 필요한 지점을 찾아보기 위해 gc 로그를 파일로 남겼다. +- debug level의 모든 종류의 태그를 기록한다. + +--- + +# -Xms, -Xmx 옵션을 같도록 설정 + +> oracle docs는 `최적의 시작 성능을 위해 초기 힙 크기를 최대 힙 크기와 동일하게 설정`하도록 권장한다. + +- 힙 크기를 늘릴 때 OS에 추가 메모리를 요청해야 하기에 시간이 걸린다. +- JVM은 힙으로 늘린 메모리를 다시 해제하지 않기에 결국 Xmx 값으로 된다. +- Xms를 작게 시작하면 GC가 더 많이 발생함 +- 일반적으로 다른 앱과 메모리 경쟁을 하지 않는다면 이렇게 설정함 + +--- + +# 테스트 환경 + +- ec2 free tier + swap memory 2G 환경 +- 1초에 10개의 http request(VU 10) 전송 + +--- + +# GCEasy 결과 요약 + +- fatal + - 애플리케이션이 메타공간 영역에서 메모리 누수 문제 발생 +- warning + - 컴퓨팅 리소스(CPU 또는 I/O 주기) 부족으로 인해 애플리케이션이 대기 중인 것 같습니다. 컴퓨팅 리소스로 인해 심각한 프로덕션 애플리케이션이 정체되어서는 안 됩니다. 1개의 GC 이벤트 에서 '실제' 시간은 'usr' + 'sys' 시간보다 더 오래 걸렸습니다. +- recommand + - -XX:+UseStringDeduplication 태그 추가 + - jvm 힙 크기 증가 + +링크: https://gceasy.io/diamondgc-report.jsp?p=YXJjaGl2ZWQvMjAyNC8wMy8yMC9nYy0yMDI0LTAzLTIwXzIwLTA0LTA5LmxvZy0tMTEtMTUtNDU=&channel=WEB + +--- + +# -XX:+UseStringDeduplication 옵션 + +- 중복 문자열이란 아래와 같은 상황 + +```java +String string1 = new String("a"); +String string2 = new String("a"); // string1 == string2 > false +``` + +- JDK 개발팀의 조사에 따르면 프로세스의 25%는 문자열이고, 그 중 절반은 중복 문자열이다. +- 해당 옵션을 키면 GC는 일부러 중복 문자열을 제거하려고 시도한다. +- 다만, 중복 문자열이 완전히 제거되지 않고, 제약사항이 있다. + - G1 GC 알고리즘에서만 적용 가능 + - Long-Lived 객체에만 적용 + - GC 일시 중지 시간(Pause Time)에 영향을 줄 수도 있다. + - 중복 문자열 객체 자체를 제거하는 것이 아니라, 내부의 char[]만 Replace된다. + +--- + +# GC 이벤트 + +- 모든 GC 이벤트에는 user, sys, real 시간이 있다. +- user: 사용자 모드 코드(커널 외부)에서 소비된 CPU 시간 +- sys: 커널에서 소비된 CPU 시간 +- real: GC 이벤트의 총 경과 시간 +- 일반적인 GC 이벤트는 시간은 real < user + sys이다. + +### 문제가 되는 부분 + +> user(0.55s), sys(0.17s), real(4.99s) + +- 과도한 I/O 활동 or cpu 부족으로 인해 + +--- + +# Metaspace 메모리 누수 + +- 시간이 부족했군요.. + +--- + +## 참고 + +- oracle docs + (https://docs.oracle.com/cd/E15289_01/JRPTG/tune_startup.htm#i1002410) +- https://kimxavi.tistory.com/entry/java-JVM-%EC%98%B5%EC%85%98-Xms-%EC%99%80-Xmx-%EB%A5%BC-%EA%B0%99%EA%B2%8C-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0 +- https://mangkyu.tistory.com/328 diff --git "a/ch14/\354\265\234\355\230\201.pdf" "b/ch14/\354\265\234\355\230\201.pdf" new file mode 100644 index 0000000..8ad82cc Binary files /dev/null and "b/ch14/\354\265\234\355\230\201.pdf" differ