Skip to content

Latest commit

ย 

History

History
49 lines (27 loc) ยท 3.39 KB

File metadata and controls

49 lines (27 loc) ยท 3.39 KB

Memory dump

๐Ÿ“Œ ๊ฐœ์š”

Java(+Kotlin)๋Š” JVM์˜ GC๋ฅผ ์ด์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ C/C++์ฒ˜๋Ÿผ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. GC๋Š” ๋‚˜๋ฆ„ ๋˜‘๋˜‘ํ•˜์ง€๋งŒ, ์•ˆํƒ€๊น๊ฒŒ๋„ ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•˜์ง€ ๋ชปํ•ด์„œ OOM์ด ๋ฐœ์ƒํ•˜์—ฌ ์•ฑ์ด ์ข…๋ฃŒ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค. ์•ˆ๋“œ๋กœ์ด๋“œ ์„ธ๊ณ„์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์„ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(memory leak)๊ฐ€ ์ผ์–ด๋‚ฌ๋‹ค๊ณ  ๋งํ•œ๋‹ค.


๐Ÿ“Œ ๋ชฉํ‘œ

  • ๋Œ€ํ‘œ์ ์ธ ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฆญ์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.
  • Memory profiler๋ฅผ ์ด์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฆญ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.

๐Ÿ“Œ Memory leak

์•ฑ์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ์ธ๋ฐ๋„, ์•„์ง ์‚ฌ์šฉ์ค‘์ธ ๋ฉ”๋ชจ๋ฆฌ๋กœ ํŒ๋‹จ๋˜์–ด GC์˜ ์ •๋ฆฌ ๋Œ€์ƒ์ด ๋˜์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ๋ฆญ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. GC์˜ ์ •๋ฆฌ ๋Œ€์ƒ์œผ๋กœ ์„ ์ •ํ•˜๋Š” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ์—์„œ ์•Œ์•„๋ณด์ž.

์•ˆ๋“œ๋กœ์ด๋“œ ์„ธ๊ณ„์—์„œ๋Š” ์•กํ‹ฐ๋น„ํ‹ฐ์™€ ๊ฐ™์€ context ๊ฐ€ ๋ˆ„์ˆ˜๋  ๊ฒฝ์šฐ OOM ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์•„์ง„๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ์•กํ‹ฐ๋น„ํ‹ฐ๋Š” ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ์ฐธ์กฐ(์˜ˆ๋ฅผ ๋“ค๋ฉด resources)๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹คํ–‰ํžˆ ์•กํ‹ฐ๋น„ํ‹ฐ๋Š” ์ƒ๋ช…์ฃผ๊ธฐ ์ฝœ๋ฐฑ์ด ์žˆ์–ด์„œ ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ์‚ฌ๋ผ์ง€๊ธฐ ์ „ onDestroy()์—์„œ ์ •๋ฆฌํ•˜๋ฉด ๋˜์ง€๋งŒ, ํ•ด๋‹น context๊ฐ€ Strong reference๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋‹ค๋ฉด ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  GC๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•  ์ˆ˜ ์—†๊ฒŒ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋ฆญ์ด ์žˆ๋‹ค๊ณ ํ•ด์„œ ๋ฌด์กฐ๊ฑด OOM์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์•ˆ๋“œ๋กœ์ด๋“œ ์šด์˜์ฒด์ œ์˜ ํ”„๋กœ์„ธ์Šค ์บ์‹œ ์ •์ฑ…์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•˜๊ธฐ๋•Œ๋ฌธ์— OOM์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฆญ ํŒŒํ‹ฐ๊ฐ€ ์—ด๋ ธ๋Š”๋ฐ ์•ˆ์ฃผํ•˜๋ฉด ์•ˆ๋œ๋‹ค. GC๊ฐ€ ๋„ˆ๋ฌด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์„ ํ•˜๋ฉด ์•ฑ์˜ ์„ฑ๋Šฅ์ด ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค(a.k.a stop the world).

โš ๏ธ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฆญ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ

  1. ์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ static ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ ์žˆ์„ ๋•Œ
    • IDE ์—์„œ android context ๋ฅผ static field ์— ๋‹ด์ง€ ๋ง๋ผ๊ณ  memory leak warning ์„ ์ค€๋‹ค.
  2. Strong reference๋ฅผ ๊ฐ€์ง„ ์Šค๋ ˆ๋“œ๊ฐ€ ํ˜ธ์ถœํ•œ ์•กํ‹ฐ๋น„ํ‹ฐ๋ณด๋‹ค ์˜ค๋ž˜ ์œ ์ง€๋˜์–ด์žˆ์„ ๋•Œ
    • ์ž‘์—…์ด ์™„๋ฃŒ๋˜์ง€์•Š์•„ ์•กํ‹ฐ๋น„ํ‹ฐ context ๊ฐ€ ์‚ด์•„์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ž์„ธํ•œ ์ผ€์ด์Šค๋Š” ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ์ฐธ๊ณ ํ•ด๋ณด์ž.


๐Ÿ“Œ Memory profiler

์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฆญ์ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ LeakCanary๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋ฒˆ ์žฅ์—์„œ๋Š” Android studio์˜ memory profiler๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฆญ์„ ํ•ด๊ฒฐํ•ด๋ณด์ž.


๐Ÿพ Next step