2 minute read

개요

예시

-XX:+HeapDumpOnOutOfMemoryError -Xmx8192m -Xms4096m -XX:+UseG1GC -XX:ReservedCodeCacheSize=64m -XX:+UseCodeCacheFlushing

옵션 설명
💡 -Xmx8192m: 최대 힙 크기를 8192MB로 설정합니다.
💡 -Xms4096m: 초기 힙 크기를 4096MB로 설정합니다.
💡 -XX:+UseG1GC: Garbage-First(G1) 가비지 컬렉터를 사용합니다.
💡 -XX:ReservedCodeCacheSize=64m: JIT(Just-In-Time) 컴파일러에서 사용하는 코드 캐시의 크기를 64MB로 설정합니다.
💡 -XX:+HeapDumpOnOutOfMemoryError: OutOfMemoryError 발생 시 힙 덤프를 생성합니다.
💡 -XX:+UseCodeCacheFlushing: 코드 캐시 플러시를 사용합니다.
💡 가가가가
💡 가가가가

반드시 주의사항
💡 -Xmx와 -Xms의 값이 물리적인 메모리 용량을 초과하지 않도록 설정

예제1: 물리적인 메모리용량 8G

: 서버의 물리적인 메모리 용량이 8GB인 경우, -Xmx와 -Xms 옵션은 이 용량을 초과하지 않도록 설정해야 한다.

안전한 설정

-Xmx6g -Xms4g

위는 최대 힙 크기(-Xmx)는 6GB로 설정되어 있고 초기 힙 크기(-Xms)는 4GB로 설정되어 있다.
💡 물리적인 메모리 용량인 8GB 내에서 안전하게 동작할 수 있습니다.물리적인 메모리 용량을 초과하지 않도록 설정

위험한 설정

-Xmx10g -Xms10g

위는 최대 힙 크기와 초기 힙 크기가 모두 10GB로 설정되어 있다.
💡 하지만 물리적인 메모리가 8GB이므로 이는 메모리 초과로 이어질 가능성이 있다.

실제 내가 겪은 이야기

기업의 메모리 사용률이 저조한 서버를 제거하는 업무
💡 솔루션이 존재하는 서버 > WAS1, WAS2 내부로 통합.
💡 솔루션은 JAVA 기반이므로 이관시 JVM 메모리 용량을 체크해야하는 상황.

순서

순서는 다음과 같다.

  1. WAS서버 물리적 JVM 메모리용량 조사
  2. WAS서버 사용하는 모든 프로세스 총합JVM 메모리용량 조사
  3. 솔루션서버 사용하는 모든 프로세스 총합JVM 메모리용량 조사
  4. 이관 > 끝

이관대상 서버의 메모리 확인

1.WAS서버 물리적 JVM 메모리용량 조사

# 사용가능한 물리메모리
cat /proc/meminfo | grep MemFree
MemTotal:          8632342 KB 

# 여유 물리메모리
# 8430MB
# 8.25GB  

참고
💡 Linux 메모리 (링크이동)

2.WAS서버 사용하는 모든 프로세스 총합JVM 메모리용량 조사

# admin계정 접속(실행중인 솔루션 프로세스의 JVM메모리 보기 위해)
# 결과가 나오면 모든 -Xmx 의 값을 모두 전수검사. 그리고 모두 SUM 한다.
jps -v

3.솔루션서버 사용하는 모든 프로세스 총합JVM 메모리용량 조사

# 솔루션계정 접속(실행중인 솔루션 프로세스의 JVM메모리 보기 위해)
# 결과가 나오면 모든 -Xmx 의 값을 모두 전수검사. 그리고 모두 SUM 한다.
jps -v

# example) 
# jps -v ./config/bckServerConf.xml
# 매니저서버 -Xmx1024m //1g
# 서비스서버1 -Xmx8192m //8g
# 서비스서버2 -Xmx8192m //8g
# 서비스서버3 -Xmx8192m //8g
# 스케줄서버3 -Xmx256m //256mb
#
# jps -v ./bin/bckStartup.sh
# 솔루션서버시작 -Xmx1024m //1g
#
# SUM결과(솔루션 작동에 필요한 최소 메모리)==> 28160MB (약27.5GB)

# 혹시모르니까 결과에서 솔루션파일들 직접확인.
find /솔루션ROOT경로 -type -f -exec grep -l 'Xmx' {} +

-Xmx 이란? 최대 힙메모리 설정
💡 최대 힙메모리는 -Xmx 와 같이 설정되어 있다. 이것이 솔루션이 내부적으로 안정범위라고 생각한 메모리 용량이다.

4.WAS서버 물리용량 조사한내용 안정범위 확인

WAS서버 물리적 메모리용량안에 

WAS서버총합JVM용량 + 솔루션서버총합JVM용량 

값이 일정범위 안이라면 SUCCESS 로 간주

그러면 일정범위는 어떻게 판단할까? 내가 전문가가 아니라서 잘모르겠지만 top찍고 여유물리메모리에 80% 정도면 괜찮지 않을까? 생각이든다.

정리

다음과 같다.

  • 안전한 설정은 시스템의 물리적인 메모리 용량을 고려하여 JVM의 힙 크기를 설정하는 것.

Leave a comment