JVM ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํ๋ก์ฐ
JVM ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
JVM์ ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ ํฌ๊ฒ ์ค๋ ๋ ๊ณต์ ์์ญ๊ณผ ์ค๋ ๋ ๊ฐ๋ณ ์์ญ์ผ๋ก ๋๋ฉ๋๋ค.
์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ์์ญ
- ๋ฉ์๋ ์์ญ (Method Area)
- ํ (Heap)
์ค๋ ๋๋ณ ๊ฐ๋ณ ์์ญ
- ํ๋ก๊ทธ๋จ ์นด์ดํฐ ๋ ์ง์คํฐ (PC Register)
- ๊ฐ์ ๋จธ์ ์คํ (JVM Stack)
- ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ (Native Method Stack)
๊ฐ ๋ฉ๋ชจ๋ฆฌ ์์ญ ์์ธ ๋ถ์
1. ํ๋ก๊ทธ๋จ ์นด์ดํฐ ๋ ์ง์คํฐ (PC Register)
์ญํ : ํ์ฌ ์คํ ์ค์ธ ๋ฐ์ดํธ์ฝ๋์ ์ค ๋ฒํธ๋ฅผ ๊ฐ๋ฆฌํค๋ ์์ ๋ฉ๋ชจ๋ฆฌ ์์ญ
ํน์ง:
- ๊ฐ ์ค๋ ๋๋ง๋ค ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌ
- ์๋ฐ ๋ฉ์๋ ์คํ ์: ๋ฐ์ดํธ์ฝ๋ ๋ช ๋ น์ด ์ฃผ์ ์ ์ฅ
- ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ ์: Undefined ์ํ
- ์ ์ผํ๊ฒ OutOfMemoryError ์กฐ๊ฑด์ด ๋ช ์๋์ง ์์ ์์ญ
2. ์๋ฐ ๊ฐ์ ๋จธ์ ์คํ (JVM Stack)
์ญํ : ์๋ฐ ๋ฉ์๋(๋ฐ์ดํธ์ฝ๋) ์คํ์ ์ํ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ
๊ตฌ์ฑ ์์:
- ์ง์ญ ๋ณ์ ํ ์ด๋ธ: ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ , ๊ฐ์ฒด ์ฐธ์กฐ, ๋ฐํ ์ฃผ์ ์ ์ฅ
- ํผ์ฐ์ฐ์ ์คํ: ๊ณ์ฐ ๊ณผ์ ์์ ์ฌ์ฉ๋๋ ์์ ์ ์ฅ์
- ๋์ ๋งํฌ: ๋ฉ์๋ ๊ฐ ์ฐ๊ฒฐ ์ ๋ณด
- ๋ฉ์๋ ๋ฐํ๊ฐ: ํธ์ถํ ๋ฉ์๋๋ก ๋์๊ฐ ์ ๋ณด
๋ฐ์ ๊ฐ๋ฅํ ์ค๋ฅ:
- StackOverflowError: ์คํ ๊น์ด ํ๊ณ ์ด๊ณผ (๋ฌดํ ์ฌ๊ท ๋ฑ)
- OutOfMemoryError: ์คํ ํ์ฅ ์ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ
3. ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ (Native Method Stack)
์ญํ : JNI(Java Native Interface)๋ฅผ ํตํด ํธ์ถ๋๋ ๋ค์ดํฐ๋ธ ๋ฉ์๋ ์คํ
ํน์ง:
- JVM ๊ตฌํ์ฒด๋ง๋ค ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๊ตฌํ
- HotSpot JVM์์๋ ๊ฐ์ ๋จธ์ ์คํ๊ณผ ํตํฉ
- ์๋ฐ ๊ฐ์ ๋จธ์ ์คํ๊ณผ ๋์ผํ ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ
4. ์๋ฐ ํ (Java Heap)
์ญํ : ๊ฐ์ฒด ์ธ์คํด์ค์ ๋ฐฐ์ด์ ์ ์ฅํ๋ ๊ฐ์ฅ ํฐ ๋ฉ๋ชจ๋ฆฌ ์์ญ
ํน์ง:
- ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ์์ญ
- ๊ฐ๋น์ง ์ปฌ๋ ํฐ(GC)๊ฐ ๊ด๋ฆฌํ๋ ์์ญ
- ๋ฌผ๋ฆฌ์ ์ผ๋ก๋ ๋ถ์ฐ์์ด์ด๋ ๋ ผ๋ฆฌ์ ์ผ๋ก๋ ์ฐ์์
์ธ๋๋ณ ๊ตฌ๋ถ (์ ํต์ ์ธ GC ๋ฐฉ์):
- ์ ์ธ๋ (Young Generation)
- Eden Space: ์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ค์ ์ฒซ ๋ฒ์งธ ๊ฑฐ์ฃผ์ง
- Survivor Space (From/To): Eden์์ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ ์์ ๊ฑฐ์ฃผ์ง
- ๊ตฌ์ธ๋ (Old Generation): ์ค๋ ์ด์๋จ์ ๊ฐ์ฒด๋ค์ ์ต์ข ๊ฑฐ์ฃผ์ง
์ฃผ์ JVM ์ต์ :
- -Xms: ํ ์ด๊ธฐ ํฌ๊ธฐ
- -Xmx: ํ ์ต๋ ํฌ๊ธฐ
๋ฐ์ ๊ฐ๋ฅํ ์ค๋ฅ:
- OutOfMemoryError: Java heap space: ํ ๊ณต๊ฐ ๋ถ์กฑ
5. ๋ฉ์๋ ์์ญ (Method Area)
์ญํ : ํด๋์ค ์์ค์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์์ญ
์ ์ฅ๋๋ ์ ๋ณด:
- ํด๋์ค์ ์ธํฐํ์ด์ค์ ํ์ ์ ๋ณด
- ์์ ํ (Constant Pool)
- ์ ์ ๋ณ์ (Static Variables)
- JIT ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผํ ์ฝ๋ ์บ์
์ญ์ฌ์ ๋ณ์ฒ์ฌ:
- JDK 7 ์ด์ : PermGen (Permanent Generation)์ผ๋ก ๊ตฌํ
- JDK 8 ์ดํ: Metaspace๋ก ๊ตฌํ (๋ค์ดํฐ๋ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ)
๋ฐ์ ๊ฐ๋ฅํ ์ค๋ฅ:
- OutOfMemoryError: PermGen space (JDK 7 ์ด์ )
- OutOfMemoryError: Metaspace (JDK 8 ์ดํ)
6. ๋ฐํ์ ์์ ํ (Runtime Constant Pool)
์ญํ : ๋ฉ์๋ ์์ญ์ ์ผ๋ถ๋ก, ํด๋์ค ํ์ผ์ ์์ ํ ์ ๋ณด๋ฅผ ๋ฐํ์์ ๊ด๋ฆฌ
ํน์ง:
- ์ปดํ์ผ ํ์ ์์๋ฟ๋ง ์๋๋ผ ๋ฐํ์์๋ ์๋ก์ด ์์ ์ถ๊ฐ ๊ฐ๋ฅ
- String.intern() ๋ฉ์๋๊ฐ ์ด ์์ญ์ ํ์ฉ
7. ๋ค์ด๋ ํธ ๋ฉ๋ชจ๋ฆฌ (Direct Memory)
์ญํ : JVM ํ ์ธ๋ถ์ ๋ค์ดํฐ๋ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ์ฌ์ฉ
์ฌ์ฉ ์์:
- NIO์ DirectByteBuffer
- ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ํธ์์ฉ
์ฅ์ :
- ํ๊ณผ ๋ค์ดํฐ๋ธ ๋ฉ๋ชจ๋ฆฌ ๊ฐ ๋ณต์ฌ ๊ณผ์ ์๋ต์ผ๋ก ์ฑ๋ฅ ํฅ์
์ฃผ์์ฌํญ:
- -Xmx ์ค์ ๊ณผ๋ ๋ณ๊ฐ๋ก ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ํ๊ณ์ ์ํฅ๋ฐ์
- ๊ด๋ฆฌ ์ํ ์ OutOfMemoryError ๋ฐ์ ๊ฐ๋ฅ
์ฐธ๊ณ ์๋ฃ:
JVM ๋ฐ๋ฐ๋ฅ๊น์ง ํํค์น๊ธฐ(์ธ์ฌ์ดํธ) - ์ ์ฐ์ฆ๋ฐ ์ , ์ด๋ณต์ฐ ์ฎ๊น
https://blackdogdev.medium.com/java-memory-management-68e572b16be8