[Java] JVM
π JVMμ΄λ?
JVM(Java Virtual Machine)
μ μλ° μ ν리μΌμ΄μ
μ μ€ννκΈ° μν κ°μ λ¨Έμ μΌλ‘ μλ° λ°μ΄νΈμ½λ(.class)λ₯Ό μ΄μ 체μ μ νλμ¨μ΄μ λ
립μ μΌλ‘ μ€νν μ μλλ‘ νλ μννΈμ¨μ΄ κ³μΈ΅μ΄λ€. μ¦, JVMμ΄ μ€μΉλ OSμμλ λ³λμ μμ
μμ΄ μλ°λ‘ μμ±λ νλ‘κ·Έλ¨(.java)μ μ€νν μ μλ€.
π λμ λ°©μ
- μλ° μμ€ νμΌ(.java)λ μλ° μ»΄νμΌλ¬(javac)μ μν΄ λ°μ΄νΈμ½λ(.class)λ‘ λ³νλλ€.
- λ³νλ λ°μ΄νΈμ½λλ JVMμ ν΄λμ€ λ‘λμ μν΄ λ©λͺ¨λ¦¬λ‘ λ‘λλλ€.
- ν΄λμ€ λ‘λκ° λ‘λν λ°μ΄νΈμ½λλ λ°νμ λ°μ΄ν° μμμ λ°°μΉλλ€.
- μ€ν μμ§μ΄ λ°μ΄νΈμ½λλ₯Ό ν΄μνκ±°λ JIT μ»΄νμΌλ¬λ₯Ό ν΅ν΄ κΈ°κ³μ΄λ‘ λ³ννμ¬ μ€ννλ€.
- μ€ν λμ€ νμ μλ κ°μ²΄λ κ°λΉμ§ 컬λ ν°κ° μ 리νλ€.
π κ΅¬μ± μμ
Class Loader
- Loading
JVMμ΄ .class νμΌμ μ°Ύκ³ μ΄λ₯Ό λ°νμ λ°μ΄ν° μμμ μ μ¬νλ€. λν μ¬λ³Όλ¦ λ νΌλ°μ€(νλ, λ©μλ λ±)λ₯Ό λ°νμ μμ νμ 볡μ¬νλ€.
- Linking
λ‘λλ ν΄λμ€κ° μ€μ λ‘ μ€νλ μ μλλ‘ μ€λΉνλ κ³Όμ μΌλ‘ λ€μ νμ λ¨κ³λ‘ λλλ€.
- Verification(κ²μ¦): ν΄λμ€ νμΌμ λ°μ΄νΈμ½λκ° JVM λͺ
μΈμ λ§λμ§ νμΈνλ€. ꡬ쑰μ μΌλ‘ μ¬λ°λ₯΄μ§ μλ κ²½μ°
VerifyError
κ° λ°μνλ€. - Preparation(μ€λΉ): ν΄λμ€μ static νλλ₯Ό μν λ©λͺ¨λ¦¬λ₯Ό ν λΉνκ³ κΈ°λ³Έκ°μΌλ‘ μ΄κΈ°ννλ€. λͺ μμ μ΄κΈ°νλ μμ§ μ΄λ£¨μ΄μ§μ§ μλλ€.
- Resolution(ν΄κ²°): Loading λ¨κ³μμ 볡μ¬ν μ¬λ³Όλ¦ λ νΌλ°μ€λ₯Ό μ€μ λ©λͺ¨λ¦¬ μ£Όμλ‘ λ³ννλ€.
- Initialization
ν΄λμ€μ <clinit>
λ©μλκ° νΈμΆλμ΄ static λ³μμ λͺ
μμ μ΄κΈ°νμ static λΈλ‘μ΄ ν λ²λ§ μ€νλλ€.
Execution Engine
Execution Engineμμ λ°μ΄νΈμ½λκ° μ€μ λ‘ μ€νλλ€.
- Interpreter
JVMμ΄ λ°μ΄νΈμ½λλ₯Ό λͺ λ Ήμ΄ λ¨μλ‘ νλμ© μ½κ³ ν΄μνμ¬ μ€ννλ λ°©μμ΄λ€. μ΄ λ°©μμ JVMμ΄ μμλ λ λΉ λ₯Έ μ€νμ΄ κ°λ₯νλλ‘ νμ§λ§, κ°μ λ©μλκ° λ°λ³΅μ μΌλ‘ νΈμΆλ λλ§λ€ λ§€λ² ν΄μν΄μΌ νλ―λ‘ μ€ν μλκ° λ리λ€.
- JIT(Just-In-Time) Compiler
Interpreterμ μ±λ₯ μ ν λ¬Έμ λ₯Ό 보μνκΈ° μν΄ λμ
λμλ€. JVMμ μ²μμλ Interpreter λ°©μμΌλ‘ μ½λλ₯Ό μ€ννλ€κ° νΉμ λ©μλκ° λ°λ³΅μ μΌλ‘ νΈμΆλλ Hotspot
μ΄ κ°μ§λλ©΄ ν΄λΉ λ°μ΄νΈμ½λ μ 체λ₯Ό κΈ°κ³μ΄λ‘ μ»΄νμΌνλ€. μ΄ν κΈ°κ³μ΄λ₯Ό μΊμμ μ μ₯ν ν, κ°μ λ©μλκ° λ€μ νΈμΆλ λ μΊμ±λ κΈ°κ³μ΄λ₯Ό μ½μ΄ λ°λ‘ μ€ννλ€.
- Garbage Collector
JVMμ μ€ν μμ§μμ μ¬μ©νμ§ μλ κ°μ²΄λ₯Ό νμ§νμ¬ ν λ©λͺ¨λ¦¬μμ μ κ±°νλ€. μ΄λ₯Ό ν΅ν΄ λ©λͺ¨λ¦¬ λμ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
Runtime Data Area
μλ° νλ‘κ·Έλ¨ μ€ν μ μ΄μ 체μ λ‘λΆν° ν λΉλ°λ λ©λͺ¨λ¦¬ μμμΌλ‘ νλ‘κ·Έλ¨μ λ°μ΄ν°μ μ€ν μ 보λ₯Ό μ μ₯νκ³ κ΄λ¦¬νλ€.
- PC Register
κ° μ°λ λλ§λ€ λ 립μ μΌλ‘ μμ±λλ λ©λͺ¨λ¦¬ 곡κ°μΌλ‘ νμ¬ μ€ν μ€μΈ JVM λͺ λ Ήμ΄μ μ£Όμλ₯Ό μ μ₯νλ€. μ΄ μμμ μ°λ λκ° μμλ λ ν λΉλκ³ μ’ λ£ μ ν΄μ λλ€.
- JVM Stacks
κ° μ°λ λλ§λ€ λ
립μ μΌλ‘ μμ±λλ λ©λͺ¨λ¦¬ 곡κ°μΌλ‘ λ©μλ νΈμΆ μλ§λ€ μ€ν νλ μμ΄ μμΈλ€. κ° μ€ν νλ μμλ λ©μλμ μ§μ λ³μ, λ§€κ°λ³μ, 리ν΄κ°, μ°μ° μ€κ°κ° λ±μ΄ μ μ₯λλ€. λ©μλκ° νΈμΆλλ©΄ νλ μμ΄ pushλλ©°, μ’
λ£λλ©΄ popλλ€. μ€ν ꡬ쑰μ΄λ―λ‘ LIFO κ΅¬μ‘°λ‘ λμνλ©° μ€ν ν¬κΈ°λ₯Ό μ΄κ³Όνλ©΄ StackOverflowError
κ° λ°μνλ€. μ΄ μμμ μ°λ λ κ° κ³΅μ νμ§ μλλ€.
- Native Method Stacks
μλ°κ° μλ λ€μ΄ν°λΈ μ½λ(C++, C, μ΄μ
λΈλ¦¬ λ±)λ‘ μμ±λ λ©μλλ₯Ό μ€νν λ μ¬μ©νλ μ€νμ΄λ€. μμ κ° μ°λ λλ§λ€ λ
립μ μΌλ‘ ν λΉλλ©° μλ° μ ν리μΌμ΄μ
μ΄ JNI(Java Native Interface)
λ₯Ό ν΅ν΄ λ€μ΄ν°λΈ λ©μλλ₯Ό νΈμΆν λ μ΄ μ€νμ΄ νμ©λλ€.
- Heap
JVMμ΄ μμλ λ μμ±λλ©° λͺ¨λ μ°λ λκ° κ³΅μ νλ λ©λͺ¨λ¦¬ 곡κ°μ΄λ€. new
ν€μλλ₯Ό ν΅ν΄ λμ μΌλ‘ μμ±λ κ°μ²΄ λλ λ°°μ΄μ΄ μ μ₯λλ€. κ°μ²΄μ μ€μ λ°μ΄ν°λ νμ μ μ₯λκ³ μ°Έμ‘°κ°μ JVM Stackμ μ μ₯λλ€. νμ κ°λΉμ§ 컬λ μ
μ λμμ΄ λλ€. νμ΄ κ°λ μ°¨λ©΄ OutOfMemoryError
κ° λ°μνλ€.
- Method Area
ν΄λμ€μ λν λͺ¨λ μ 보(λ©νλ°μ΄ν°, λ°μ΄νΈμ½λ, μμ ν, static λ³μ λ±)κ° μ μ₯λλ μμμΌλ‘ λͺ¨λ μ°λ λκ° κ³΅μ νλ€. JVMμ΄ ν΄λμ€λ₯Ό λ‘λ©νλ©΄ κ·Έ μ λ³΄κ° λ©μλ μμμ μ μ¬λλ€. μ΄ μμμ JVMμ΄ μμλλ©΄ μμ±λλ©° νλ‘κ·Έλ¨μ΄ μ’
λ£λ λκΉμ§ μ μ§λλ€. μ΄ μμμ΄ κ°λ μ°¨λ©΄ OutOfMemoryError
κ° λ°μνλ€.
π JDK vs. JRE vs. JVM
JDK(Java Development Kit)
JDK
λ μλ° μ ν리μΌμ΄μ
μ κ°λ°νκΈ° μν μννΈμ¨μ΄ κ°λ° ν€νΈμ΄λ€. JDKμ JRE, μ»΄νμΌλ¬, λλ²κ±°, JavaDoc λ±μ΄ ν¬ν¨λμ΄ μλ€. μ¦, κ°λ°μλ JDKλ₯Ό μ¬μ©νμ¬ μλ° μμ€ μ½λλ₯Ό μμ±νκ³ μ»΄νμΌ λ° λλ²κΉ
ν μ μλ€.
JRE(Java Runtime Environment )
JRE
λ μλ° νλ‘κ·Έλ¨μ μ€νν μ μλ νκ²½μ μ 곡νλ ν¨ν€μ§μ΄λ€. JVMκ³Ό νλ‘κ·Έλ¨ μ€νμ νμν λΌμ΄λΈλ¬λ¦¬, 리μμ€ νμΌ λ±μ ν¬ν¨νλ€. μ»΄νμΌλ¬, λλ²κ±°κ°μ κ°λ° λꡬλ ν¬ν¨νμ§ μμΌλ―λ‘ μλ° μ ν리μΌμ΄μ
μ κ°λ°ν μλ μλ€.
JVM(Java Virtual Machine)
JVM
μ μλ° λ°μ΄νΈμ½λ(.class)λ₯Ό μ΄μ 체μ μ νλμ¨μ΄μ λ
립μ μΌλ‘ μ€νν μ μλλ‘ νλ μννΈμ¨μ΄ κ³μΈ΅μ΄λ€. μ¦, JVMμ΄ μ€μΉλ OSμμλ λ³λμ μμ
μμ΄ μλ°λ‘ μμ±λ νλ‘κ·Έλ¨(.java)μ μ€νν μ μλ€. JVMμ JREμ ν¬ν¨λλ©° κ°λ°μκ° μ§μ JVMμ λ€λ£¨λ κ²μ΄ μλ μλ° νλ‘κ·Έλ¨μ΄ μ€νλλ©΄ λ΄λΆμ μΌλ‘ λμνλ€.
μ¦, JDK μμ JREκ° μκ³ , JRE μμ JVMμ΄ μλ€.
π μ°Έκ³
https://inpa.tistory.com/entry/JAVA-%E2%98%95-JVM-%EB%82%B4%EB%B6%80-%EA%B5%AC%EC%A1%B0-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%81%EC%97%AD-%EC%8B%AC%ED%99%94%ED%8E%B8#%EC%9E%90%EB%B0%94%EA%B0%80%EC%83%81%EB%A8%B8%EC%8B%A0jvm%EC%9D%98%EB%8F%99%EC%9E%91%EB%B0%A9%EC%8B%9D
https://lsj31404.tistory.com/105
https://inpa.tistory.com/entry/JAVA-%E2%98%95-JDK-JRE-JVM-%EA%B0%9C%EB%85%90-%EA%B5%AC%EC%84%B1-%EC%9B%90%EB%A6%AC-%F0%9F%92%AF-%EC%99%84%EB%B2%BD-%EC%B4%9D%EC%A0%95%EB%A6%AC
https://www.boardinfinity.com/blog/understanding-the-difference-between-jdk-jre-and-jvm/