๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋นˆ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ

[JVM] Out of Memory VS Memory Leak

์ถœ์ฒ˜

ChatGPT


Out of Memory(OOM)์™€  Memory Leak(๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜)๋Š” ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ๋‚˜ํƒ€๋‚ด์ง€๋งŒ, ๊ทธ ์›์ธ๊ณผ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์€ ๋‹ค๋ฅด๋‹ค.

 

1. Out of Memory

Out of Memory๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰ ์ค‘์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜์ด๋‹ค. JVM์—์„œ ํž™ ๋ฉ”๋ชจ๋ฆฌ ๋˜๋Š” ๋ฉ”ํƒ€์ŠคํŽ˜์ด์Šค ๋“ฑ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๋‹ค ์†Œ์ง„๋˜์–ด ๋” ์ด์ƒ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

 

์›์ธ

๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ

ํ”„๋กœ๊ทธ๋žจ์ด ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›์œผ๋ ค๊ณ  ์‹œ๋„ํ•  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.

๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

ํ•œ๊บผ๋ฒˆ์— ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜๊ฑฐ๋‚˜, ํฐ ๊ฐ์ฒด๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ƒ์„ฑํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ ์  ์ฆ๊ฐ€ํ•  ๋•Œ๋„ OOM์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ ์ ˆํ•˜์ง€ ์•Š์€ JVM ์„ค์ •

JVM์˜ ํž™ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ(-Xmx ์˜ต์…˜)๊ฐ€ ๋„ˆ๋ฌด ์ž‘๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ฆ์ƒ

  • Out of MemoryError๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ์ด ๋น„์ •์ƒ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, 'java.lang.OutOfMemoryError: Java heap space'๋Š” ํž™ ๊ณต๊ฐ„ ๋ถ€์กฑ์„ ์˜๋ฏธํ•œ๋‹ค.

 

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

  • JVM์˜ ํž™ ํฌ๊ธฐ ์„ค์ •์„ ๋Š˜๋ ค์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.(-Xmx ์˜ต์…˜์„ ์ตœ๋Œ€ ํž™ ํฌ๊ธฐ๋กœ ์„ค์ •)
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ํŒจํ„ด์„ ๋ถ„์†ํ•ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ตœ์ ํ™”ํ•œ๋‹ค.
  • ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋„๋ก ์ฝ”๋“œ ์ตœ์ ํ™” ๋ฐ GC ํŠœ๋‹์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

์˜ˆ์‹œ

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

public class OutOfMemoryExample {
    public static void main(String[] args) {
        List<int[]> list = new ArrayList<>();
        while (true) {
            // ๋งค์šฐ ํฐ ๋ฐฐ์—ด์„ ๊ณ„์† ์ƒ์„ฑํ•˜์—ฌ ํž™ ๊ณต๊ฐ„์„ ์†Œ์ง„์‹œํ‚ด
            list.add(new int[1000000]);  // ๋ฐ˜๋ณต์ ์œผ๋กœ ํฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์ดˆ๋ž˜
        }
    }
}

 

์œ„์˜ ์˜ˆ์ œ์—์„œ๋Š” ํฐ ๋ฐฐ์—ด์„ ๊ณ„์†ํ•ด์„œ ์ƒ์„ฑํ•ด ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ ๊ฐˆ์‹œ์ผœ ๊ฒฐ๊ตญ OutOfMemoryError๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

 

2. Memory Leak ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜

Memory Leak(๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜)๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•˜์—ฌ, ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC)์— ์˜ํ•ด ํšŒ์ˆ˜๋˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ„์† ์ฐจ์ง€ํ•˜๊ฒŒ ๋˜๋Š” ์ƒํ™ฉ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ ์  ์ค„์–ด๋“ค์–ด ๊ฒฐ๊ตญ Out of Memory ์˜ค๋ฅ˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค. 

์›์ธ

๊ฐ์ฒด ์ฐธ์กฐ ์œ ์ง€

ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•˜์—ฌ ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์ง€ ์•Š์Œ

์ปฌ๋ ‰์…˜ ์‚ฌ์šฉ ์‹ค์ˆ˜

List, Map ๋“ฑ ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด์— ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์ œ๊ฑฐํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

ํด๋กœ์ €(Closure) ์‚ฌ์šฉ

๋‚ด๋ถ€ ํด๋ž˜์Šค๋‚˜ ๋žŒ๋‹ค ํ‘œํ˜„์‹์ด ์™ธ๋ถ€ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•  ๋•Œ

๋ฆฌ์Šค๋„ˆ(Listener) ๋ฐ ์ฝœ๋ฐฑ(Callback)

๋“ฑ๋ก๋œ ๋ฆฌ์Šคํ„ฐ๋‚˜ ์ฝœ๋ฐฑ์ด ํ•ด์ œ๋˜์ง€ ์•Š์„ ๋•Œ

 

