โ๏ธ ๋ ๋ฒ์งธ ๋ฉํ ๋ง ์๊ฐ์ ๊ฐ์ง๋ฉด์ 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 ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ํ ๊ฑธ์ ๋์๊ฐ ๊ฒ ๊ฐ์์ ๊ธฐ์๋ค!
์์ง ๋ถ์กฑํ ๋ถ๋ถ์ ํ๋์ ํ๊ดํ ์ฒ๋ฆฌํ์ผ๋ ๊ผญ ๋ค์ ์ฝ์ด๋ณด๊ธฐ๋ก ์ฝ์!
์ฐธ๊ณ ๋ฌธ์
JVM์ Runtime Data Area
์๋ ํ๋ก๊ทธ๋๋ฐ
www.holaxprogramming.com
JVM์ด๋ ๋ฌด์์ธ๊ฐ
ํด๋น ํฌ์คํธ์ ์์ฑ ๋ชฉ์ ๊ธฐ๋ณธ์๋ฃํ๊ณผ ์ฐธ์กฐ์๋ฃํ์ ์ฐจ์ด์ ์ ๋ํด์, ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ป๊ฒ ์ ์ฅ๋๋์ง์ ๋ํ ์ฐจ์ด๋ฅผ ๊ณต๋ถํ๋ค๊ฐ, JVM์ ๋ํ ์ ๋ฐ์ ์ธ ์ดํด๊ฐ ํ์ํ๋ค๋ ๊ฒฐ๋ก ์ ์ด๋ฅด๋ ๋ค. ๋จ์
hpotter1993.tistory.com
[JAVA] Static Keyword ์ Method Area (๋ฉ์๋ ์์ญ)
โ Static Keyword, Method Area static์ ์ฌ์ ์ ์ผ๋ก '์ ์ ์ธ, ๊ณ ์ ๋, ์์ง์ด์ง ์๋'์ ์๋ฏธ๋ฅผ ๊ฐ๋๋ค. jvm ๋ฉ๋ชจ๋ฆฌ์ ๊ณ ์ ๋จ์ ๋ปํจ๊ณผ ๋์์ static์ ์ฌ์ฉํ๋ค๋ ์๋ฏธ๋ ๋ชจ๋ ๊ฐ์ฒด๊ฐ '๊ณต์ 'ํ๋ค๋ ์๋ฏธ
ict-nroo.tistory.com
'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 |