테스트코드 & 정적분석

OutOfMemoryError 해결하기: IntelliJ로 메모리 누수 분석하는 방법

백엔드 유성 2024. 8. 15. 20:28

코드에 누수가 있거나 요청량이 많아지면 메모리 사용량 100%가 발생할 수 있습니다.

Grafana

 

 

메모리 사용량이 100%가 되면 더이상 메모리를 할당할 수 없고 이는 서비스 장애로 이어집니다.

 

Intellij에서는 메모리 사용량을 분석하기 쉽게 만든 툴이 있어 소개해드리겠습니다.

 

우선. 메모리 분석하기에 앞서 OutofMemory를 만들어보겠습니다.

 

 

간단하게 컨트롤러에 반복문을 만들었고,

JVM 옵션으로 -XX:+HeapDumpOnOutOfMemoryError 를 넣었습니다.

위 옵션은 OutOfMemory 발생 시 heap dump를 생성하는 옵션입니다.

(만약 엑츄에이터를 사용한다면 GET 요청을 통해 dump를 받을 수 있습니다.)

(terminal에서는 $ jmap -dump:format=b,file=/path/file.hprof {process_id} 입니다.)

 -> 예 : jmap -dump:format=b,file=/path/file.hprof 4425

 

반복문을 실행하면 OutOfMemory가 발생하고

OutOfMemory 로그

 

아래와 같은 파일이 만들어집니다.

jvm 옵션을 이용해 만들어진 파일

 

파일을 Intellij에서 더블클릭하고 분석을 돌리면

Intellij 분석

 

분석한 내용들이 나열되고 가장 큰 객체를 확인해보면, 어떤 컨틀롤러 몇번째 줄에서 발생했는지 나옵니다.

가장 큰 객체

 

저는 com.logcenter.controller.TrafficController.kt 파일에서 27번째 줄에서 6,200만개의 데이터가 생성되었다고 나오네요.

 

27번째 줄

 

list에 add를 해주는 곳입니다.

 

이 방법을 이용해서 누수를 잡거나 코드를 최적화 하실 수 있습니다.

 

감사합니다.