본문 바로가기
java

[java] JVM의 메모리가 Xmx 설정보다 많이 먹는 이유

by hs_seo 2021. 2. 6.

자바 응용프로그램을 실행하는 중에 Xmx를 4G로 설정했는데 실제 메모리는 7G를 먹고 있어서 원인을 확인해 보았습니다. Xmx는 힙의 최대 메모리를 설정하는 명령입니다. JVM은 힙외에 다양한 요소들로 구성되어 있고 이 부분이 메모리를 사용합니다.

 

# Xmx: 힙의 최대 메모리 사이즈 
# MaxPermSize: Permanent Size 최대 메모리 
# Xss: 스레드에 할당되는 Stack 사이즈 
Max memory = [-Xmx] + [-XX:MaxPermSize] + number_of_threads * [-Xss]

 

힙영영외 나머지 영역에서 메모리가 필요하여 사용메모리가 늘어납니다.

  • GC: 가비지 수집을 위한 메모리. 사용 중인 개체의 추적을 위한 그래프 생성. G1GC는 더 많은 메모리를 사용합니다. 

  • JIT 최적화: JVM이 실행시간 동안 최적화하기 위한 정보를 저장하는 구역이 필요합니다. 

  • 오프 힙 할당: ByteBuffers를 이용하여 힙에 설정되지 않는 메모리를 사용합니다.

  • JNI 코드: 외부 네이티브 코드를 이용하는 경우 이 코드를 메모리에 저장합니다. 드라이버 정보, c++ 코드등입니다.

  • 메타 스페이스: JVM8부터 Perm영역이 메타 영역으로 변경되었습니다. 클래스 정보를 저장하는 메모리가 필요합니다.

 

dzone.com/articles/why-does-my-java-process

 

Why does my Java process consume more memory than Xmx? - DZone Performance

This post comes from Vladimir Šor at the Plumbr blog. Some of you have been there. You have added -Xmx option to your startup scripts and sat back relaxed...

dzone.com

 

반응형