[Linux] 시스템 상태 체크(메모리) sar 명령어, java heap, metaspace size 확인 명령어

phantom0308
5 min readOct 13, 2021

--

서버 메모리 사용량 확인

~]$ sar -r -f /var/log/sa/sa02

java heap, metaspace size 확인

metaspace 는 jdk 1.8 이전 버전에서는 permsize의 역할이며, 1.8 버전부터는 metaspace라는 native Memory 의 영역이 대체 되었다.

[참고]

~]$ sudo jstat -gc <pid>

출력 항목 내용

  • S0C: Current survivor space 0 capacity (kB).
  • S1C: Current survivor space 1 capacity (kB).
  • S0U: Survivor space 0 utilization (kB).
  • S1U: Survivor space 1 utilization (kB).
  • EC: Current eden space capacity (kB).
  • EU: Eden space utilization (kB).
  • OC: Current old space capacity (kB).
  • OU: Old space utilization (kB).
  • MC: Metaspace capacity (kB).
  • MU: Metacspace utilization (kB).
  • CCSC: Compressed class space capacity (kB).
  • CCSU: Compressed class space used (kB).
  • YGC: Number of young generation garbage collection events.
  • YGCT: Young generation garbage collection time.
  • FGC: Number of full GC events.
  • FGCT: Full garbage collection time.
  • GCT: Total garbage collection time.

OOME 케이스를 알아보기에 앞서 에러 메시지가 어떤 메모리 영역을 지칭하는 건지, 해당영역이 어떤 JVM Option에 의해 제어를 받는지 알 필요가 있다.

위 그림에서 제일 위에 있는 Heap과 Metaspace가 우리가 주로 관심있는 공간이다. 이 중에서 Metaspace가 Native Area(=Native Memory, Off-Heap, Non-heap, Direct Memory 등)인 것에 주목하자.

Java 8부터 기존의 Permgen 메모리가 Metaspace로 바뀌면서 Native Memory에 할당되게 되었다. Native Memory는 Heap 영역의 바깥인 Off-Heap 공간을 의미하는 것으로 쉽게 시스템의 기본 메모리라고 생각하면 된다.

Java 어플리케이션은 크게 위의 Heap과 Off-Heap 두 공간을 활용하여 동작하는데, 따라서 어플리케이션을 배포할 때 메모리 몇 GB를 할당해야 하는지 결정하기 위해서는 단순히 Xmx(Heap 메모리 최대치를 결정하는 Java 옵션) 값만 생각하면 OOME에 빠지기 쉽다. 실제로는 Xmx에 MaxMetaspace값을 더하고, 추가로 프로그램에서 NIO를 사용해 Native Memory를 직접 할당받는 로직을 고려해서 Heap + Native Memory 사용총량으로 할당을 해야 비교적 정확하다. 특히 컨테이너의 경우 계산을 좀 더 정확하게 해야 시스템에서 OOM Killed되는 상황을 면할 수 있다. 추가로 Thread 수와 스택사이즈 등 고려할 사항이 조금 더 있지만 이 정도만 해도 기본적으로는 충분하니 여기선 논외로 해도 무방할 듯 하다. 특히, 최근에는 이 Off-Heap을 이용해 성능 향상을 하고 있는 어플리케이션들이 많아서 더 관심을 기울여야 한다.

Netty, Spark, Cassandra, Ignite 등 이름만 들으면 알만한 여러 어플리케이션들과 이를 사용하는 파생된 수많은 프로젝트가 여기에 포함된다.

[참고]

--

--

No responses yet