[JVM] JMC, JFR - Memory Leak 진단하기
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%확신할 수 없다.
또한 메모리 누수가 느리게 발생할 경우 확인하기 힘들다.
'JAVA > JVM' 카테고리의 다른 글
[JVM] WANR! Collections & Memory Leak (0) | 2021.12.16 |
---|---|
[JVM] jcmd & jmap 힙 히스토그램 - 가장 많은 메모리를 소모하는 인스턴스 찾기 (0) | 2021.12.16 |
[JVM] G1 Collector - 더! 큰 객체 할당 (0) | 2021.12.16 |
[JVM] G1 Collector - 큰 객체 할당, TLAB 튜닝 (0) | 2021.12.16 |
[JVM] JMC, JFR - 기본적인 사용법 (0) | 2021.12.16 |
[JVM] G1 Collector - Survivor 튜닝하기 (0) | 2021.12.16 |
[JVM] G1 Collector - 기본 튜닝 (0) | 2021.12.16 |
[JVM] G1 Collector - Full GC 발생하는 상황 (0) | 2021.12.16 |