๐Ÿ“‚ JAVA

[JAVA] Memory Leak๊ณผ OOME

dhyuck 2022. 6. 26. 19:31
๋ฐ˜์‘ํ˜•

Memory Leak(๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜)์ด๋ž€?

  • ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋“ค์ด GC(Garbage Collector)์— ์˜ํ•ด ํšŒ์ˆ˜๋˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ„์† ๋ˆ„์ ๋˜๋Š” ํ˜„์ƒ์œผ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์ฃผํ•˜๋Š” ๊ฐ์ฒด์˜ ์ข…๋ฅ˜๋Š” Referenced Objects์™€ Unreferenced Objects 2๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    GC๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ unreference objects๋ฅผ ์ œ๊ฑฐํ•˜๋ฉฐ, referenced object๋Š” ์‹ค์ œ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•„๋„ ์ œ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ์ด๋•Œ Unused Objects์ด๋ฉด์„œ referenced Object์ธ ๊ฐ์ฒด๋กœ ์ธํ•ด Memory Leak์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

OOME(Out Of Memory Error)์ด๋ž€?

  • Memory Leak์˜ ์ผ๋ฐ˜์ ์ธ ์ฆ์ƒ์œผ๋กœ Java Heap์— ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•  ๊ณต๊ฐ„์ด ๋ถ€์กฑํ• ๋•Œ ๋ฐœ์ƒํ•˜๋ฉฐ JAVA Class๋ฅผ Loadํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ๋ฉ”๋ชจ๋ฆฌ(native memory)๊ฐ€ ๋ถ€์กฑํ•  ๊ฒฝ์šฐ์—๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

    ๋“œ๋ฌธ ๊ฒฝ์šฐ์ด์ง€๋งŒ garbage collection์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ ๊ณผ๋„ํ•œ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ฑฐ์˜ ํ•ด์ œ๋  ๋•Œ ๋ฐœ์ƒ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

OOME์˜ ์ข…๋ฅ˜

  • java.lang.OutOfMemoryError: Java heap space

    • ๊ฐ์ฒด๋ฅผ ํž™์— ํ• ๋‹นํ•  ์ˆ˜ ์—†์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์—๋Ÿฌ์ด๋‚˜ ๋ฐ˜๋“œ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

      ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ๋™ ์ดˆ๊ธฐ์— ์ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค๋ฉด heap ์‚ฌ์ด์ฆˆ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋น„ํ•ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ๋™์ด ์˜ค๋ž˜๋œ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์˜์‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      ๋‹ค๋ฅธ ์ž ์žฌ์  ์›์ธ์€ finalize๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • Java heap ์‚ฌ์ด์ฆˆ๋ฅผ ๋Š˜๋ ค์„œ ์ด ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ๊ทผ๋ณธ์ ์ธ ์›์ธ์€ ๋˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— OOME ๋ฐœ์ƒํ•  ๋•Œ Heap Dump๋ฅผ ๋‚จ๊ฒจ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๋กœ์ง์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • java.lang.OutOfMemoryError: GC Overhead Limit Exceeded

    • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ๋„ˆ๋ฌด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚˜ ์ •์ƒ์ ์ธ ํ”„๋กœ๊ทธ๋žจ ์ง„ํ–‰์ด ์•ˆ ๋˜๊ณ  ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • Java heap ์‚ฌ์ด์ฆˆ๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ GC ์˜ค๋ฒ„ํ—ค๋“œ ์ œํ•œ ์ดˆ๊ณผ์— ๋Œ€ํ•œ exception์„ ์‹คํ–‰ ์˜ต์…˜ -XX:-UseGCOverheadLimit๋ฅผ ์‚ฌ์šฉํ•ด ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • java.lang.OutOfMemoryError: Requested array size exceeds VM limit

    • ์ „์ฒด ํž™ ํฌ๊ธฐ๋ณด๋‹ค ๋” ํฐ ๋ฐฐ์—ด์„ ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ์ž…๋‹ˆ๋‹ค.
    • Java heap ์‚ฌ์ด์ฆˆ๋ฅผ ๋Š˜๋ ค์ฃผ๊ฑฐ๋‚˜ ํฐ ๋ฐฐ์—ด์„ ํ• ๋‹นํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ๋กœ์ง์„ ์ˆ˜์ •ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • java.lang.OutOfMemoryError: Metaspace

    • Java class์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”๋ชจ๋ฆฌ(native memory) ์•ˆ์— MetaSpace์— ํ• ๋‹น๋˜๋Š”๋ฐ ์ด๋•Œ metaspace ๋ชจ๋‘ ์†Œ์ง„๋˜๋ฉด ๋ฐœ์ƒ๋˜๋Š” ์—๋Ÿฌ์ž…๋‹ˆ๋‹ค.

    • MaxMetaSpaceSize๊ฐ€ ์‹คํ–‰ ์˜ต์…˜์— ์„ค์ •๋œ ๊ฒฝ์šฐ ๊ฐ’์„ ๋Š˜๋ ค์ฃผ์–ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ JAVA heap ํฌ๊ธฐ๋ฅผ ์ค„์ด๋ฉด Metaspace์— ๋” ๋งŽ์€ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ์ด๋Š” JAVA ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉํ•˜๋Š” heap size๊ฐ€ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•