๐ Epilogue
- ๊ฐ๋จํ JAR ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ง๊ณ ์ฟ ๋ฒ๋คํฐ์ค ํ๋ ๋ฐฐํฌ๋ฅผ ์๋ํ์๋ค !
- ๊ทธ๋ฐ๋ฐ ์ปจํ
์ด๋ ์ํ๊ฐ.. ์์ฒญ๋ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ..
- OOM Killed.. CrashLoopBackOff ์ํ ๋ฐ๋ณต..
- ํ๋ ์คํ ๋๋ฆฌ๊ณ ๋ค์ ๋ฐฐํฌํ๋ ์ ์ ์ํ !
- ๊ทธ๋์ ์ฌ๊ธฐ์ ์๋ฌธ์ โ๏ธ
- JVM์ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ก์ ๋จน๋๊ฐ? → ๊ตฌ์กฐ ๋๋ฌธ? → ํ ๋ฒ ํํค์ณ๋ณด์!
โช๏ธ JVM์ด๋ ?
๐ก JVM : ์๋ฐ ๊ฐ์ ๋จธ์ (Java Virtual Machine)
- OS์ ์๊ด์์ด ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์คํ ์ํฌ ์ ์๋ ์๋ฐ ๊ฐ์ ๋จธ์
- ์๋ฐ ์ฝ๋๋ฅผ ์ปดํ์ผํด์ ์ป์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ OS๊ฐ ์ดํดํ ์ ์๋ ๊ธฐ๊ณ์ด๋ก ๋ฐ๊ฟ ์คํ
โช๏ธ ์ปดํ์ผ ๊ณผ์
๐ก .java → ์์ค ์ฝ๋ (Source Code)
.class → ๋ฐ์ดํธ ์ฝ๋ (Byte Code)
๊ธฐ๊ณ์ด → ๋ฐ์ด๋๋ฆฌ ์ฝ๋ (Binary Code)
- Test.java → Javac.exe (Compiler) → Test.class → OS
Javac.exe (Compiler)
• JDK๋ฅผ ์ค์นํ๋ฉด bin์ ์กด์ฌํ๋ ์ปดํ์ผ๋ฌ ์คํ ํ์ผ
- Test.java → Javac.exe (Compiler)
- Java ์์ค ์ฝ๋๋ฅผ Java ๋ฐ์ดํธ ์ฝ๋๋ก ๋ณํํ๊ธฐ ์ํด ์ปดํ์ผ๋ฌ ์คํํ๋ค.
- Javac.exe (Compiler) → Test.class
- ์ปดํ์ผํ์ฌ .java ํ์ผ(Source code)์ .class ํ์ผ(Byte code)๋ก ๋ณํํ๋ค.
- Test.class → OS
- JVM์ด ๋ฐ์ดํธ ์ฝ๋๋ฅผ OS๊ฐ ํด์ํ ์ ์๋ ๋ฐ์ด๋๋ฆฌ ์ฝ๋(๊ธฐ๊ณ์ด)๋ก ๋ณํํ๋ค.
โช๏ธ JVM ๊ตฌ์กฐ
- Class Loader
- .java ์์ค ํ์ผ์ ์ปดํ์ผํด์ ๋์จ .class ํด๋์ค ํ์ผ์ ๋ฌถ์ด
- OS๋ก๋ถํฐ ํ ๋น ๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ Runtime Data Area๋ก ์ ์ฌํ๋ ์ญํ
- Execution Engine
- Runtime Data Area ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋ ํด๋์ค๋ค์ ๊ธฐ๊ณ์ด๋ก ๋ณ๊ฒฝํด ์คํํ๋ ์ญํ
- Interpreter
- ์๋ฐ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๋ช ๋ น์ด ๋จ์๋ก ํ๋์ฉ ์คํ
- JIT (Just-In-Time)
- ์ ์ ํ ์์ ์ ์ ์ฒด ๋ฐ์ดํธ ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ์ปดํ์ผํ์ฌ ์คํ
- Interpreter
- Runtime Data Area ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋ ํด๋์ค๋ค์ ๊ธฐ๊ณ์ด๋ก ๋ณ๊ฒฝํด ์คํํ๋ ์ญํ
- Garbage Collector (GC)
- Heap ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ๋ ๊ฐ์ฒด๋ค ์ค์์ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ค์ ํ์ํ ํ ์ ๊ฑฐํ๋ ์ญํ
- GC๊ฐ ์ํํ๋ ๋์ GC๋ฅผ ์ํํ๋ ์ฐ๋ ๋ ์ธ์ ๋ชจ๋ ์ฐ๋ ๋๊ฐ ์ผ์ ์ ์งํ๋ค.
- Runtime Data Area
- ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๊ธฐ ์ํด OS์์ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ
- Method Area
- ํด๋์ค์ ์ ๋ณด๋ฅผ ์ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ ๋ ์ด๊ธฐํ๋๋ ๋์์ ์ ์ฅํ๊ธฐ ์ํ ๊ณต๊ฐ
- e.g.) ํด๋์ค ๋ฉค๋ฒ ๋ณ์ ์ด๋ฆ, ํ์ , ๋ฆฌํด ํ์ , ํ๋ผ๋ฏธํฐ, ๋ฉ์๋ ์ด๋ฆ, ์ ๋ณด ๋ฑ..
- Heap Area
- new๋ก ์ธํด ์์ฑ๋ ๊ฐ์ฒด์ ๋ฐฐ์ด์ด ์ ์ฅ๋๋ ๊ณต๊ฐ
- Method Area์ ์๋ ํด๋์ค๋ค๋ก๋ง ๊ฐ์ฒด ์์ฑ ๊ฐ๋ฅ
- GC๊ฐ ์ฐธ์กฐ๋์ง ์๋ ๊ฐ์ฒด๋ค์ ์ ๊ฑฐํ๋ ๊ณต๊ฐ
- Stack Area
- ์คํ ๊ณผ์ ์์ ์์๋ก ํ ๋น๋์๋ค๊ฐ ๋ฉ์๋๋ฅผ ๋น ์ ธ๋๊ฐ๋ฉด ๋ฐ๋ก ์๋ฉธ๋๋ ํน์ฑ์ ๋ฐ์ดํฐ ์ ์ฅํ๋ ๊ณต๊ฐ
- ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ง๋ค ๊ฐ๋ณ์ ์ผ๋ก ์คํ ๊ณต๊ฐ ์์ฑ
- e.g.) ์ง์ญ ๋ณ์, ๋งค๊ฐ ๋ณ์, ๋ฆฌํด ๊ฐ, ์์ ๋ฐ์ดํฐ, ์ค๋ ๋ ๋ฑ..
- PC Register
- Thread๊ฐ ์์ฑ๋ ๋๋ง๋ค ์์ฑ๋๋ ๊ณต๊ฐ
- Thread๊ฐ ํ์ฌ ์คํ๋๋ ๋ถ๋ถ์ ์ฃผ์์ ๋ช ๋ น์ ์ ์ฅ (=Program Counter)
- Native Method Stack
- ์๋ฐ ์ธ ์ธ์ด (C, C++ ๋ฑ..)์ ์ฝ๋๋ฅผ ์ํํ๊ธฐ ์ํ ์คํ ๊ณต๊ฐ
- JNI (Java Native Interface)์ ํตํด ๋ฐ์ดํธ ์ฝ๋๋ก ์ ํํ์ฌ ์ ์ฅ
- ์ปค๋์ด ์คํ์ ์ก์์ ๋ ์์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์คํ (=์ผ๋ฐ ํ๋ก๊ทธ๋จ)
- Method Area
- ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ๊ธฐ ์ํด OS์์ ํ ๋น๋ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ
์๋ฌด๋๋ JVM์ ์ด๋ค OS์์๋ ์๋ฐ ์ฝ๋๋ฅผ ์คํํ ์ ์๋๋ก ํ๋ VM์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ํน์ฑ ๋๋ฌธ์ ์์ ํ ๋น๋์ด ๋๋ค๊ณ ์๊ฐํ์๋ค.
- ๊ทธ๋ฌ๋ฉด ์ฌ๊ธฐ์ ์๊ฐํด๋ณผ ์ ์๋ ํ ์ํฉ์ ํด๊ฒฐ๋ฒ ๐จ
- JVM ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ค์ด๊ธฐ
์ปจํ ์ด๋ ์์ ๋ฆฌ์์ค ํ ๋น ๋๋ฆฌ๊ธฐ- ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ด์ง๋ง ๋ฆฌ์์ค ๋ญ๋น๊ฐ ์ด๋๋ ์ ์๋ค๊ณ ์๊ฐํจ
โช๏ธ JVM ๋ฉ๋ชจ๋ฆฌ ์ค์ด๊ธฐ
- ๊ธฐ๋ณธ์ ์ผ๋ก JVM์ Heap ๋ฉ๋ชจ๋ฆฌ ์ฌ์ด์ฆ๋ฅผ ๋ฌผ๋ฆฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ์ 25% ๊ฐ์ ํ ๋นํ๋ค. ( ≥ JDK 10 )
- Pod ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์ฑ
- JVM - Heap
- JVM - Non Heap
- System
- IDLE
- Total Memory - Heap Memory - ( Non-Heap Memory + System + IDLE ) = Remain Memory
- System์ ๊ธฐ๋ณธ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ชจ๋ํฐ๋ง ํ ํ์ Remain Memory ๊ณ์ฐ ๋ฐ ๊ณ ๋ คํ์ฌ ์ต๋ Heap Memory ์ฌ์ด์ฆ๋ฅผ ์ค์ ํด์ผ ํ๋ค.
- JAR์ ์คํ์ํฌ ๋ JVM์ Heap Area์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํด์ฃผ๋ ์ต์ ์ด ์๋ค.
- -Xms256m
- ๋ฉ๋ชจ๋ฆฌ์ ์ต์ด ํฌ๊ธฐ 256MB ์ค์
- -Xmx512m
- ๋ฉ๋ชจ๋ฆฌ์ ์ต๋ ํฌ๊ธฐ 512MB ์ค์
- ๊ทธ๋ฌ๋ K8s Container ํ๊ฒฝ์์ JVM์ ์ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์กฐ์ ํ๋ -Xms / -Xmx ์ต์ ๋ณด๋ค Container ์์์ ๋ฐ๋ผ ์กฐ์ ํ ์ ์๋ UseContainerSupport ์ต์ ์ ์ฌ์ฉํ๋ค.
- K8s Pod ์์ฑ ์ Container์ ์์์ ์ค์ (requests, limits)ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- Default = True
- ≥ OpenJDK 8 ์ง์
- -XX:InitialRAMPercentage=40 (%)
- JVM์ ์ด๊ธฐ Heap ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ ์ค์
- e.g.) ์ปจํ ์ด๋์ ๋ฉ๋ชจ๋ฆฌ๊ฐ 1GB์ธ ๊ฒฝ์ฐ JVM ์ด๊ธฐ Heap ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ 400MB (1GB์ 40%)
- -XX:MinRAMPercentage=50 (%)
- 200MB ๋ฏธ๋ง์ ์ด๊ธฐ Heap ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง JVM์ ์ต๋ Heap ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ ์ค์
- -XX:MaxRAMPercentage=70 (%)
- 200MB ์ด๊ณผ์ ์ด๊ธฐ Heap ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง JVM์ ์ต๋ Heap ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ ์ค์
๋ณธ์ ์๋๊ฒ ์ด์๊ฐ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐ์ด ๋์ด์ ์ด์๊ฐ ์ฌ๋ผ์ก๋คใ ใ
์ด์ ์ฌํ์ ์๋ํ์์ง๋ง ์์ง๊น์ง ์ฌํ์ ์คํจํ ์ํ..
์ผ.. ์ ์ฉํด๋ณด๊ณ ์ถ๋ค !!
ref. JVM Structure
[JAVA] JVM์ด๋? ๊ฐ๋ ๋ฐ ๊ตฌ์กฐ (JDK, JRE, JIT, ๊ฐ๋น์ง ์ฝ๋ ํฐ...)
ref. JVM Memory Setting
์ปจํ ์ด๋ ํ๊ฒฝ์์ JVM Memory ์ค์
์ปจํ ์ด๋ ํ๊ฒฝ์์์ java ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฆฌ์์ค์ ๋ฉ๋ชจ๋ฆฌ ์ค์
ref. Other Case
JVM + Container ํ๊ฒฝ์์ ์์ํ Memory ์ฌ์ฉ๋ ์ฆ๊ฐ ํ์ ๋ถ์ํ๊ธฐ
'Kubernetes' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Minikube] Pod ์์ฑ (0) | 2022.11.12 |
---|---|
YAML ๋ฌธ๋ฒ ์์๋ณด๊ธฐ (0) | 2022.11.11 |
๋ฆฌ์์ค์ ๋ฉ๋ชจ๋ฆฌ์ CPU ์์ ๊ด๋ฆฌ (0) | 2022.11.10 |
Pod์ ์ฐ์ ์์ (0) | 2022.11.10 |
Pod ์์ ํ๊ฒ ์์ฑ/๋ฐฐํฌ ๋ฐ QoS ์ ์ฑ ์ค์ (0) | 2022.11.10 |