๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ์ƒํ™œ/์ด๊ฒƒ์ €๊ฒƒ

OOM์˜ ์›์ธ๊ณผ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ OOM ๋ฐœ์ƒ ์‹œํ‚ค๊ธฐ

by cocococo331 2022. 4. 16.

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

์ฐธ๊ณ