์๋ฐ์์ Stack Memory & Heap Memory
by JiwonDev์๋ฐ๋ ๊ธฐ๋ณธ ์๋ฃํ(primary type)์ ์ ์ธํ๊ณ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๋ ํผ๋ฐ์ค (ํฌ์ธํฐ ์ฐธ์กฐ๊ฐ)์ผ๋ก ์ฌ์ฉํ๋ค. ์ฆ ํ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค๋ ๋ป์ธ๋ฐ, ์ ์ด๋ ๊ฒ ๋ง๋ค์๊ณ ์คํ, ํ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ตฌ๋ถ์ง์ด ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ผ๊น?
# 1. ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
C ๊ฐ์ ๊ณ ๊ธ์ธ์ด๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ ์ฝ๋๋ฅผ ๋ฐ๋ก ์คํ๊ฐ๋ฅํ ๋ช ๋ น์ด(.exe)๋ก ๋ฐ๊พธ๋ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ด๋ฅผ ์กฐ๊ธ ๋ ํฐ ๊ทธ๋ฆผ์ผ๋ก ๋ณด๊ฒ๋๋ฉด ์๋์ ๊ฐ์๋ฐ
- ์ฌ์ฉ์๊ฐ ์ด์์ฒด์ ์ ํ๋ก๊ทธ๋จ ์คํ์ ์์ฒญํ๊ณ
- ์ด์์ฒด์ ๋ ํ๋ก์ธ์ค๋ฅผ ๋ง๋ค๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ฒ ๋๋ค.
- ์ด๋ ํ๋ก์ธ์ค๋ง๋ค ํ ๋น๋๋ ๋ฉ๋ชจ๋ฆฌ๋ Code, Data, Heap, Stack ์์ญ์ผ๋ก ํจ์จ์ ์ผ๋ก ๋๋์ด์ฌ์ฉํ๋ค.
#2 ์๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
์๋ฐ ์ฝ๋๋ ๊ธฐ๊ณ์ด๊ฐ ์๋ ๋ฐ์ดํธ ์ฝ๋๋ก ๋ฒ์ญ๋๊ณ JVM์ ๊ฑฐ์ณ์ ์คํ๋๋ค. ๊ทธ๋์ ํ๋ก๊ทธ๋จ์ ์คํ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ JVM์์ ๋ฐ์์ ์ ๊ณตํ๊ธด ํ์ง๋ง, ํฐ ๊ทธ๋ฆผ์ผ๋ก ๋ดค์ ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค. Runtime Data Area์์ ํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด์์ฒด์ ๋ก ๋ถํฐ ํ ๋น๋ฐ์ผ๋ฉด JVM ๋ด๋ถ์์ Method(=Data), Stack, Heap, Native-Method, PC-register๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋์ด ์ฌ์ฉํ๋ค.
- Method Area : ๋ชจ๋ Thread์ ๊ณต์ ๋๋ ์ ์ ์ธ ์ ์ญ ๋ฐ์ดํฐ์ด๋ค. ํด๋์ค๋ ๋ณ์์ ์ ๋ณด, Static๋ณ์, ์์๋ฑ์ด ์ ์ฅ๋๋ค.
- Heap Area : ๋ชจ๋ Thread์ ๊ณต์ ๋๋ฉฐ ์ธ์คํด์ค์ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋ ๊ตฌ์ญ์ด๋ค. (๋ ํผ๋ฐ์ค ์ฐธ์กฐ, new ํค์๋)
- Stack Area : ๊ฐ ์ค๋ ๋๋ง๋ค ์ ์ฉ ์คํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์กด์ฌํ๋ค. ์ง์ญ๋ณ์, ํ๋ผ๋ฉํ, ๋ฆฌํด ๊ฐ๋ฑ์ด ์ ์ฅ๋๋ค.
- PC Register : ๊ฐ ์ค๋ ๋๋ง๋ค ํ๋์ฉ ์์ฑ๋๋ฉฐ Program Counter์ ์ญํ ์ ๋ด๋นํ๋ค. (ํ์ฌ ์คํ์ค์ธ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ฐ) ์๋ฐ์์๋ CPU ๋ ๋ฆฝ์ฑ์ ์ํด ๋ ์ง์คํฐ๊ธฐ๋ฐ์ด ์๋ ์คํ๊ธฐ๋ฐ์ผ๋ก ํ๋ก๊ทธ๋จ ๋ช ๋ น์ด ๋์ํจ์ ์์๋์.
- Native Method Stack : ๊ฐ ์ค๋ ๋๋ง๋ค ํ๋์ฉ ์์ฑ๋๋ฉฐ ๋ค๋ฅธ ์ธ์ด์ ๋ค์ดํฐ๋ธ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ํ ๊ณต๊ฐ์ด๋ค.
# 2-1 Stack ๋ฉ๋ชจ๋ฆฌ
์ค๋ช ์ ์ฝ์ด๋ณด๋ฉด ์๊ฒ ์ง๋ง, Java์ JVM์์ ์คํ ๋ฉ๋ชจ๋ฆฌ๋ ์ ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ๊ฐ๊ฐ ์ค๋ ๋ ๊ณต๊ฐ์์ ๋ฐ๋ก ์คํ๋๋ค. ์ด๋ ์คํ ๊ตฌ์กฐ๋ก ์ ์ฅ๋๋ฉฐ ์๋ก์ด ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด ์คํ ๋งจ์์ ์๋ก์ด ๋ธ๋ญ(Stack Frame)์ ์์ฑํ์ฌ ๊ฐ ๊ฐ์ฒด๋ ๋ฉ์๋๋ง๋ค ํ์ํ ์ง์ญ๋ณ์๋ค์ ์ ์ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฉ์๋๊ฐ ์คํ์ ๋ง์น๋ฉด ์คํ ๋ธ๋ญ(Stack Frame)์ ๋น์ฐ๋ ๋ฐฉ์์ด๋ค.
- ์๋ก์ด ๋ฉ์๋๊ฐ ํธ์ถ๋๊ณ ๋ฐํ๋ ๋ ๋ง๋ค ์คํ์ ํฌ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋ค.
- ์คํ ๋ด๋ถ์ ๋ณ์๋ ํด๋น ๋ฉ์๋(=์ค๋ ๋)๊ฐ ์คํ๋๋ ๋์์๋ง ์กด์ฌํ๋ค.
- ๋ฉ์๋ ์คํ์ด ์๋ฃ๋๋ฉด ์๋์ผ๋ก ์คํ์์ ํ ๋น ํด์ ๋๋ค.
- ๊ฐ ์ค๋ ๋๊ฐ ๊ณ ์ ์ ์คํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ๋ค๋ฅธ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง๋ค.
- ์ด๋ฌํ ์คํ ๊ตฌ์กฐ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ๋นํด ์๋๊ฐ ๋น ๋ฅด๋ค.
์ ๋น ๋ฅด์ฃ ?
์คํ์ ๋ฏธ๋ฆฌ ์์ฝ๋ ๋ฉ๋ชจ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ๋ฐ๋ก ํ์์์ผ๋ฉฐ, ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ตณ์ด ๋ฐ๋ฉํ์ง ์๊ณ (= ์ญ์ ์์
์ ๊ฑฐ์น์ง ์๊ณ ) ๋จ์ํ ์คํ ํฌ์ธํฐ๋ฅผ ๊ฐ์์ํด์ผ๋ก์จ ์คํ ๊ณต๊ฐ์ ์ ํ์ํจ๋ค. ์คํ ํฌ์ธํฐ๋ฅผ ๊ฐ์์ํค๋ฉด์ ๋จ์์๋ ๋ฐ์ดํฐ๋ ์คํ ํฌ์ธํฐ๊ฐ ๋ค์ ์ฆ๊ฐํ ๋ ์ฌ์ฉํ๋ ๊ณต๊ฐ์ ๋จ์ํ ๋ฎ์ด ์ฐ๋ ์์ผ๋ก ์ฌ์ฉ๋๋ค.
1. ๋๋ฌธ์ ๊ฐ์ฒด๋ ์ํ ์์ญ(scope)์ ๋ฒ์ด๋๋ฉด ์คํ ํฌ์ธํฐ์ ์์น๊ฐ ๋ฐ๋์๋ฐ๋ผ ์์์ ์ฌ๋ผ์ง๋ค. ๋ฐ๋ผ์ ํจ์๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๊ณ ํด์ ๋๋ ํ ๋ฉ๋ชจ๋ฆฌ์ ๋นํด ๋งค์ฐ ๋น ๋ฅด๋ค๋ ์ด์ ์ ๊ฐ์ง๊ณ ์๋ค.
2. ์คํ์ ์ ์ฅ๋๋ ๋ฐ์ดํฐ๋ค์ ๊ทธ ํฌ๊ธฐ๊ฐ ์ปดํ์ผ ํ์์ ์ด๋ฏธ ์ ํด์ง๊ธฐ ๋๋ฌธ์ ์คํ์ ๋ฏธ๋ฆฌ ์ ํด์ง ํฌ๊ธฐ๋ฅผ ๋ฐ๋ผ ์์ง์ด๊ฒ ๋๋ค. ๋ฐ๋ผ์ ๋ฐํ์, ์ฆ ์คํ ์ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณ์ฐํ๊ฑฐ๋ ํ๋จํ ์ผ์ด ์์ด ํ๋ฒ์ ์ํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐ๋ก ์ ๊ทผํ ์ ์๊ธฐ์ ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๋ณด๋ค ํจ์ฌ ๋น ๋ฅธ ์ด์ ๊ธฐ๋ ํ๋ค.
ํ์ง๋ง ํ ๋ฉ๋ชจ๋ฆฌ์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์ ์ฐํ๊ฒ ์ฐ์ฅํ๊ธฐ ์ด๋ ต๊ณ , ์คํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ค๊ฐ ์คํ ํ๋ ์์ด ๋ฌด์ํ ์ค์ฒฉ๋์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๊ณผํ๊ฒ ๋๋ stack overflow๊ฐ ๋ฐ์ํ ์ ์๋ค.
# 2-2 Heap ๋ฉ๋ชจ๋ฆฌ
Stack์ด ์ปดํ์ผ ํ์์ ํฌ๊ธฐ๊ฐ ์ง์ ๋๋ ์ ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๊ณต๊ฐ์ด๋ผ๋ฉด, Heap์ ๋ฐํ์์ ๋์ ์ผ๋ก ํ ๋นํ๋ ๋ฉ๋ชจ๋ฆฌ์ด๋ค. ์๋ฐ์์ ์๋ก์ด ๊ฐ์ฒด๋ ํญ์ ํ ๊ณต๊ฐ์ ์์ฑ๋๊ณ , ์ด ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ ์ฃผ์๋ ์คํ ๋ฉ๋ชจ๋ฆฌ(๋ณ์)์ ์ ์ฅ๋์ด ์ฌ์ฉ๋๋ค.
Heap์์ ๋ง๋ ๋ฉ๋ชจ๋ฆฌ๋ ๋ชจ๋ ์ค๋ ๋์์ ์ฐธ์กฐ, ์ ๊ทผ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ๋ค. ๊ทธ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น&ํด์ ๊ด๋ฆฌ์ ์์ด ์ด๋ ค์์ด ๋ฐ๋ฅด๋๋ฐ ์ด๋ฅผ JVM์ Gabage Collector๊ฐ ๊ฐ๋ฐ์ ๋์ ๊ด๋ฆฌํด์ค๋ค.
- GC์ Young Generation, Tenured(Old) Generation, Permanent Generation์ ํฌํจํ๋ ๋ณต์กํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ์ ์ ์ํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌ, ์ฌ์ฉ ํ ์ ์๋ค.
- ์ด์์ฒด์ ์๊ฒ ํ ๋น๋ฐ์ ํ ๊ณต๊ฐ์ด ๊ฐ๋์ฐจ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ฉด OutOfMemoryError๋ฅผ ๋ฐ์์ํจ๋ค.
- Heap์ ์ค๋ ๋๋ก ๋ถํฐ ์์ ํ์ง ์์ผ๋ฉฐ ์ฝ๋๋ฅผ ์ ์ ํ๊ฒ ๋๊ธฐํํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ณดํธํด์ผํ๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์ ์ ์ด์ง ์๊ณ , ํฌ๊ธฐ๊ฐ ๋ณํ ์ ์๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ์ ๊ทผ์ด ์คํ๋ณด๋ค ๋๋ฆฌ๊ณ ์ด๋ ต๋ค.
- ์คํ์ ๋ ๋ฆฝ์ ์ธ ์ค๋ ๋์์ ์คํ๋๊ณ ์คํํฌ์ธํฐ ๊ฐ์ ๋ณ๊ฒฝํจ์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์๋์ผ๋ก ํด์ ๋์ง๋ง, Heap์์๋ ๋๊ตฌ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐ ํ ์ ์๊ณ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์ ๋์ ์ด๋ผ ์๋์ผ๋ก ํ ๋น ํด์ ๋์ง ์๋๋ค.
- ์ด๋ฌํ ๋์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ๋ฉ๋ชจ๋ฆฌ ๋จํธํ๊ฐ ์๊ธธ ์ ์๊ณ , ์ ๊ธฐ์ ์ผ๋ก ์ฌ์ฉํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐพ์ ํด์ ํด์ผ ํ๋ค.
'๐๊ธฐ๋ณธ ์ง์ > Java ๊ธฐ๋ณธ์ง์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฐ๋ ๋ ๋๊ธฐํ (sync, volatile, AtomicClass) (0) | 2021.07.27 |
---|---|
์๋ฐ์ String๊ณผ Constant Pool (2) | 2021.07.27 |
.equals์ .hashCode()๋ ํญ์ ํจ๊ป ์ค๋ฒ๋ผ์ด๋ฉํด์ผํ๋ค. (0) | 2021.07.27 |
์ ๋ค๋ฆญ(Generic)์ ๋ํ์ฌ (0) | 2021.07.26 |
JVM(์๋ฐ๊ฐ์๋จธ์ )๊ณผ JRE, JDK (0) | 2021.06.30 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev