Linux JVM
개요
예시
-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 메모리 용량을 체크해야하는 상황.
순서
순서는 다음과 같다.
- WAS서버 물리적 JVM 메모리용량 조사
- WAS서버 사용하는 모든 프로세스 총합JVM 메모리용량 조사
- 솔루션서버 사용하는 모든 프로세스 총합JVM 메모리용량 조사
- 이관 > 끝
이관대상 서버의 메모리 확인
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