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๊ฐ ์ถฉ๋ถํ๋ค๊ณ ์๊ฐ๋๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ค.