generated from Learning-Is-Vital-In-Development/study-template
-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
108 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |
Binary file not shown.