Next.js์ ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ตฌ์กฐ
Next.js๋ Node.js ๊ธฐ๋ฐ์ V8 ์์ง์์ ์คํ๋๋ค.
JavaScript๋ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด์ด๋ค. ๋ฐ๋ผ์ V8 ์ญ์ ์๋ฐ์คํฌ๋ฆฝํธ์ Context ๋น ํ๋์ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ๋ค. ๋จ, ์๋น์ค ์์ปค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์์ปค์ ๊ฐ์๋งํผ ํ๋ก์ธ์ค๋ฅผ ์ฆ์ํ๋ค๊ณ ํ๋ค.
์คํ์ค์ธ ํ๋ก๊ทธ๋จ์ V8 ํ๋ก์ธ์ค์์ ํ ๋น๋ ์ผ์ ๋์ ๋ฉ๋ชจ๋ฆฌ๋ก ํํ๋๋๋ฐ, ์ด๋ฅผ Resident set์ด๋ผ๊ณ ํ๋ค. ๋ด๋ถ ๊ตฌ์กฐ๋ ์๋ ์ฌ์ง๊ณผ ๊ฐ๋ค.
์ฌ์ง์์ ๋ณผ ์ ์๋ฏ์ด ํฌ๊ฒ ํ ๋ฉ๋ชจ๋ฆฌ์ ์คํ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ด๋ฆฌ ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
1๏ธโฃ ์คํ ๋ฉ๋ชจ๋ฆฌ
์คํ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๊ณ V8๋ง๋ค ํ๋์ ์คํ์ ๊ฐ์ง๋ค. ์คํ์๋ ์ ์ ๋ฐ์ดํฐ(๋ฉ์๋์ ํจ์ ํ๋ ์, ์์ ๊ฐ, ๊ฐ์ฒด ํฌ์ธํฐ)๊ฐ ์ ์ฅ๋๋ค.
V8์ ์คํ ์์ญ์ ๊ด๋ฆฌ๋ OS์ ์์ํ์ฌ ๊ด๋ฆฌํ๋ค. (์๋์ผ๋ก ๊ด๋ฆฌ)
2๏ธโฃ ํ ๋ฉ๋ชจ๋ฆฌ
- ํ ๋ฉ๋ชจ๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์์ ๊ฐ์ฅ ํฐ ๋ธ๋ก์ ์ฐจ์งํ๊ณ ์๋ค. ํ์๋ ๊ฐ์ฒด์ ๋์ ๋ฐ์ดํฐ๋ค์ด ์ ์ฅ ๋๋ค.
- ํ์ ์คํ๊ณผ ๋ฌ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋์ผ๋ก ๊ด๋ฆฌ๋์ง ์์ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํ ์ ์๋ค.
- ํ์์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํด ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ๋ฐ์ํ ์ ์๋๋ฐ, **New space(Young generation)**๊ณผ Old space(Old generation) ์์ญ์ ํ์์ ๋ฐ์ํ๋ค.
๐ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์ ์์ญ
New space(Young generation)
- ์๋ก ๋ง๋ค์ด์ง ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ณ , ์ด ๊ฐ์ฒด๋ค์ ์งง์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ๋๋ค.
- ์ด ์์ญ์ ์ค์บ๋ฒค์ ธ๋ผ๋ ์ด๋ฆ์ ๋ง์ด๋ GC๋ฅผ ํตํด ๊ด๋ฆฌ๋๋ค.
- New space์ ํฌ๊ธฐ๋ --min_semi_space_size(์ด๊ธฐ๊ฐ)์ --max_semi_space_size(์ต๋๊ฐ) V8์์ง์ ํ๋๊ทธ ๊ฐ์ ์ฌ์ฉํด ์กฐ์ ํ ์ ์๋ค.
Old spcae(Old generation)
- ์ค์บ๋ฒค์ ธ(๋ง์ด๋ GC)๊ฐ ๋ ๋ฒ ์ํํ ๋์ New space์์ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ด ์ด๋ํ๋ ์์ญ์ด๋ค.
- ๋ฉ์ด์ GC๊ฐ ๊ด๋ฆฌํ๋ฉฐ, ๋ ์์ญ์ผ๋ก ๋๋๋ค.
- Old ํฌ์ธํฐ ์์ญ
์ค์บ๋ฒค์ ธ๋ก๋ถํฐ ์ด์๋จ์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์ด ๊ฐ์ฒด๋ค์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ค. - Old ๋ฐ์ดํฐ ์์ญ
- ๋ฐ์ดํฐ๋ง ๊ฐ์ง ๊ฐ์ฒด(๋ค๋ฅธ ๊ฐ์ฒด ์ฐธ์กฐx)๋ฅผ ๊ฐ์ง๋ค.
- ๋ฌธ์์ด, boxing๋ ์ซ์, doubled unboxing๋ ๋ฐฐ์ด ๋ฑ์ด ์ด ๊ณณ์ ์์นํ๋ค.
- Old ํฌ์ธํฐ ์์ญ
- Old space์ ํฌ๊ธฐ๋ --min_old_space_size(์ด๊ธฐ๊ฐ)์ --max_old_space_size(์ต๋๊ฐ) V8์์ง์ ํ๋๊ทธ ๊ฐ์ ์ฌ์ฉํด ์กฐ์ ํ ์ ์๋ค.
V8์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ : Garbage Collection
์คํ์ ์์์ ๊ด๋ฆฌ๋์ง๋ง ํ ๊ณต๊ฐ์ V8์์ง์ด ๊ด๋ฆฌํ๋๋ฐ, ์ด ์ญํ ์ ๊ฐ๋น์ง ์ปฌ๋ ์
์ด ์ํํ๋ค.
๊ฐ๋น์ง ์ปฌ๋ ์
์ ์ฐธ์กฐ๊ฐ ์๋ ๊ฐ์ฒด๋ค์ด ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋น์ ์ ๊ฐ์ฒด๋ฅผ ์ํ ๊ณต๊ฐ์ ๋ง๋ ๋ค.
โ ์ฐธ์กฐ๊ฐ ์๋ ๊ฐ์ฒด๋?
๋์ด์ ํ์๊ฐ ์์ด์ ์คํ์ผ๋ก๋ถํฐ ์ฃผ์ ์ฐธ์กฐ๊ฐ ๋ฐ์ํ์ง ์๋ ๊ฐ์ฒด์ด๋ฉฐ, ๋๋ฌ ๊ฐ๋ฅ์ฑ(reachability)์ด ์๋ ๊ฐ์ฒด๋ผ๊ณ ๋ํ๋ค.
ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ ํ ๋น๋ ๋ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ค๋ฅ๋ฅผ ๋ฐ์ํ๋ค. ํ์ด ์๋ชป ๊ด๋ฆฌ ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์ ์ํ์ด ์๊ธฐ ๋๋ฌธ์, ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์ ๊ด๋ฆฌ๋ฅผ ํ์ฌ ์ด๋ฅผ ๋ฐฉ์ง ํด์ผํ๋ค.
๐Garbage Collection์ ์ฃผ์ ๊ฐ๋ - reachability(๋๋ฌ ๊ฐ๋ฅ์ฑ)
๋๋ฌ ๊ฐ๋ฅ์ฑ์ ๊ฐ์ฒด๊ฐ ์ฌ์ ํ ํ๋ก๊ทธ๋จ์์ ์ ๊ทผ ๊ฐ๋ฅํ ์ํ์ธ์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ๊ธฐ์ค์ด๋ค. ๋น์ง ์ปฌ๋ ์ ์ ์ด ๊ฐ๋ ์ ๋ฐํ์ผ๋ก ํ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํ๋ค.
- ๋๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฒด: ๋ฃจํธ(root, ์ ์ญ ๊ฐ์ฒด ๋ฑ)์์๋ถํฐ ์ฐธ์กฐ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ ๋ชจ๋ ๊ฐ์ฒด๋ ๋๋ฌ ๊ฐ๋ฅํ ์ํ๋ก ๊ฐ์ฃผ๋๋ค. ์ด๋ค์ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ๋ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก ๊ฐ๋น์ง ์ปฌ๋ ์ ์์ ์ ์ธ๋๋ค.
- ๋๋ฌ ๋ถ๊ฐ๋ฅํ ๊ฐ์ฒด: ๋ฃจํธ์์ ์ฐธ์กฐ๋์ง ์์ ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์์ผ๋ก, ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐจ์งํ๋ฏ๋ก ์ ๋ฆฌ๋๋ค.
- Object3๋ ๋ฃจํธ๋ก๋ถํฐ ๋๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฒด๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์์ด ๋๋ค.
-> Object 1, 3, 4๋ ์๋ก ๋๋ฌํ ์ ์์ง๋ง ๋ฌธ์ ๋ ๋ฃจํธ์์ ์ด ๊ฐ์ฒด๋ค์ ๋๋ฌํ ์๊ฐ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก Object 1, 3, 4 ๋ชจ๋ ๊ฐ๋น์ง์ปฌ๋ ์
์ ๋์์ด ๋๋ค.
๐ก ์ฐธ๊ณ ์๋ฃ:
- https://speakerdeck.com/deepu105/v8-memory-usage-stack-and-heap
- https://fe-developers.kakaoent.com/2022/220519-garbage-collection/
- https://velog.io/@seyoung8239/V8-%EC%97%94%EC%A7%84-%EB%82%B4%EB%B6%80%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC
- https://gobae.tistory.com/116#V-%EC%--%--%EC%--%-C%EC%-D%--%--%ED%-E%--%--%EB%A-%--%EB%AA%A-%EB%A-%AC
- https://gobae.tistory.com/101
- https://deepu.tech/memory-management-in-v8/
'Development > Next.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Next.js] node.js ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ํ์ธ๊ณผ heap ๋ฉ๋ชจ๋ฆฌ ์ ํ ์ ์ฉํ๊ธฐ (0) | 2024.12.23 |
---|---|
[Next.js] SWC๋ฅผ ํ์ฉํ์ฌ ๋น๋ ์๊ฐ ๋จ์ถํ๊ธฐ (3) | 2024.11.01 |
๋๊ธ