μλ νμΈμ! μ€λμ κ°λ°μλΌλ©΄ λꡬλ ν λ²μ―€ λ€μ΄λ΄€μ μλ° κ°μ λ¨Έμ (JVM)μ λν΄ κΉμ΄ νν€μ³ λ³΄λ €κ³ ν©λλ€. JVMμ μλ°λ₯Ό βν λ² μμ±νλ©΄ μ΄λμλ μ€νλλ€(Write Once, Run Anywhere)βλΌλ λ§€λ ₯μ μΈ μ¬λ‘건μΌλ‘ μ΄λμ΄μ€ ν΅μ¬ κΈ°μ μ΄μ£ . νμ§λ§ JVMμ λ¨μν μλ° μ½λλ₯Ό μ€ννλ λꡬ κ·Έ μ΄μμ λλ€. JVMμ μλ μ리λ₯Ό μ΄ν΄νλ©΄ μλ° μ ν리μΌμ΄μ μ μ±λ₯μ κ·Ήλννκ³ , μμμΉ λͺ»ν λ¬Έμ λ₯Ό ν΄κ²°νλ λ° ν° λμμ΄ λ μ μμ΅λλ€. μ, κ·ΈλΌ JVMμ μΈκ³λ‘ ν¨κ» λ λλ³ΌκΉμ?

