Java(+Kotlin)๋ JVM์ GC๋ฅผ ์ด์ฉํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ฏ๋ก C/C++์ฒ๋ผ ๊ฐ๋ฐ์๊ฐ ๋ช ์์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํ ํ์๊ฐ ์๋ค. GC๋ ๋๋ฆ ๋๋ํ์ง๋ง, ์ํ๊น๊ฒ๋ ๋ชจ๋ ์ํฉ์์ ์๋ฒฝํ๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฆฌํ์ง ๋ชปํด์ OOM์ด ๋ฐ์ํ์ฌ ์ฑ์ด ์ข ๋ฃ๋์ด๋ฒ๋ฆฐ๋ค. ์๋๋ก์ด๋ ์ธ๊ณ์์๋ ์ด๋ ๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฆฌํ์ง ๋ชปํ๋ ์ํฉ์ ๋ฉ๋ชจ๋ฆฌ ๋์(memory leak)๊ฐ ์ผ์ด๋ฌ๋ค๊ณ ๋งํ๋ค.
- ๋ํ์ ์ธ ์๋๋ก์ด๋ ์ฑ์ ๋ฉ๋ชจ๋ฆฌ๋ฆญ์ ๋ํด ์์๋ณธ๋ค.
- Memory profiler๋ฅผ ์ด์ฉํด ๋ฉ๋ชจ๋ฆฌ๋ฆญ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณธ๋ค.
์ฑ์์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ์ธ๋ฐ๋, ์์ง ์ฌ์ฉ์ค์ธ ๋ฉ๋ชจ๋ฆฌ๋ก ํ๋จ๋์ด GC์ ์ ๋ฆฌ ๋์์ด ๋์ง ๋ชปํ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ๋ฆญ์ด ๋ฐ์ํ ์ ์๋ค. GC์ ์ ๋ฆฌ ๋์์ผ๋ก ์ ์ ํ๋ ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ์์ ์์๋ณด์.
์๋๋ก์ด๋ ์ธ๊ณ์์๋ ์กํฐ๋นํฐ์ ๊ฐ์ context ๊ฐ ๋์๋ ๊ฒฝ์ฐ OOM ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์์ง๋ค. ์๋ํ๋ฉด, ์กํฐ๋นํฐ๋ ๊ฐ๋ฆฌํค๊ณ ์๋ ์ฐธ์กฐ(์๋ฅผ ๋ค๋ฉด resources)๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ด๋ค. ๋คํํ ์กํฐ๋นํฐ๋ ์๋ช
์ฃผ๊ธฐ ์ฝ๋ฐฑ์ด ์์ด์ ์กํฐ๋นํฐ๊ฐ ์ฌ๋ผ์ง๊ธฐ ์ onDestroy()์์ ์ ๋ฆฌํ๋ฉด ๋์ง๋ง, ํด๋น context๊ฐ Strong reference๋ก ์ฐ๊ฒฐ๋์ด์๋ค๋ฉด ์กํฐ๋นํฐ๊ฐ ์ข
๋ฃ๋์์์๋ ๋ถ๊ตฌํ๊ณ GC๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ ์ ์๊ฒ๋๋ค.
ํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ๋ฆญ์ด ์๋ค๊ณ ํด์ ๋ฌด์กฐ๊ฑด OOM์ด ๋ฐ์ํ๋ ๊ฒ์ ์๋๋ค. ์๋๋ก์ด๋ ์ด์์ฒด์ ์ ํ๋ก์ธ์ค ์บ์ ์ ์ฑ ์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฆฌํ๊ธฐ๋๋ฌธ์ OOM์ด ๋ฐ์ํ์ง ์์ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ ๋ค๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฆญ ํํฐ๊ฐ ์ด๋ ธ๋๋ฐ ์์ฃผํ๋ฉด ์๋๋ค. GC๊ฐ ๋๋ฌด ๋น๋ฒํ๊ฒ ์ผ์ ํ๋ฉด ์ฑ์ ์ฑ๋ฅ์ด ๋๋น ์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค(a.k.a stop the world).
- ์กํฐ๋นํฐ์์ static ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์์ ๋
- IDE ์์ android context ๋ฅผ static field ์ ๋ด์ง ๋ง๋ผ๊ณ memory leak warning ์ ์ค๋ค.
- Strong reference๋ฅผ ๊ฐ์ง ์ค๋ ๋๊ฐ ํธ์ถํ ์กํฐ๋นํฐ๋ณด๋ค ์ค๋ ์ ์ง๋์ด์์ ๋
- ์์ ์ด ์๋ฃ๋์ง์์ ์กํฐ๋นํฐ context ๊ฐ ์ด์์์ ๊ฒ์ด๋ค.
์์ธํ ์ผ์ด์ค๋ ๊ตฌ๊ธ๋ง์ ํตํด ์ฐธ๊ณ ํด๋ณด์.
์๋๋ก์ด๋ ์ฑ์์ ๋ฉ๋ชจ๋ฆฌ๋ฆญ์ด ๋ฐ์ํ๋์ง ํ๋จํ๋ ๋ฐฉ๋ฒ์ผ๋ก LeakCanary๋ฅผ ํ์ฉํ ์ ์์ง๋ง, ์ด๋ฒ ์ฅ์์๋ Android studio์ memory profiler๋ฅผ ํ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฆญ์ ํด๊ฒฐํด๋ณด์.
- ๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ฌ Memory profiler๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์๊ธฐ
- ์ถ์ฒ์ฌ์ดํธ : Android Memory Profiler: Getting Started
- ์ถ์ฒ์์ : Demystify the Data in Android Studio Profilers (Android Dev Summit '19)
- ๋ฉ๋ชจ๋ฆฌ๋ฆญ ์์ ํ๋ก์ ํธ๋ฅผ fork ํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฆญ์ ํด๊ฒฐํด๋ณด๊ธฐ