본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/CS(ComputerScience)

[CS] OOM의 원인과 아주 간단하게 OOM 발생 시키기

by 미노드 2023. 8. 3.

outofmemory가 나는 이유

  • 설정된 메모리 대비 요청되는 메모리가 많기 때문에 나타나는 JVM에서 발생하는 에러
  • 설정의 오류나 사용량 초과로 인해
  • jdk 5 같은 경우는 jdk hotspot 버그로 인해 oom이 났던 경우도 있었음

oom 예시

  1. Application의 oom(순간적)
    • 과도한 데이터 조회(100만건 200만건씩 조회해서 메모리 들고 있는 경우, 업로드 파일을 후처리 하기로 해서 메모리에 들고 있는 경우)
    • 잘못된 데이터 조작(string)
  2. 장시간에 걸쳐서 서서히 메모리가 장식되는 경우(memory leak)
    • Cache(어떤 데이터를 여러 쓰레드가 공유해서 사용하는 경우) leak
    • Pool(배타적으로 사용할 때) leak (oom 가기 이전에 풀 부족으로 2차 장애가 발생하는 경우도 많음)

oom이 나게하려면??

  • 데이터를 과도하게 조회해서 들고 있기
  • 간단하게 arrayList에 1kb짜리 25만개 add 하거나 (실제 코드로 짰을 때 나는 1kb로 안되서 1000kb로 25만개 돌렸더니 4085번에서 즈음 oom 나긴함)
public static void main(String args[]) {
    ArrayList list = new ArrayList();

    try {
        for(int i=0; i < 250000; i++) {
            list.add(new byte[1000000]);
            System.out.println(i);
            Thread.sleep(1);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }


}

원인 분석 및 해결 방법

  • 단기적 해결 간단하게는 재기동..
  • heap dump 분석 -> Eclipse의 Memory Analyzer 사용
  • 부하 테스트 및 모니터링
    • JMeter
    • Visual VM