Nellie's Blog

[Java] OOM Error (OutOfMemoryError) 유발해보고 모니터링 분석하기 (feat. VisualVM) 본문

Back-end/java

[Java] OOM Error (OutOfMemoryError) 유발해보고 모니터링 분석하기 (feat. VisualVM)

Nellie Kim 2024. 12. 14. 18:52
728x90

실무에서 자주 마주치는 OOM 에러 모니터링 상태를 이해하고 메모리 누수, GC 문제가 일어나지 않도록 하기 위해 글을 작성해보았다.

일부러 객체를 계속 할당하여 Heap 메모리를 과도하게 사용하게 하여 OOM 에러를 내보며 모니터링을 해보겠다. 

 

Cat 클래스

계속 할당될 클래스다.

package com.example.demo;

/**
  OOM 에러 유발 코드 
 */
public class Cat {
    private int age;

    public Cat(int age) {
        this.age = age;
    }
}

 

메인 클래스

계속 Cat 클래스를 할당해준다. 

package com.example.demo;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class DemoApplication {
	public static List<Cat> list= new ArrayList<>();

	public static void main(String[] args) {
		while (true) {
			final Cat cat = new Cat(new Random().nextInt(10));
			System.out.println("Cat 생성! : " + cat);
			list.add(cat);
		}
	}
}

 

VisualVM으로 모니터링 

VisualVM을 사용해서 모니터링한다. 우측 상단의 그래프에 주목해본다. 저렇게 쌓이기만 하고 다시 내려오지 못한다. 

 

GC가 청소를 못하고 저렇게 계속 메모리가 쌓인다.

 

GC 모니터링도 확인해보자. 

 

Old Gen 이 계속 쌓임. 7.8G 중에 6.5까지 쌓이고 OOM을 내뿜으며 죽었다.

 

 

장렬히 전사함... 

 

그래프는 위와 같이 나타난다. 그래프 모양을 잘 알아두자!

 

실무에서 자주 마주치는 OOM 에러 모니터링 상태를 이해하고 저렇게 메모리 누수가 생기지 않도록 주의하자!

 

 

출처 : 자바 잘 읽는 법 - 자바 코드를 이해하고, 디버깅하고, 최적화하는 요령 (Ch 6)