์ฆ์ƒ

  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ ์ง„์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜์—ฌ GC๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๊ณ , ๊ฒฐ๊ตญ ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋œ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ง€์†๋˜๋ฉด ๊ฒฐ๊ตญ OutOfMemoryError๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ˆ„์ˆ˜ ์ง€์ ์„ ์‹๋ณ„ํ•œ๋‹ค.(์˜ˆ: VisualVM, Eclipse Memory Analyzer)
  • ์‚ฌ์šฉ ํ›„์— ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ ํ•ด์ œํ•˜๊ฑฐ๋‚˜, ์ปฌ๋ ‰์…˜์—์„œ ๋ถˆํ•„์š”ํ•œ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•œ๋‹ค.
  • ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ ์ •์  ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ์ž ์žฌ์  ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์‚ฌ์ „์— ๋ฐœ๊ฒฌํ•œ๋‹ค.

 

์˜ˆ์‹œ

import java.util.HashMap;
import java.util.Map;

public class MemoryLeakExample {
    public static void main(String[] args) {
        Map<Key, String> map = new HashMap<>();

        while (true) {
            map.put(new Key("key"), "value"); // ๋งค๋ฒˆ ์ƒˆ๋กœ์šด Key ๊ฐ์ฒด ์ƒ์„ฑ, ์ด์ „ ํ‚ค ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ ์—†์Œ
        }
    }
}

class Key {
    String key;

    Key(String key) {
        this.key = key;
    }

    @Override
    public int hashCode() {
        return key.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return key.equals(((Key) obj).key);
    }
}

 

์ฝ”๋“œ ์„ค๋ช…

์ด ์ฝ”๋“œ์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์€ Key ํด๋ž˜์Šค์™€ HashMap ์‚ฌ์šฉ ๋ฐฉ์‹์ด๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” Key ๊ฐ์ฒด๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ HashMap์˜ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์† ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ๋‹ค.

  • Map<Key, String> map = new HashMap<>();
    HashMap ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ Key ๊ฐ์ฒด๋ฅผ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๊ณ , String์„ ๊ฐ’์œผ๋กœ ์ €์žฅํ•œ๋‹ค.
  • while (true) { map.put(new Key("key"), "value"); }
    ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด Key ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ HashMap์— ์ถ”๊ฐ€ํ•œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ ์ด์œ 

  1. Key ๊ฐ์ฒด์˜ ๋ฌดํ•œ ์ƒ์„ฑ
    • ๋งค๋ฒˆ new Key("key")๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒˆ๋กœ์šด Key ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋•Œ๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ Key ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  2. HashMap์˜ ์ฐธ์กฐ ์œ ์ง€
    • HashMap์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์—”ํŠธ๋ฆฌ(ํ‚ค-๊ฐ’ ์Œ)๋ฅผ ์ €์žฅํ•  ๋•Œ, ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค๋ฅผ ์ฐธ์กฐ๋กœ ์ €์žฅํ•œ๋‹ค.
    • ์ƒˆ๋กœ ์ƒ์„ฑ๋œ Key ๊ฐ์ฒด๋Š” hashCode()์™€ equals() ๋ฉ”์„œ๋“œ์— ์˜ํ•ด ๊ฐ™์€ ๊ฐ’("key")์„ ๊ฐ–๋”๋ผ๋„ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด์ด๋‹ค.
    • ๋”ฐ๋ผ์„œ, HashMap์€ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด Key ๊ฐ์ฒด๋ฅผ ์ธ์‹ํ•˜์—ฌ ์ƒˆ๋กœ์šด ์—”ํŠธ๋ฆฌ๋กœ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค.
  3. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ์›์ธ:
    • HashMap์€ ํ‚ค์™€ ๊ฐ’์„ ๊ฐ๊ฐ์˜ ์—”ํŠธ๋ฆฌ๋กœ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด์ „์— ์ €์žฅ๋œ Key ๊ฐ์ฒด๋ฅผ ์—ฌ์ „ํžˆ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค.
    • ์ฆ‰, ์ด์ „์— ์‚ฝ์ž…๋œ Key ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋”๋ผ๋„, HashMap์ด ์—ฌ์ „ํžˆ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ GC(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ)๊ฐ€ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ˆ˜๊ฑฐํ•˜์ง€ ๋ชปํ•œ๋‹ค.
    • ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด Key ๊ฐ์ฒด๊ฐ€ HashMap์— ์ถ”๊ฐ€๋˜๊ณ , ๊ธฐ์กด Key ๊ฐ์ฒด๋“ค์ด ์ œ๊ฑฐ๋˜์ง€ ์•Š๊ณ  ์ฐธ์กฐ๋กœ ๋‚จ์•„์žˆ์œผ๋ฏ€๋กœ, ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ ์  ๋ˆ„์ ๋œ๋‹ค.
  • ์˜ฌ๋ฐ”๋ฅธ hashCode()์™€ equals() ๊ตฌํ˜„์˜ ์ค‘์š”์„ฑ
๋”๋ณด๊ธฐ

์˜ฌ๋ฐ”๋ฅธ hashCode()์™€ equals() ๊ตฌํ˜„์˜ ์ค‘์š”์„ฑ