JVMμ΄λ 무μμΌκΉμ?
μλ° κ°μ λ¨Έμ (Java Virtual Machine, JVM)μ μλ° λ°μ΄νΈμ½λλ₯Ό μ€ννλ κ°μμ μ»΄ν¨ν°μ λλ€. μ¬κΈ°μ βκ°μβμ΄λΌλ λ¨μ΄κ° μ€μν©λλ€. JVMμ μ€μ 물리μ μΈ νλμ¨μ΄κ° μλλΌ, μννΈμ¨μ΄μ μΌλ‘ ꡬνλ νκ²½μ΄λΌλ μλ―Έμ£ . JVMμ μ΄μ체μ μμμ μ€νλλ©°, μλ° μ»΄νμΌλ¬κ° μμ±ν λ°μ΄νΈμ½λλ₯Ό ν΄μνκ³ μ€νν©λλ€. μ΄λ¬ν ꡬ쑰 λλΆμ μλ°λ μ΄μ체μ μ λ 립μ μΈ μ€ν νκ²½μ μ 곡ν μ μκ² λμμ΅λλ€.
JVMμ ν΅μ¬ μν μ λ€μκ³Ό κ°μ΅λλ€.
- λ°μ΄νΈμ½λ ν΄μ λ° μ€ν: μλ° μ»΄νμΌλ¬κ° μμ±ν .class νμΌ(λ°μ΄νΈμ½λ)μ μ½μ΄ λ€μ¬ μ€νν©λλ€.
- λ©λͺ¨λ¦¬ κ΄λ¦¬: ν(Heap), μ€ν(Stack) λ± λ€μν λ©λͺ¨λ¦¬ μμμ κ΄λ¦¬νμ¬ νλ‘κ·Έλ¨ μ€νμ νμν μμμ μ 곡ν©λλ€.
- κ°λΉμ§ 컬λ μ (Garbage Collection): λ μ΄μ μ¬μ©νμ§ μλ λ©λͺ¨λ¦¬ μμμ μλμΌλ‘ νμνμ¬ λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§ν©λλ€.
- 보μ: μλ° μ ν리μΌμ΄μ μ μμ νκ² μ€νν μ μλλ‘ λ€μν 보μ κΈ°λ₯μ μ 곡ν©λλ€.
βοΈ JVMμ μ£Όμ κ΅¬μ± μμ
JVMμ μ¬λ¬ κ΅¬μ± μμλ‘ μ΄λ£¨μ΄μ Έ μμΌλ©°, κ° κ΅¬μ± μμλ νΉμ μν μ μνν©λλ€. JVMμ μ£Όμ κ΅¬μ± μμλ λ€μκ³Ό κ°μ΅λλ€.
* ν΄λμ€ λ‘λ(Class Loader):
ν΄λμ€ λ‘λλ μλ° ν΄λμ€ νμΌμ JVMμΌλ‘ λ‘λνλ μν μ λ΄λΉν©λλ€. ν΄λμ€ λ‘λλ κ³μΈ΅μ μΈ κ΅¬μ‘°λ‘ μ΄λ£¨μ΄μ Έ μμΌλ©°, λΆνΈμ€νΈλ© ν΄λμ€ λ‘λ, νμ₯ ν΄λμ€ λ‘λ, μμ€ν ν΄λμ€ λ‘λ(μ ν리μΌμ΄μ ν΄λμ€ λ‘λ) λ±μ΄ μμ΅λλ€. ν΄λμ€ λ‘λλ ν΄λμ€λ₯Ό λ‘λν λ μμ λͺ¨λΈ(Delegation Model)μ μ¬μ©νμ¬ ν΄λμ€ λ‘λ©μ μΌκ΄μ±μ μ μ§ν©λλ€. μμ λͺ¨λΈμ ν΄λμ€ λ‘λ© μμ²μ μμ ν΄λμ€ λ‘λμκ² λ¨Όμ μμνκ³ , μμ ν΄λμ€ λ‘λκ° ν΄λμ€λ₯Ό μ°Ύμ§ λͺ»ν κ²½μ°μλ§ μμ μ μμμμ ν΄λμ€λ₯Ό μ°Ύμ΅λλ€.
* λ°νμ λ°μ΄ν° μμ(Runtime Data Areas):
λ°νμ λ°μ΄ν° μμμ JVMμ΄ νλ‘κ·Έλ¨μ μ€ννλ λμ μ¬μ©νλ λ©λͺ¨λ¦¬ 곡κ°μ λλ€. λ°νμ λ°μ΄ν° μμμ λ€μκ³Ό κ°μ΄ ꡬμ±λ©λλ€.
* ν(Heap): κ°μ²΄ μΈμ€ν΄μ€μ λ°°μ΄μ΄ μμ±λλ 곡κ°μ
λλ€. νμ κ°λΉμ§ 컬λ μ
μ λμμ΄ λλ μμμ
λλ€.
* λ©μλ μμ(Method Area): ν΄λμ€, μΈν°νμ΄μ€, λ©μλ, νλ λ±μ μ λ³΄κ° μ μ₯λλ 곡κ°μ
λλ€. λ©μλ μμμ JVM μμ μμ μμ±λλ©°, λͺ¨λ μ€λ λκ° κ³΅μ ν©λλ€.
* JVM μ€ν(JVM Stack): κ° μ€λ λλ§λ€ νλμ JVM μ€νμ΄ μμ±λ©λλ€. JVM μ€νμ λ©μλ νΈμΆκ³Ό κ΄λ ¨λ μ€ν νλ μμ μ μ₯ν©λλ€.
* λ€μ΄ν°λΈ λ©μλ μ€ν(Native Method Stack): λ€μ΄ν°λΈ λ©μλ(C/C++ λ±μΌλ‘ μμ±λ λ©μλ)λ₯Ό μ€ννκΈ° μν μ€νμ
λλ€.
* PC λ μ§μ€ν°(PC Register): κ° μ€λ λλ§λ€ νλμ PC λ μ§μ€ν°κ° μμ±λ©λλ€. PC λ μ§μ€ν°λ νμ¬ μ€ν μ€μΈ JVM λͺ
λ Ήμ΄μ μ£Όμλ₯Ό μ μ₯ν©λλ€.
* μ€ν μμ§(Execution Engine):
μ€ν μμ§μ ν΄λμ€ λ‘λλ₯Ό ν΅ν΄ λ‘λλ λ°μ΄νΈμ½λλ₯Ό μ€ννλ μν μ λ΄λΉν©λλ€. μ€ν μμ§μ λ€μκ³Ό κ°μ λ°©μμΌλ‘ λ°μ΄νΈμ½λλ₯Ό μ€νν©λλ€.
* μΈν°ν리ν°(Interpreter): λ°μ΄νΈμ½λλ₯Ό ν μ€μ© ν΄μνκ³ μ€νν©λλ€. μΈν°ν리ν°λ μ€ν μλκ° λ리λ€λ λ¨μ μ΄ μμ΅λλ€.
* JIT(Just-In-Time) μ»΄νμΌλ¬: μμ£Ό μ¬μ©λλ λ°μ΄νΈμ½λ(ν«μ€ν)λ₯Ό λ€μ΄ν°λΈ μ½λλ‘ λ³ννμ¬ μ€νν©λλ€. JIT μ»΄νμΌλ¬λ μΈν°ν리ν°μ λ¨μ μ 보μνμ¬ μ€ν μλλ₯Ό ν₯μμν΅λλ€. JIT μ»΄νμΌλ¬λ λ°μ΄νΈμ½λλ₯Ό μ΅μ ννμ¬ μ±λ₯μ λμ± ν₯μμν¬ μ μμ΅λλ€.
* κ°λΉμ§ 컬λ ν°(Garbage Collector):
κ°λΉμ§ 컬λ ν°(GC)λ λ μ΄μ μ¬μ©νμ§ μλ λ©λͺ¨λ¦¬ μμμ μλμΌλ‘ νμνλ μν μ λ΄λΉν©λλ€. GCλ κ°λ°μκ° μ§μ λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬ν νμ μμ΄ νλ‘κ·Έλ¨ μ€νμλ§ μ§μ€ν μ μλλ‘ λμμ€λλ€. GCλ λ€μν μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ λ©λͺ¨λ¦¬λ₯Ό νμνλ©°, κ° μκ³ λ¦¬μ¦μ μλ‘ λ€λ₯Έ μ₯λ¨μ μ κ°μ§κ³ μμ΅λλ€. λνμ μΈ GC μκ³ λ¦¬μ¦μΌλ‘λ Serial GC, Parallel GC, CMS GC, G1 GC λ±μ΄ μμ΅λλ€.
JVM λμ λ°©μ μμΈ λΆμ
JVMμ λμ λ°©μμ ν΄λμ€ λ‘λ©, λ°νμ λ°μ΄ν° μμ κ΄λ¦¬, λ°μ΄νΈμ½λ μ€ν, κ°λΉμ§ 컬λ μ λ± λ€μν λ¨κ³λ‘ μ΄λ£¨μ΄μ Έ μμ΅λλ€. κ° λ¨κ³λ₯Ό μμΈν μ΄ν΄λ³΄κ² μ΅λλ€.
1. ν΄λμ€ λ‘λ©:
ν΄λμ€ λ‘λλ μλ° ν΄λμ€ νμΌμ JVMμΌλ‘ λ‘λν©λλ€. ν΄λμ€ λ‘λλ ν΄λμ€ νμΌμ μ½μ΄ λ€μ¬ λ°μ΄νΈμ½λ, μμ ν, λ©μλ μ 보 λ±μ λΆμνκ³ JVMμ λ°νμ λ°μ΄ν° μμμ μ μ₯ν©λλ€.
2. λ°μ΄νΈμ½λ κ²μ¦:
λ‘λλ λ°μ΄νΈμ½λλ κ²μ¦ κ³Όμ μ κ±°μΉ©λλ€. μ΄ κ³Όμ μμ λ°μ΄νΈμ½λκ° μλ° μΈμ΄ λͺ μΈμ λΆν©νλμ§, 보μμ λ¬Έμ κ° μλμ§ λ±μ νμΈν©λλ€. λ°μ΄νΈμ½λ κ²μ¦μ JVMμ 보μμ κ°ννλ μ€μν λ¨κ³μ λλ€.
3. λ°νμ λ°μ΄ν° μμ κ΄λ¦¬:
JVMμ λ°νμ λ°μ΄ν° μμμ ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν©λλ€. ν μμμλ κ°μ²΄ μΈμ€ν΄μ€μ λ°°μ΄μ΄ μμ±λλ©°, μ€ν μμμλ λ©μλ νΈμΆ μ λ³΄κ° μ μ₯λ©λλ€. λ©μλ μμμλ ν΄λμ€, μΈν°νμ΄μ€, λ©μλ, νλ λ±μ μ λ³΄κ° μ μ₯λ©λλ€.
4. λ°μ΄νΈμ½λ μ€ν:
μ€ν μμ§μ λ°μ΄νΈμ½λλ₯Ό ν΄μνκ³ μ€νν©λλ€. μΈν°ν리ν°λ λ°μ΄νΈμ½λλ₯Ό ν μ€μ© ν΄μνκ³ μ€ννλ©°, JIT μ»΄νμΌλ¬λ μμ£Ό μ¬μ©λλ λ°μ΄νΈμ½λλ₯Ό λ€μ΄ν°λΈ μ½λλ‘ λ³ννμ¬ μ€νν©λλ€. JIT μ»΄νμΌλ¬λ νλ‘νμΌλ§μ ν΅ν΄ ν«μ€νμ μ°Ύμλ΄κ³ , ν΄λΉ μ½λλ§ μ»΄νμΌνμ¬ μ±λ₯μ ν₯μμν΅λλ€.
5. κ°λΉμ§ 컬λ μ :
κ°λΉμ§ 컬λ ν°λ λ μ΄μ μ¬μ©νμ§ μλ λ©λͺ¨λ¦¬ μμμ νμν©λλ€. GCλ Mark and Sweep, Copying, Mark and Compact λ± λ€μν μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ λ©λͺ¨λ¦¬λ₯Ό νμν©λλ€. GC μκ³ λ¦¬μ¦μ μ ν리μΌμ΄μ μ νΉμ±μ λ°λΌ μ νν΄μΌ νλ©°, μλͺ»λ GC μ€μ μ μ±λ₯ μ νλ₯Ό μ΄λν μ μμ΅λλ€.

JVM μ±λ₯ μ΅μ ν κΈ°λ²
JVM μ±λ₯ μ΅μ νλ μλ° μ ν리μΌμ΄μ μ μλ΅ μκ°κ³Ό μ²λ¦¬λμ ν₯μμν€λ μ€μν κ³Όμ μ λλ€. JVM μ±λ₯ μ΅μ νλ λ€μν λ°©λ²μΌλ‘ μνν μ μμΌλ©°, λͺ κ°μ§ μ£Όμ κΈ°λ²μ μκ°ν©λλ€.
* GC νλ:
GC νλμ JVM μ±λ₯ μ΅μ νμ ν΅μ¬μ
λλ€. GC μκ³ λ¦¬μ¦ μ ν, ν μ¬μ΄μ¦ μ‘°μ , GC κ΄λ ¨ νλΌλ―Έν° μ€μ λ±μ ν΅ν΄ GC μ±λ₯μ μ΅μ νν μ μμ΅λλ€. GC νλμ μ ν리μΌμ΄μ
μ νΉμ±μ λ°λΌ μ μ€νκ² μνν΄μΌ ν©λλ€. μλ₯Ό λ€μ΄, μλ΅ μκ°μ΄ μ€μν μ ν리μΌμ΄μ
μ κ²½μ° Stop-The-World μκ°μ μ΅μννλ GC μκ³ λ¦¬μ¦μ μ νν΄μΌ ν©λλ€.
Stop-The-World λ? JVMμ΄ GCλ₯Ό μννκΈ° μν΄ μ ν리μΌμ΄μ
μ λͺ¨λ μ€λ λλ₯Ό λ©μΆλ νμ.
* JIT μ»΄νμΌλ¬ μ΅μ ν:
JIT μ»΄νμΌλ¬λ μμ£Ό μ¬μ©λλ λ°μ΄νΈμ½λλ₯Ό λ€μ΄ν°λΈ μ½λλ‘ λ³ννμ¬ μ€ν μλλ₯Ό ν₯μμν΅λλ€. JIT μ»΄νμΌλ¬λ μΈλΌμΈ, 루ν μ΅μ ν λ± λ€μν μ΅μ ν κΈ°λ²μ μ¬μ©ν©λλ€. JIT μ»΄νμΌλ¬μ μ±λ₯μ ν₯μμν€κΈ° μν΄μλ μ ν리μΌμ΄μ
μ ν«μ€νμ λΆμνκ³ , ν΄λΉ μ½λλ₯Ό μ΅μ ννλ κ²μ΄ μ€μν©λλ€.
μΈλΌμΈ μ΄λ? ν¨μ νΈμΆμ ν΄λΉ ν¨μμ μ½λλ‘ λ체νλ μ΅μ ν κΈ°λ².
루ν μ΅μ ν μ΄λ? λ°λ³΅λ¬Έ μ€ν μλλ₯Ό ν₯μμν€λ μ΅μ ν κΈ°λ².
* μ½λ μ΅μ ν:
μ½λ μ΅μ νλ μλ° μ½λ μ체λ₯Ό κ°μ νμ¬ μ±λ₯μ ν₯μμν€λ λ°©λ²μ λλ€. λΆνμν κ°μ²΄ μμ± μ€μ΄κΈ°, μκ³ λ¦¬μ¦ ν¨μ¨μ± κ°μ , I/O μμ μ΅μν λ±μ ν΅ν΄ μ½λ μ±λ₯μ μ΅μ νν μ μμ΅λλ€. μ½λ μ΅μ νλ JVM μ±λ₯ μ΅μ νμ ν¨κ» μννλ©΄ λμ± ν¨κ³Όμ μ λλ€.
* λͺ¨λν°λ§ λ° νλ‘νμΌλ§:
JVM λͺ¨λν°λ§ λ° νλ‘νμΌλ§μ JVMμ μνλ₯Ό μ€μκ°μΌλ‘ νμΈνκ³ μ±λ₯ λ³λͺ© μ§μ μ μ°Ύμλ΄λ λ° λμμ΄ λ©λλ€. JConsole, VisualVM, JProfiler λ± λ€μν λͺ¨λν°λ§ λ° νλ‘νμΌλ§ λꡬλ₯Ό μ¬μ©νμ¬ JVMμ μ±λ₯μ λΆμν μ μμ΅λλ€. λͺ¨λν°λ§ λ° νλ‘νμΌλ§ κ²°κ³Όλ₯Ό λ°νμΌλ‘ GC νλ, JIT μ»΄νμΌλ¬ μ΅μ ν, μ½λ μ΅μ ν λ±μ μνν μ μμ΅λλ€.
JVM κ΄λ ¨ μ μ©ν λꡬ λ° μλ£
JVM νμ΅κ³Ό νμ©μ λμμ΄ λ λ§ν μ μ©ν λꡬμ μλ£λ€μ μκ°ν©λλ€.
* OpenJDK: μ€ν μμ€ JVM ꡬν체λ‘, λ€μν μ΄μ체μ μμ μ¬μ©ν μ μμ΅λλ€.
* JConsole: JVM λͺ¨λν°λ§ λ° κ΄λ¦¬ λꡬλ‘, JVMμ λ©λͺ¨λ¦¬ μ¬μ©λ, μ€λ λ μν, GC νλ λ±μ μ€μκ°μΌλ‘ νμΈν μ μμ΅λλ€.
* VisualVM: JVM νλ‘νμΌλ§ λꡬλ‘, CPU μ¬μ©λ, λ©λͺ¨λ¦¬ μ¬μ©λ, μ€λ λ νλ λ±μ λΆμν μ μμ΅λλ€.
* JProfiler: μμ© JVM νλ‘νμΌλ§ λꡬλ‘, λ€μν νλ‘νμΌλ§ κΈ°λ₯μ μ 곡ν©λλ€.
* JVM μ€ν: JVMμ λμ λ°©μκ³Ό κ΄λ ¨λ 곡μ λ¬Έμμ
λλ€.
* μ¨λΌμΈ κ°μ λ° νν 리μΌ: JVM κ΄λ ¨ μ¨λΌμΈ κ°μμ νν 리μΌμ ν΅ν΄ JVMμ μλ μ리λ₯Ό μ½κ² μ΄ν΄ν μ μμ΅λλ€.

