반응형
OutOfMemoryError: Java heap space...
해당 로그로 알람이 와서 Java -Xms -Xmx 옵션을 추가해 재기동을 진행하기로 했습니다.
해당 서버에는 여러개의 가상서버로 분할하여 사용하고 있습니다.
Xms, Xmx 옵션
- -Xms는 Java 힙의 최초 크기 지정
- -Xmx는 Java 힙의 최대 크기 지정
- -Xms로 지정한 메모리 크기로 시작하여 -Xmx로 지정한 메모리 크기까지 커지게 된다.
이번에 설정한 옵션입니다.
java -Xms32g -Xmx32g -jar project.jar
heap 메모리는 32g로 시작해서 32g까지 커지게 된다.
Xms, Xmx default 값
- -Xms는 물리적 메모리의 1/64의 초기 힙 크기
- -Xmx는 물리적 메모리의 1/4의 최대 힙 크기
직접 해당 서버에서 총 메모리와 Xms, Xmx default 값을 확인.
물리 메모리
# 명령어
cat /proc/meminfo
# 결과
MemTotal: 196338588KB
19633859
Heap 메모리
# 명령어
java -XX:+PrintFlagsFinal -version | grep HeapSize
# 결과
uintx ErgoHeapSizeLimit = 0 {product}
uintx HeapSizePerGCThread = 87241520 {product}
uintx InitialHeapSize := 2147483648 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 32210157568 {product}
다른 블로그에서는 맞게 하는거 같은데..default 값을 계산해보면 차이가 있다..
Xms, Xmx는 왜 같은 값으로 지정할까?
heap size는 JVM에서 자동으로 늘리거나 줄일수 있습니다.
Heap 메모리 사용량이 -Xms 에 다 다르면 OS에게 추가적인 메모리 할당을 요구하게 됩니다.
이렇게 해서 -Xmx 옵션으로 지정한 메모리 크기까지 메모리 할당을 받을 수 있는 것인데, OS에게 메모리 할당하는 부분에서 자주 GC(Garbage Collect)를 발생시키게 되고 이 부분에서 성능적인 이슈(애플리케이션이 일시 정지하는 병목 현상(Stop the World Event)발생)가 발생할 수 있다고 합니다.
위 이슈 때문에 물리 메모리가 넉넉하다면 초기 -Xms , -Xmx 값을 동일하게 설정하기 추천.
Xms, Xmx 사이즈는 얼마로 지정하면 좋을까?
Server 시스템의 경우 항상 최대 사용 메모리로 잡아 놓는 것이 추천한다고 합니다.
(64-bit 환경 상 물리 메모리가 32GB 초과 시스템이라도 -Xmx 옵션은 32GB 이하 설정이 적절 32GB 초과 시, 힙 관리 방식이 비효율적 방식으로 변경)
참조
반응형
'n년차 개발자' 카테고리의 다른 글
docker mysql 쿼리 결과 파일로 받기 (0) | 2022.10.14 |
---|---|
Prometheus, Grafana 사용해보기 (0) | 2022.08.23 |
트랜잭션 격리 수준 (Isolation level) (0) | 2022.08.20 |
AWS EC2 인스턴스에 ES 설치 후 ELB, ROUTE53 적용 하기 (0) | 2022.07.15 |
AWS Lambda, S3, EventBridge, Cloude Watch를 사용하여 EC2 AUTO STOP 적용하기 (JAVA) (0) | 2022.07.14 |