โ๏ธ ๋ ๋ฒ์งธ ๋ฉํ ๋ง ์๊ฐ์ ๊ฐ์ง๋ฉด์ Reference Type๊ณผ String ํด๋์ค์ ๊ดํ ์ด์ผ๊ธฐ๋ฅผ ๋๋๋ค
H๋๊ป์ Garbage Collector์ JVM ํค์๋๋ฅผ ๊บผ๋ด์ จ๊ณ , ์ด์ ๋ํ ๋ฉํ ๋์ ๊ฐ์์ค๋ฌ์ด ์ง๋ฌธ์ ๋นํฉํ์๋ค.
1. ์๋ฃํ์ ๋ํด ๊ณต๋ถํ๋ฉด์ JVM ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ๋ํด ์กฐ๊ธ ๋ ๊ณต๋ถํ๊ณ ์ถ์ด์ก๋ค.
2. ๋ฉํ ๋ ์ง๋ฌธ์ ๋นํฉํ๋ ๋ด ์์ ์ด ๋ถ๋๋ฌ์ ๋ค. ๋ถ๋๋ฝ์ง ์์ ๊ฐ๋ฐ์๊ฐ ๋๊ธฐ ์ํด์.
๊ทธ๋์ ์ด๋ฒ ์๊ฐ์๋ ๋จผ์ Java ์ปดํ์ผ ์,
JVM ์ด ์ด๋ป๊ฒ ์๋ํ๊ณ ์ด๋ป๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ ์ฌ์ฉํ๋์ง ์์๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด์.
ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๊ณผ์ ์ ํบ์๋ณด์
Java ํ์ผ์ด ์คํ๋๊ธฐ ์ํด์๋ ์ปดํ์ผ ๋จ๊ณ์ ๋ฐํ์ ๋จ๊ณ๋ก ๋๋์ด ์ง๋๋ฐ,
์ปดํ์ผ ๋จ๊ณ์์๋ Java Compiler(๋ช
๋ น์ด javac)๋ฅผ ํตํด Java Source Code ๋ฅผ .class ํ์ผ(์ดํ ํด๋์ค ํ์ผ)๋ก ์ปดํ์ผํ๋ค.
ํด๋์ค ํ์ผ์ JVM์ด ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ํด์ํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ํ์ผ๋ก Java Byte Code๋ก ์ด๋ฃจ์ด์ ธ ์๋๋ฐ, ํด๋น ๊ณผ์ ์์ String ํด๋์ค์ + ์ฐ์ฐ์ StringBuilder ํด๋์ค๋ก ๋ณํ(Java 8 ์ดํ)ํ๋ ๋ฑ ๋ง์ ๋ถ๋ถ์์ Java Compiler๊ฐ ์ฐ๋ฆฌ์ ์ฝ๋์ ๊ฐ์ญํ์ฌ ์๋ง๊ฒ ์์ ํ๋ ๊ณผ์ ์ ๊ฑฐ์ณ ๋ง๋ค์ด์ง๋ค.
์ด๋ ๊ฒ ํด๋์ค ํ์ผ๋ก ์ปดํ์ผ ๋์๋ค๋ฉด Java Runtime Environment(์ดํ JRE)์ ์ํ JVM์ ํตํด ํด๋์ค ํ์ผ์ ์ฝ๊ณ , ์ด๋ฅผ ์ค์ ๋ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋นํ๋ค.
์ด๋ ๊ฒ Java ํ๋ก๊ทธ๋จ์ JVM์ ์ํด ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋์ด ์คํ๋๋๋ฐ, ์ด๋ ๊ฐ OS์ ๋ง๋ JDK ํน์ JRE๋ง ์ค์นํด์ฃผ๋ฉด OS์ ์ข
์๋์ง ์๊ณ Java ํ๋ก๊ทธ๋จ์ ์คํ ํ ์ ์๋ค๋ ๊ฒ์ ์์ง ๋ง์์ผ ํ๋ค.
JVM Memroy Architecture
Java ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด ์ด๋ป๊ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋์ง ๊ทธ๋ฆผ๊ณผ ๋๋ต์ ์ธ ์ค๋ช
์ ํตํด ๋จธ๋ฆฟ์์ ์ง์ด ๋ฃ์๋ค.
์ด์ ๋ด๊ฐ ์์ฑํ ์ฝ๋๋ค์ด ์ด๋ป๊ฒ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๋์ง ๊ณต๋ถํด๋ณด์.
๋จผ์ JVM์๋ 3๊ฐ์ ์์ญ์ด ์กด์ฌํ๋๋ฐ ๊ฐ๊ฐ์ ์ญํ ์ด ๋ค๋ฅด๋ค
๐ Class Loader - Runtime Data Area์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ธฐ ์ํด ํด๋์ค ํ์ผ์ ์ฝ์ด๋ค์ธ๋ค.
๐ Runtime Data Area - ์ค์ง์ ์ผ๋ก Java ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํด ์ด์์ฒด์ ๋ก ๋ถํฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์ ์ปจํธ๋กค ํ๋ ์์ญ์ด๋ค.
๐ Execution Engine - Runtime Data Area ์ ๋ฐฐ์น๋ ๋ฐ์ดํธ์ฝ๋๋ค์ ์คํํ๋ ์์ญ์ด๋ค. ํด๋น ์์ญ์์ ์ค์ง์ ์ผ๋ก ์ธ์ด๋ฅผ ๋ฒ์ญํ๋ ์์ ์ ์ํํ๋ค.
๊ฐ ์์ญ์ ๋ ์ฌ๋ฌ๊ฐ์ง๋ก ์ธ๋ถํ๋์ด ์ํํ๋ ๊ฒ์ด ๋ฌ๋ผ ๋ ๊น๊ฒ ๋ค์ด๊ฐ ์ ์๋ค.
ํ์ง๋ง ์ค๋์ Runtime Data Area ์์ญ์์ ๋ฐ์ดํธ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๋์ง, ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ๊ด๋ฆฌํ๋์ง๊ฐ ์ฃผ ๋ชฉ์ ์ด๋ค.
Runtime Data Area
ํด๋น ์์ญ์ ์์์ ๊ฐ๋จํ ์์ ํ ๊ฒ ์ฒ๋ผ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ํด๋์ค, ๋ฉ์๋ ๋ฑ์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ ์ ํ ํ ๋นํ๋ ์์ญ์ด๋ค. ์ด์ ์๊ฐ์ Primitive Type๊ณผ Reference Type ๊ณต๋ถ๋ฅผ ํตํด ๊ธฐ๋ณธ ์๋ฃํ์ Stack ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ๊ณผ ํจ๊ป ํ ๋น๋์ด ํด๋น ๋ณ์๊ฐ ์ํ ๋ง์ง๋ง ์ค์ฝํ๊ฐ ์คํ๋ ๋ Stack ๋ฉ๋ชจ๋ฆฌ์์ pop๋๋ ๊ฒ๊ณผ ์ฐธ์กฐ ์๋ฃํ์ ๋ณ์๊ฐ Stack ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ๋์ง๋ง ๊ฐ์ด ๊ทธ๋๋ก ์ ์ฅ๋๋ ๊ฒ์ด ์๋๋ผ Heap ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ์ ์ ์ฅํ๋ ๊ฒ์ ์๊ฒ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด Runtime Data Area์๋ ์ฌ๋ฌ๊ฐ์ง ์ด๋ฆ์ ๊ฐ์ง ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ์กด์ฌํ๋๋ฐ ์ฐ๋ฆฌ๋ ๊ณผ์ฐ Stack๊ณผ Heap ๋ฉ๋ชจ๋ฆฌ๋ง ์๋ฉด๋ ๊น?
๋ฆฌํฐ๋ด๋ก ์ ์ธ๋ String์ ์ด๋ค ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ ๋น๋๊ณ , static ์ ๊ทผ ์ ์ด์๊ฐ ์ ์ธ๋ ๋ณ์๋ ์์๋ค์ ์ด๋์ ํ ๋น๋๋ฉฐ, ํด๋์ค์ ๋ฉ์๋์ ์ ์๋ ์ด๋์ ์กด์ฌํ๊ณ ์์๊น?
๐ Stack Memory
๊ฐ ์ค๋ ๋๋ง๋ค ํ๋์ฉ ํ ๋น๋๋ ๋ฉ๋ชจ๋ฆฌ ์ค ํ๋์ด๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ์ ํ ๋นํ๋ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝ ํ ์ ์๋ค.
๋ฉ์๋ ํธ์ถ ์, ์ ์ธ๋ ์ง์ญ ๋ณ์๋ ๋งค๊ฐ ๋ณ์ ๋ฑ์ด ํด๋น ์์ญ์ ํ ๋น๋๋ฉฐ ๊ธฐ๋ณธ ์๋ฃํ์ ๊ฒฝ์ฐ ์ ์ธ๋ ๊ฐ์ด ์ ์ฅ๋๊ณ ์ฐธ์กฐ ์๋ฃํ์ Heap Memory์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ์ ์ ์ฅํ๋ค.
๊ฐ ๋ณ์๋ค์ด ์ํ ๋ง์ง๋ง ์ค์ฝํ๊ฐ ์คํ๋ ๋ Stack ๋ฉ๋ชจ๋ฆฌ์ ์์ธ ๋ณ์๋ค์ ๋ชจ๋ ์ฌ๋ผ์ง๋ค.
๐ PC Register
Program Counter๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ **๊ฐ ์ค๋ ๋๋ง๋ค ํ๋์ฉ ํ ๋น๋๋ฉฐ, ์์ ์ด ์ํ ์ค๋ ๋์์ ์ด๋ค ๋ถ๋ถ์ ์ด๋ค ๋ช
๋ น์ผ๋ก ์คํํ ๊ฒ์ธ์ง๋ฅผ ๊ธฐ๋กํ๋ ์์ญ์ผ๋ก ํ์ฌ ์ํ ์ค์ธ JVM ๋ช
๋ น์ ์ฃผ์๋ฅผ ๊ฐ๋๋ค.
๐ Native Method Stack
Java๊ฐ ์๋ ์ธ์ด๋ก ์์ฑ๋ API๋ ํ๋ก๊ทธ๋จ๊ณผ์ ํตํฉ์ ์์ํ๊ฒ ํ๊ธฐ ์ํด ์กด์ฌํ๋ ์์ญ์ผ๋ก, ์ ํ๋ฆฌ์ผ์ด์
์์ Native Method๊ฐ ํธ์ถ๋์ด ์คํ๋๋ฉด ๊ธฐ์กด์ Java Method๋ ๋จ๊ฒจ๋๊ณ , ํธ์ถ๋ Native Method๋ฅผ ์ํํ๋ค. ํธ์ถ๋ Native Method์ ์ํ์ด ๋๋๋ฉด ๊ธฐ์กด์ ์ํ ์ค์ด๋ Java Method๊ฐ ์ด์ด์ ์ํ๋๋ ๊ฒ์ด ์๋๋ผ ํด๋น ๋ฉ์๋๊ฐ ์๋ก ์์ฑ๋์ด ๋ค์ ์์
์ ์ํํ๋ค. ํด๋น ์์ญ์ ์ ์ฅ๋๋ ๋ฉ์๋๋ String ํด๋์ค์ .inter() ๋ฉ์๋๊ฐ ๋ํ์ ์ด๋ค.
๐ Heap Memory
๋ชจ๋ ์ค๋ ๋์ ๊ณต์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๋ฉฐ, ๋ฐฐ์ด(Array)์ ์ธ์คํด์ค๋ง์ด ํ ๋น๋๋ ์์ญ์ด๋ค.
ํด๋น ์์ญ์ GC์ ์ํด ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ๊ฐ ์ํ๋๋ฉฐ Heap Memory ๋ด์ ๊ตฌ์กฐ์ ๋ฐ๋ผ ์ต์ ํ ๋๋ ์๊ธฐ๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฅด๋ค.
String Constant Pool ์์ญ์ด Heap Memory์ ํ ๋น๋์ด ์์ผ๋ฉฐ, ์ด๋ ๋ฆฌํฐ๋ด๋ก ์ ์ธ๋ String ๊ฐ์ฒด๊ฐ String Constant Pool ์์ญ์ ํ ๋น๋๊ณ , ๊ฐ์ ๋ฌธ์์ด์ ๊ฐ์ง๋ ๋ฆฌํฐ๋ด๋ก ์ ์ธ๋ String ๊ฐ์ฒด๋ ํด๋น ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ณต์ ํ๋ค.
๐ Method Area
๋ชจ๋ ์ค๋ ๋์ ๊ณต์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๋ฉฐ, JVM์ด Byte Code๋ฅผ ํตํด ์ฝ์ ํด๋์ค์ ์ธํฐํ์ด์ค ๋ฑ์ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ ์์ญ์ผ๋ก, ์์ฑ์์ ๋ฉ์๋ ์ค์ฝํ ๋ด์ ์ ์ธ๋ ์ฝ๋ ๋ฑ๋ ํจ๊ป ์ ์ฅ๋๋ค.
ํ๋ก๊ทธ๋จ ์คํ ์ค ๋ฉ์๋ ํธ์ถ์ ์ํด ํด๋์ค๊ฐ ์ฌ์ฉ๋๋ฉด JVM์ ํด๋น ํด๋์ค์ Byte Code๋ฅผ ์ฝ๊ณ Method Area์ ์ ์ฅํ๋ค.
ํด๋น ์์ญ์ ์ ์ฅ๋๋ ์ข
๋ฅ๋ฅผ ์ดํด๋ณด์.
- Class / Interface Information (ํด๋์ค, ์ธํฐํ์ด์ค ๋ฑ์ ์ ๋ณด)
- Runtime Constant Pool (ํด๋์ค, ์ธํฐํ์ด์ค ๋ฑ์ ์ํ ๋ชจ๋ ์์ ์ ๋ณด)
- Field Information (์ธ์คํด์ค ๋ณ์์ ๋ํ ์ ๋ณด > ํ์ ์ด๋ ์ ๊ทผ ์ ์ด์ ๋ฑ)
- Method Information (์์ฑ์์ ๋ฉ์๋์ ๋ํ ์ ๋ณด > ์ด๋ฆ, ๋งค๊ฐ ๋ณ์, ๋ฆฌํด๊ฐ, ์ ๊ทผ ์ ์ด์ ๋ฑ)
- Class Variable (static ์ ์ธ๋ ํด๋์ค ๋ณ์)
๐ญ 2020๋ 12์, ๋ฐฑ๊ธฐ์ ๋ ์จ๋ผ์ธ ์คํฐ๋๋ฅผ ํ๋ฉฐ ์์ฑํ๋ ๋ด์ฉ์ ๋ณด๊ณ ๊ฒฝ์ ์ ๊ธ์น ๋ชปํ๋ค.์ค๋ ์ ๋ฆฌํ ๋ด์ฉ๊ณผ ๋น์ทํ ๋ด์ฉ์ธ๋ฐ ๋ชจ๋ ๋ด์ฉ์ด ๋๋ฃจ๋ญ์คํ๊ฒ ๋ ์๋ค.
์๋ฌด๋ฆฌ ์ฝ์ด๋ '๊ทธ๋์ ์ ์ด๋ ๊ฒ ํ๋๊ฑด๋ฐ?' ๋ผ๋ ์๋ฌธ์ด ๋ ๋์ง ์์๋ค.๊ทธ๋์ ์ด๋ฒ์ ์ ๋๋ก ์ ๋ฆฌํ๋ ค๊ณ ํ์ผ๋, ์ง์ค๋ ฅ ๋ถ์กฑ์ผ๋ก ์ด๋ง ๋ง๋ฌด๋ฆฌํ๋ ค๊ณ ํ๋ค.
๊ธ ์์ฑ ์ด๋ฐ์๋ ๋๋ฆ ๋ด๊ฐ ์ดํดํ ๋ฐฉ์๋๋ก ์ต๋ํ ์์ ์ ๋ง์ถฐ ์์ฑํด๋ณด๋ ค๊ณ ํ์ผ๋, ๊น๊ฒ ํ๊ณ ๋ค๋ฉด ํ๊ณ ๋ค์๋ก ์ดํด์ ํ๊ณ ๋๋ฌธ์ธ์ง ๋ช๋ช ๋ถ๋ถ์ ๋จธ๋ฆฟ์์ ๊ทธ๋ฆฌ์ง ๋ชปํ ๊ฒ ๊ฐ๋ค.
JVM ๊ตฌ์กฐ๋ ํ์ฐธ์ ๊ณต๋ถํด๋ ๋ชจ์๋ฅด๊ฒ ๊ตฌ๋ ๋ผ๋ ๊ฒ์ ๋๊ผ๊ณ , ์ผํ๋ฉด์๋ ์ฝ๋ ์งค ๋ ์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์ฐ๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ์ด๋ ๊ฒ ์๋ํ์ง ์์๊น๋ผ๋ฉฐ ์์ํด๋ณด์ง๋ง ์ ํํ ์ด๋ก ์ด ๋ฐํ์ด ๋์ง ์์ผ๋ ๋ฌ๊ตฌ๋ฆ ์ก๋ ๋๋์ด๋ค.
๊ทธ๋๋ Java ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ํ ๊ฑธ์ ๋์๊ฐ ๊ฒ ๊ฐ์์ ๊ธฐ์๋ค!
์์ง ๋ถ์กฑํ ๋ถ๋ถ์ ํ๋์ ํ๊ดํ ์ฒ๋ฆฌํ์ผ๋ ๊ผญ ๋ค์ ์ฝ์ด๋ณด๊ธฐ๋ก ์ฝ์!
์ฐธ๊ณ ๋ฌธ์
'Programming > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
F009 - Inheritance, Composition (0) | 2021.05.18 |
---|---|
F008 - Garbage Collector (2) | 2021.05.16 |
F006 - Throwable, Exception, Error (0) | 2021.05.11 |
F005 - Stack & Heap Memory (0) | 2021.05.08 |
F004 - Reference Type (0) | 2021.05.08 |