λ§λ¬΄λ¦¬
μ, μ€λμ μ΄λ κ² μλ° κ°μ λ¨Έμ (JVM)μ λν΄ μμΈν μμλ΄€μ΅λλ€. JVMμ μλ° κ°λ°μλΌλ©΄ λ°λμ μ΄ν΄ν΄μΌ ν ν΅μ¬ κΈ°μ μ λλ€. JVMμ μλ μ리λ₯Ό μ΄ν΄νλ©΄ μλ° μ ν리μΌμ΄μ μ μ±λ₯μ κ·Ήλννκ³ , μμμΉ λͺ»ν λ¬Έμ λ₯Ό ν΄κ²°νλ λ° ν° λμμ΄ λ μ μμ΅λλ€. μ€λ λ°°μ΄ λ΄μ©μ λ°νμΌλ‘ JVMμ λμ± κΉμ΄ μκ² νμ΅νκ³ , μ€μ κ°λ°μ μ μ©ν΄ 보μκΈΈ λ°λλλ€. νΉμ λ κΆκΈν μ μ΄ μλ€λ©΄ μΈμ λ μ§ λκΈλ‘ μ§λ¬Έν΄μ£ΌμΈμ!
ββοΈ λ€μμλ μ΄λ€ λ΄μ©μ μμλ³ΌκΉμ?
λ€μμλ μλ°μ ν΅μ¬ κΈ°μ μ€ νλμΈ βμ€νλ§ νλ μμν¬βμ λν΄ μμΈν μμ보λ μκ°μ κ°μ Έλ³ΌκΉ ν©λλ€. μ€νλ§ νλ μμν¬λ μλ° μν°νλΌμ΄μ¦ μ ν리μΌμ΄μ κ°λ°μ μν κ°λ ₯ν λꡬμ΄λ©°, λ§μ κΈ°μ μμ μ¬μ©νκ³ μμ΅λλ€. μ€νλ§ νλ μμν¬μ ν΅μ¬ κ°λ κ³Ό μ¬μ©λ²μ μ΅νλ©΄ λμ± ν¨μ¨μ μΈ μλ° κ°λ°μ ν μ μμ΅λλ€. κ·ΈλΌ, λ€μ ν¬μ€ν μμ λ§λμ!
μ§κΈ νμΈνμ§ μμΌλ©΄ λμΉ μ μμ΅λλ€.
μλ°κ°μλ¨Έμ μ μ¨κ²¨μ§ μ΄μΌκΈ°μ λ λ§μ ν΅μ¬μ 보 μμ보기!