Key ํด๋ž˜์Šค๊ฐ€ hashCode()์™€ equals() ๋ฉ”์„œ๋“œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฉด, HashMap์€ ์„œ๋กœ ๋‹ค๋ฅธ Key ๊ฐ์ฒด๋ฅผ ๋™์ผํ•œ ๊ฐ์ฒด๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ๊ฐ™์€ ํ‚ค๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฝ์ž…ํ•ด๋„ ํ•ด์‹œ ํ…Œ์ด๋ธ” ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ์—”ํŠธ๋ฆฌ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜์–ด, ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ๋„ ์ผ์ข…์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์ž˜๋ชป๋œ ๊ตฌํ˜„ ์˜ˆ์‹œ

class Key {
    String key;

    Key(String key) {
        this.key = key;
    }

    // hashCode()์™€ equals()๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜, ์ž˜๋ชป ๊ตฌํ˜„ํ•œ ๊ฒฝ์šฐ
    // ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ ์ฆ๊ฐ€
}

 

๊ฐœ์„ ๋œ ์ฝ”๋“œ

Key ๊ฐ์ฒด๊ฐ€ ํ•ญ์ƒ ๋™์ผํ•œ ํ•ด์‹œ ๊ฐ’์„ ๊ฐ€์ง€๋„๋ก ๊ตฌํ˜„ํ•˜๊ณ , equals() ๋ฉ”์„œ๋“œ๊ฐ€ ๋‘ ๊ฐ์ฒด๋ฅผ ์ œ๋Œ€๋กœ ๋น„๊ตํ•˜๋„๋ก ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

 

class Key {
    String key;

    Key(String key) {
        this.key = key;
    }

    @Override
    public int hashCode() {
        return key.hashCode();  // ๋™์ผํ•œ ํ‚ค ๋ฌธ์ž์—ด์€ ๋™์ผํ•œ ํ•ด์‹œ ์ฝ”๋“œ ๋ฐ˜ํ™˜
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;  // ๋™์ผ ๊ฐ์ฒด์ผ ๊ฒฝ์šฐ true
        if (obj == null || getClass() != obj.getClass()) return false;  // ํด๋ž˜์Šค๊ฐ€ ๋‹ค๋ฅผ ๊ฒฝ์šฐ false
        Key other = (Key) obj;
        return key.equals(other.key);  // ๋™์ผํ•œ ํ‚ค ๊ฐ’์„ ๊ฐ€์ง„ ๊ฒฝ์šฐ true
    }
}

 

 

 

3. Out of Memory์™€ Memory Leak ์ฐจ์ด์ 

ํŠน์ง• Out of Memory (OOM) Memory Leak (๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜)
์ •์˜ ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•œ ์‚ฌํ•ญ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์œ ์ง€๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ
์›์ธ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ๋กœ๋“œ, ๋ฌดํ•œ ๊ฐ์ฒด ์ƒ์„ฑ, ์ ์ ˆํ•˜์ง€ ์•Š์€ ํž™ ์„ค์ • ๋“ฑ ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ฐธ์กฐ ์œ ์ง€, ์ž˜๋ชป๋œ ์ปฌ๋ ‰์…˜ ์‚ฌ์šฉ, ๋ฆฌ์Šคํ„ฐ/์ฝœ๋ฐฑ ๋ฏธํ•ด์ œ ๋“ฑ
์ฆ์ƒ OutOfMemoryError ๋ฐœ์ƒ, ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ๊ฐ€๋Šฅ์„ฑ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€, ์‹œ์Šคํ…œ ์„ฑ๋Šฅ ์ €ํ•˜, ๊ฒฐ๊ตญ OOM์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Œ
ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ํž™ ํฌ๊ธฐ ์กฐ์ •, ์ฝ”๋“œ ์ตœ์ ํ™”, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ํŒจํ„ด ๋ถ„์„ ์ฐธ์กฐ ํ•ด์ œ, ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ ์‚ฌ์šฉ, ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ ์ •์  ๋ถ„์„ ๋„๊ตฌ ํ™œ์šฉ
๋ณต๊ตฌ ๊ฐ€๋Šฅ์„ฑ JVM ์žฌ์‹œ์ž‘์ด๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ํ™•์žฅ ํ•„์š” ์ฝ”๋“œ ์ˆ˜์ • ๋ฐ ์ตœ์ ํ™”๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

 

๊ฒฐ๋ก 

Out of Memory(OOM)๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ž์›์ด ์™„์ „ํžˆ ๊ณ ๊ฐˆ๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ด๊ณ , Memory Leak (๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜)๋Š” ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์œ ํ•œ ์ƒํƒœ๋กœ ๋ฐฉ์น˜๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ๊ฒฐ๊ตญ OOM ์˜ค๋ฅ˜๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‘˜ ๋‹ค ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์˜ ์ฃผ์š”ํ•œ ๋ถ€๋ถ„์ด๋ฉฐ ๊ฐœ๋ฐœ์ž๋Š” ์ด๋ฅผ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์ ์ ˆํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•ด์•ผ ํ•œ๋‹ค.