Skip to content

Commit

Permalink
14장 정리 (#34)
Browse files Browse the repository at this point in the history
  • Loading branch information
choihuk authored Mar 20, 2024
1 parent 9d253d0 commit 5dce9a5
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 0 deletions.
108 changes: 108 additions & 0 deletions ch14/최혁.md
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 added ch14/최혁.pdf
Binary file not shown.

0 comments on commit 5dce9a5

Please sign in to comment.