본문 바로가기
ETC

메모리 누수 분석

by J_Remind 2024. 7. 28.

메모리 이슈 발생

파일 업로드, 파일 다운로드 시 비정상적으로 메모리가 오르는 일이 생김 (1.4GiB 이상)

JVM 옵션 설정

-server -Xms512m -Xmx512m -XX:MetaspaceSize=400m -XX:MaxMetaspaceSize=400m

-Xms: Java heap 초기 크기
-XmX : Java heap 최대 크기
-XX:MetaspaceSize : 가비지 컬렉션을 처음 초과할 때 트리거할 할당된 클래스 메타데이터 크기
-XX:MaxMetaspaceSize : 클래스 메타데이터에 할당할 수 있는 최대 네이티브 메모리 양

HeapDump 분석

MAT(Memory Analyzer Tool)으로 메모리 분석

DB에 연결할 때 SSLSocketImpl에서 메모리 누수가 발생하는 것을 확인

DataBase의 SSL 설정 정보 확인

show status like '%ssl%';

 

DataBase 상태에서 ssl 암호화와 버전이 설정 되어 있지 않은 것을 확인 할 수 있음
Java에서 MySQL에 연결 할 때 디폴트 값으로 SSL을 사용하는 데 usessl=false로 설정하여 ssl을 사용하지 않으며 메모리 누수를 해결

jdbc:mysql://%s:%s/%s?serverTimezone=UTC&useSSL=false ...

메모리 누수는 해결 했지만 메모리가 비정상적으로 증가하는 현상을 해결 되지 않음

JVM 메모리

Java 프로세스의 메모리 영역은 크게 Heap MemoryNative Memory 영역로 구성
이중에서 사용자가 크기를 설정할 수 있는 부분은 Java Heap과 Metaspace 영역이고 그 외 영역은 JVM과 OS 가 사용하는 영역
Java 옵션 설정으로 native memory tracking하여 메모리 사용 구조 파악

-XX:NativeMemoryTracking=summary
jcmd {pid} VM.native_memory

JVM native memory tracking으로 JVM이 임시 메모리(reserved) 값이 1336435KB 인걸 확인
JVM이 사용하는 실제 사용중인 메모리(committed)가 임시 메모리 크기 안에서 증가할 수 있음

Request Memory

쿠버네티스에서 노드 내 메모리가 충분하다면 컨테이너는 지정한 요청량보다 많은 메모리를 사용 할 수 있다
helm의 values.yaml에서 초기 cpu, memory 설정과 memory limits 설정

resources:
  requests:
    cpu: 300m
    memory: 500Mi
  limits:
    memory: 1000Mi

memory limits 설정으로 최대 1000MiB를 넘지 않으며 메모리가 비정상적으로 오르는 현상을 해결

'ETC' 카테고리의 다른 글

센드 메일서버 구현  (0) 2019.02.27
마스터 네임서버 구축  (0) 2019.02.26