[JVM] JMC, JFR - Memory Leak 진단하기

2021. 12. 16. 15:29 JAVA/JVM

JMC, JFR 을 이용해서 메모리 누수를 진단해보자!

Memory Leak 발견하기
메모리 누수로 인한 잦은 GC로 어플리케이션이 느려질 수 있으며, 결국 OutOfMemoryError가 발생한다. 
메모리 누수를 JFR을 이용해서 찾을 수 있다.
Old Generation에 GC가 발생했는데도 꾸준히 살아있는 객체들의 갯수가 증가한다면 메모리 누수를 의심할 수 있다.
메모리 누수는 오랜 기간 쌓인 로그를 봐야할 경우가 많기 때문에 JMC을 이용해서 로그를 잘 남겨놔야 한다.  
( JMC Event Trigger를 이용해서 특정시간마다 특정기간동안 JFR 을 돌려서 기록할 수 있다)


Memory Leak 클래스 찾기
메모리 누수가 발견되었다면, 어떤 클래스에서 메모리 누수가 발생하는지 찾아야한다.
메모리 누수가 발생한다면, 특정 클래스가 힙 메모리에서의 점유율이 점점 증가할 것이다.
위에서 Old Generation을 비교했던 것 처럼, 먼저 비교 대상이 될 클래스의 점유율 상태를 확인하고, ParallelOld GC가 발생한 뒤의 클래스 점유율을 비교해보면 어떤 클래스가 점유율이 상승했는지 확인할 수 있다.


Memory Leak 확정하기
의심되는 클래스를 찾았으면, 의심을 확신으로 바꾸기 위해
HPROF, The jhat Utility를 사용해서 의심되는 오브젝트를 계속 살펴봐야 한다.
또는 JMC 플러그인 JOverflow 를 사용해서 HPROF 덤프를 확인해야 한다. 

JMC & JFR을 이용해서는 확실한 단서는 찾기 힘들고, 몇가지 추가적인 정보를 얻을 수 있다. 
Allocation in new TLAB탭을 확인해보면 클래스 인스턴스들이 메모리에 할당되는 것을 확인할 수 있다.
단 주의할 점은, 샘플링된 데이터라는 것이다. 샘플링 데이터이기 때문에 100%확신할 수 없다.
또한 메모리 누수가 느리게 발생할 경우 확인하기 힘들다.