--- category: Unified tags: [auto-consolidated, technical-documentation] title: [[Retaining Path|Retaining Path]] last_updated: 2026-05-02 --- # [[Retaining Path|Retaining Path]] ## ๐Ÿ“Œ Brief Summary > Retaining Path(์œ ์ง€ ๊ฒฝ๋กœ)๋Š” ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๊ณ„์† ์‚ด์•„์žˆ๊ฒŒ(live) ๋งŒ๋“œ๋Š” ์ฐธ์กฐ์˜ ์‚ฌ์Šฌ(chain of [[Reference|Reference]]s)์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1, 2]. V8 ์—”์ง„์€ ์ „์—ญ ๊ฐ์ฒด๋‚˜ ํ™œ์„ฑ ์Šคํƒ๊ณผ ๊ฐ™์€ GC ๋ฃจํŠธ([[GC Root|GC Root]])๋กœ๋ถ€ํ„ฐ ํฌ์ธํ„ฐ ์‚ฌ์Šฌ์„ ํ†ตํ•ด ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์‚ด์•„์žˆ๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค [3]. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ๋กœ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜([[memory|memory]] leak) ์›์ธ์„ ์‹๋ณ„ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค [4, 5]. --- > ๋ณด์กด ๊ฒฝ๋กœ(Retaining Path)๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์กฐ์‚ฌํ•  ๋•Œ ํŠน์ • ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC)์— ์˜ํ•ด ์ˆ˜๊ฑฐ๋˜์ง€ ์•Š๊ณ  ์‚ด์•„๋‚จ๊ฒŒ ๋งŒ๋“œ๋Š” ์ฐธ์กฐ ์ฒด์ธ(chain of [[Reference|Reference]]s)์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค [1, 2]. V8 ์—”์ง„์€ ์ „์—ญ ์ฐฝ(window) ๊ฐ์ฒด๋‚˜ ํ™œ์„ฑ ์Šคํƒ์˜ ๋กœ์ปฌ ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ๋ฃจํŠธ ๊ฐ์ฒด([[GC Root|GC Root]])๋กœ๋ถ€ํ„ฐ ํฌ์ธํ„ฐ ์ฒด์ธ์„ ํ†ตํ•ด ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€ํ•ด์•ผ ํ•  ๊ฐ์ฒด๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค [3]. ๊ฐœ๋ฐœ์ž๋Š” ํž™ ์Šค๋ƒ…์ƒท ๋„๊ตฌ๋‚˜ ํŠน์ˆ˜ ๋””๋ฒ„๊น… ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ณด์กด ๊ฒฝ๋กœ๋ฅผ ์—ญ์ถ”์ ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์ฐธ์กฐ๋ฅผ ์‹๋ณ„ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2-4]. ## ๐Ÿ“– Core Content - **๊ฐœ๋…์  ์›๋ฆฌ:** ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์žƒ์–ด๋ฒ„๋ฆฐ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ฐ์ฒด๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  GC ๋ฃจํŠธ(์˜ˆ: window, ํ™œ์„ฑ ํด๋กœ์ €, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ, ํƒ€์ด๋จธ ๋“ฑ)๋กœ๋ถ€ํ„ฐ ๊ณ„์† ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์ด๋ฅผ ํšŒ์ˆ˜ํ•˜์ง€ ๋ชปํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [1]. Retaining Path๋Š” ๋ˆ„์ˆ˜๋œ ๊ฐ์ฒด์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋ถ™์žก๊ณ  ์žˆ๋Š” GC ๋ฃจํŠธ๊นŒ์ง€ ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์ด์–ด์ง€๋Š” ์ฐธ์กฐ ์ฒด์ธ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค [3, 5]. - **์‹๋ณ„ ๋ฐ ๋ถ„์„ ๋„๊ตฌ:** - **[[Chrome DevTools|Chrome DevTools]] (Memory ํŒจ๋„):** ํž™ ์Šค๋ƒ…์ƒท([[Heap Snapshot|Heap Snapshot]])์ด๋‚˜ ํ• ๋‹น ํƒ€์ž„๋ผ์ธ([[Allocation Timeline|Allocation Timeline]]) ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ์œ„์น˜์™€ ํ•ด๋‹น ๊ฐ์ฒด์˜ Retaining Path๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 6]. Retainers ํŒจ๋„์€ ์„ ํƒ๋œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์˜ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค [4, 7]. - **Retainer ์ˆจ๊ธฐ๊ธฐ (Ignore this retainer):** ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜์—ฌ ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•œ ํ›„ ํž™ ์Šค๋ƒ…์ƒท์„ ๋‹ค์‹œ ์ฐ๋Š” ์ˆ˜๊ณ ๋ฅผ ๋œ๊ธฐ ์œ„ํ•ด, ํŠน์ • retainer๋ฅผ ์šฐํด๋ฆญํ•˜์—ฌ ๋ฌด์‹œ(Ignore)ํ•จ์œผ๋กœ์จ ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ์—ฌ์ „ํžˆ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8]. - **`%DebugTrackRetainingPath(object)` ํ•จ์ˆ˜:** ๊ทน๋„๋กœ ๋ณต์žกํ•œ ๋ˆ„์ˆ˜๋ฅผ ์กฐ์‚ฌํ•  ๋•Œ๋Š” V8 ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 9]. `--allow-natives-syntax` ๋ฐ `--track-retaining-path` ํ”Œ๋ž˜๊ทธ๋ฅผ ์ ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•˜๋ฉด, GC๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๊ฐ์ฒด์˜ ์‹ค์ œ Retaining Path๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค [9]. ์ด ๋กœ๊ทธ๋Š” DevTools UI์˜ ์ถ”์ƒํ™”๋ฅผ ์šฐํšŒํ•˜์—ฌ ๋งค์šฐ ๋‚ฎ์€ ์ˆ˜์ค€(low-level)์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์™€ ํƒ€์ž… ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [3]. - **๋””๋ฒ„๊น… ์›Œํฌํ”Œ๋กœ์šฐ:** ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ํ• ๋‹น๋œ ์ฑ„ ์ˆ˜์ง‘๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•œ ๋’ค, ํ•ด๋‹น ๊ฐ์ฒด์˜ Retainer ํŠธ๋ฆฌ๋ฅผ ํด๋ฆญํ•˜์—ฌ GC ๋ฃจํŠธ๊นŒ์ง€ ์ด์–ด์ง€๋Š” ์‚ฌ์Šฌ์„ ์ถ”์ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [5]. ์ด ๊ฒฝ๋กœ๋ฅผ ์ž์„ธํžˆ ๊ฒ€์‚ฌํ•˜๋ฉด ๊ฐ์ฒด๊ฐ€ ์ˆ˜์ง‘๋˜์ง€ ์•Š์€ ๊ทผ๋ณธ ์›์ธ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฝ”๋“œ์—์„œ ๋ถˆํ•„์š”ํ•œ ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์ •ํ™•ํ•œ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค [4, 5]. --- * **๋ณด์กด ๊ฒฝ๋กœ์˜ ๊ฐœ๋… ๋ฐ ์—ญํ• :** ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ๋ฃจํŠธ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ '์‚ด์•„์žˆ๋Š”(live)' ๊ฐ์ฒด๋กœ ํŒ๋‹จํ•˜์—ฌ ์ˆ˜๊ฑฐ ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค [3, 5]. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ๊ฐ์ฒด๊ฐ€ ์™œ ์ˆ˜๊ฑฐ๋˜์ง€ ์•Š๋Š”์ง€๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด ๋ณด์กด ๊ฒฝ๋กœ๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [4]. ๋ชจ๋“  ํž™ ์Šค๋ƒ…์ƒท์€ ๋งŽ์€ ํ›„๋ฐฉ(back) ์ฐธ์กฐ์™€ ๋ฃจํ”„๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด ํ•˜๋‚˜์˜ ๊ฐ์ฒด์— ์—ฌ๋Ÿฌ ๋ณด์กด์ž๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5]. * **๊ฐœ๋ฐœ์ž ๋„๊ตฌ(DevTools)๋ฅผ ํ†ตํ•œ ๋ถ„์„:** [[Chrome DevTools|Chrome DevTools]]์˜ [[memory|memory]] ํŒจ๋„์—์„œ ํž™ ์Šค๋ƒ…์ƒท([[Heap Snapshot|Heap Snapshot]])์ด๋‚˜ ํ• ๋‹น ํƒ€์ž„๋ผ์ธ([[Allocation Timeline|Allocation Timeline]])์„ ํ†ตํ•ด ํŠน์ • ๊ฐ์ฒด๋ฅผ ์„ ํƒํ•˜๋ฉด, 'Retainers(๋ณด์กด์ž)' ์„น์…˜์—์„œ ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋ณด์กด ํŠธ๋ฆฌ(Retaining tree)๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [1, 2, 4, 6]. ์ด ํŠธ๋ฆฌ๋Š” ๋ˆ„์ˆ˜๋œ ๊ฐ์ฒด์—์„œ๋ถ€ํ„ฐ ์ด๋ฅผ ๋ถ™์žก๊ณ  ์žˆ๋Š” GC ๋ฃจํŠธ๊นŒ์ง€์˜ ๊ฒฝ๋กœ๋ฅผ ์—ญ์ˆœ(reverse)์œผ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค [3, 7]. * **๋ณด์กด์ž ๋ฌด์‹œ(Ignore retainers) ๊ธฐ๋Šฅ:** DevTools์—์„œ๋Š” ํŠน์ • ๋ณด์กด์ž๋ฅผ ๋งˆ์šฐ์Šค ์šฐํด๋ฆญํ•˜์—ฌ "Ignore this retainer"๋ฅผ ์„ ํƒํ•จ์œผ๋กœ์จ ํ•ด๋‹น ์ฐธ์กฐ๋ฅผ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8]. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜์—ฌ ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ•œ ๋’ค ์Šค๋ƒ…์ƒท์„ ๋‹ค์‹œ ์ฐ๋Š” ๋ฒˆ๊ฑฐ๋กœ์šด ๊ณผ์ • ์—†์ด, ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ณ„์† ๋ณด์กดํ•˜๊ณ  ์žˆ๋Š”์ง€ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8]. * **๋กœ์šฐ๋ ˆ๋ฒจ(Low-level) ์ถ”์ :** ๋งค์šฐ ๋ณต์žกํ•œ ๋ˆ„์ˆ˜์˜ ๊ฒฝ์šฐ V8์˜ ๋‚ด๋ถ€ ํ•จ์ˆ˜์ธ `%DebugTrackRetainingPath(object)`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 9]. `--allow-natives-syntax` ๋ฐ `--track-retaining-path` ๋Ÿฐํƒ€์ž„ ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•˜๋ฉด, GC๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ๋ณด์กด ๊ฒฝ๋กœ ๋‚ด ๋ชจ๋“  ๋‚ด๋ถ€ ๊ฐ์ฒด์˜ 16์ง„์ˆ˜ ์ฃผ์†Œ์™€ ํƒ€์ž…์„ ์ถœ๋ ฅํ•˜์—ฌ DevTools UI์˜ ์ถ”์ƒํ™”๋ฅผ ์šฐํšŒํ•˜๋Š” ์„ธ๋ถ€์ ์ธ ๋กœ๊ทธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [3, 9]. gdb๋‚˜ lldb์™€ ๊ฐ™์€ ๋””๋ฒ„๊ฑฐ ์„ธ์…˜ ์ค‘์—๋„ `isolate->heap()->PrintRetainingPath(HeapObject*)` ๋ช…๋ น์„ ํ†ตํ•ด ๊ฐ์ฒด์˜ ๋ณด์กด ๊ฒฝ๋กœ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10]. ## โš–๏ธ Trade-offs & Caveats - **๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ์™€์˜ ์ถฉ๋Œ:** ์ž๋™ํ™” ์—”์ง„์— ์˜ํ•ด ๋งคํ•‘๋œ ์ง€์‹์œผ๋กœ, ์ถ”ํ›„ ์ •๋ฐ€ ๊ฒ€์ฆ ํ•„์š”. - **์ •์ฑ… ๋ณ€ํ™”:** AI ๋ถ„์•ผ์˜ ์ž๋™ ์ž์‚ฐํ™” ์ˆ˜ํ–‰. --- - **๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ์™€์˜ ์ถฉ๋Œ:** ์ž๋™ํ™” ์—”์ง„์— ์˜ํ•ด ๋งคํ•‘๋œ ์ง€์‹์œผ๋กœ, ์ถ”ํ›„ ์ •๋ฐ€ ๊ฒ€์ฆ ํ•„์š”. - **์ •์ฑ… ๋ณ€ํ™”:** AI ๋ถ„์•ผ์˜ ์ž๋™ ์ž์‚ฐํ™” ์ˆ˜ํ–‰. ## ๐Ÿ”— Knowledge Connections - **Related Topics:** Memory Leak, [[Garbage Collection|Garbage Collection]], [[GC Root|GC Root]], [[Heap Snapshot|Heap Snapshot]] - **Projects/Contexts:** [[Chrome DevTools|Chrome DevTools]], [[V8 JavaScript แ„‹แ…ฆแ†ซแ„Œแ…ตแ†ซ|V8 [[JavaScript]] Engine]] - **Contradictions/Notes:** ์†Œ์Šค ๋‚ด์— ๋ชจ์ˆœ๋œ ์ฃผ์žฅ์€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ๊ณต๋œ ์ž๋ฃŒ๋“ค์€ ๋ชจ๋‘ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ถ”์ ํ•˜๊ณ  V8 ์—”์ง„์—์„œ ๊ฐ์ฒด๊ฐ€ ์œ ์ง€๋˜๋Š” ์ด์œ ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ์žˆ์–ด Retaining Path์˜ ์ค‘์š”์„ฑ์„ ์ผ๊ด€๋˜๊ฒŒ ๊ฐ•์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. --- *Last updated: 2026-04-19* --- --- - **Related Topics:** [[Garbage Collection|Garbage Collection]], [[Heap Snapshot|Heap Snapshot]], [[GC Root|GC Root]], Memory Leak - **Projects/Contexts:** [[V8 Engine|V8 Engine]], [[Chrome DevTools|Chrome DevTools]], Node.js Memory [[Management|Management]] - **Contradictions/Notes:** ์†Œ์Šค ๋‚ด์— ์ƒ์ถฉ๋˜๋Š” ๋‚ด์šฉ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋ณด์กด ๊ฒฝ๋กœ๋Š” ๊ฐœ๋…์ ์œผ๋กœ ๋ฃจํŠธ(Root) ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘๋˜๋Š” ํฌ์ธํ„ฐ์˜ ์ฒด์ธ์ด์ง€๋งŒ, DevTools ๋“ฑ์˜ ๋ถ„์„ ๋„๊ตฌ์—์„œ๋Š” ๋ˆ„์ˆ˜๋œ ๊ฐ์ฒด์—์„œ ๋ฃจํŠธ๋กœ ์˜ฌ๋ผ๊ฐ€๋Š” ์—ญ์ˆœ(reverse)์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์‹œ๊ฐํ™”ํ•˜์—ฌ ๋””๋ฒ„๊น…์„ ๋•์Šต๋‹ˆ๋‹ค [3]. --- *Last updated: 2026-04-19* ---