SeouliteLab

[Java/자바] 강제적으로 OutOfMemoryError 발생시키기 본문

프로그래밍

[Java/자바] 강제적으로 OutOfMemoryError 발생시키기

Seoulite Lab 2024. 3. 10. 00:44

Java에서 OutOfMemoryError를 강제로 발생시키는 방법을 살펴보겠습니다. 이 글에서는 여러 예제를 통해 자세한 설명과 함께 제시하겠습니다.

예제 1: 메모리 누수를 통한 OutOfMemoryError 발생

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

public class MemoryLeak {
    private static List<byte[]> list = new ArrayList<>();

    public static void main(String[] args) {
        while (true) {
            list.add(new byte[1024 * 1024]); // 1MB씩 계속 리스트에 추가하여 메모리 누수 발생
        }
    }
}

이 코드는 무한히 리스트에 1MB의 바이트 배열을 추가하여 메모리 누수를 유발합니다.

예제 2: 대용량 데이터 생성하여 OutOfMemoryError 발생

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

public class LargeData {
    public static void main(String[] args) {
        List<String> largeList = new ArrayList<>();
        while (true) {
            largeList.add(new String(new char[1000000])); // 1MB의 문자열을 계속 리스트에 추가하여 메모리 초과 발생
        }
    }
}

이 예제는 1MB 크기의 문자열을 리스트에 계속 추가하여 메모리를 소비하고, 결국 OutOfMemoryError를 유발합니다.

예제 3: 큰 배열 할당으로 OutOfMemoryError 발생

public class BigArray {
    public static void main(String[] args) {
        int[] bigArray = new int[Integer.MAX_VALUE]; // Integer.MAX_VALUE 크기의 배열 할당
    }
}

이 코드는 매우 큰 크기의 배열을 할당하여 메모리 부족 상태를 유도합니다.

예제 4: 재귀 호출로 StackOverflowError 발생시켜 OutOfMemoryError 유도

public class StackOverflow {
    public static void main(String[] args) {
        infiniteRecursion(0);
    }

    public static void infiniteRecursion(int i) {
        System.out.println(i);
        infiniteRecursion(i + 1); // 재귀 호출로 인해 호출 스택이 계속 쌓이다가 스택 오버플로우 발생
    }
}

이 코드는 무한한 재귀 호출을 수행하여 호출 스택이 오버플로우되어 OutOfMemoryError를 발생시킵니다.

예제 5: 메모리 사용량 측정하여 한계 도달시 OutOfMemoryError 발생

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

public class MemoryLimit {
    public static void main(String[] args) {
        long maxMemory = Runtime.getRuntime().maxMemory();
        System.out.println("Max memory: " + maxMemory);

        List<byte[]> list = new ArrayList<>();
        long usedMemory = 0;
        try {
            while (true) {
                list.add(new byte[1024 * 1024]); // 1MB씩 리스트에 추가
                usedMemory += 1024 * 1024;
                if (usedMemory >= maxMemory) {
                    throw new OutOfMemoryError("메모리 한계 도달"); // 메모리 한계 도달시 예외 발생
                }
            }
        } catch (OutOfMemoryError e) {
            System.err.println(e.getMessage());
        }
    }
}

이 코드는 메모리 사용량을 측정하고 한계에 도달할 때까지 메모리를 추가로 할당하다가, 한계에 도달하면 OutOfMemoryError를 발생시킵니다.

예제 6: 유효하지 않은 메모리 설정으로 OutOfMemoryError 유도

public class InvalidMemoryConfig {
    public static void main(String[] args) {
        int[] array = new int[-1]; // 음수 크기의 배열 할당
    }
}

이 코드는 유효하지 않은 메모리 설정으로 인해 Out OfMemoryError를 발생시킵니다.