π€ JVMμ΄λ 무μμΌκΉμ?
Java Virtual Machine
'μλ° νλ‘κ·Έλ¨μ μ€ννκΈ° μν κ°μ κΈ°κ³(μ»΄ν¨ν°)'λΌκ³ ν μ μμ΅λλ€.
μλ°λ μ΄μ체μ μ μ’ μμ μ΄μ§ μλ€λ νΉμ§μ κ°μ§κ³ μμ΅λλ€.
μμ±λ μλ° μμ€ μ½λ(.java)λ μλ° μ»΄νμΌλ¬(javac)λ₯Ό ν΅ν΄ λ°μ΄νΈ μ½λ(.class)λ‘ λ³νλ©λλ€.
μ΄ λ°μ΄νΈ μ½λλ JVMμμ μ€νλκ³ , JVMμ λ°μ΄νΈ μ½λλ₯Ό μ΄μ체μ μ λ§λ κΈ°κ³μ΄λ‘ ν΄μνμ¬ μ€νν©λλ€.
μ΄λ¬ν JVMμ μν μ ν΅ν΄ μ¬λ¬ μ΄μ체μμ λμΌν λ°©μμΌλ‘ μλ° νλ‘κ·Έλ¨μ μ€νν μ μμ΅λλ€.
λν JVMμ μλ λ©λͺ¨λ¦¬ κ΄λ¦¬λ₯Ό μ 곡ν©λλ€.
κ°λ°μκ° κ°μ²΄μ ν λΉλ λ©λͺ¨λ¦¬λ₯Ό ν΄μ νμ§ μμλ Garbage Collectionμ ν΅ν΄ μ¬μ©λμ§ μλ κ°μ²΄λ₯Ό μλμΌλ‘ μ κ±°νμ¬ λ©λͺ¨λ¦¬λ₯Ό μ΅μ νν©λλ€.
μ΄λ¬ν JVMμ μν λ‘ μλ°λ μμ μ±κ³Ό μ΄μμ±μ 보μ₯νκ² λ©λλ€.
π JVMμ ꡬ쑰
ν΄λμ€ λ‘λ( Class Loader )
μ»΄νμΌλ λ°μ΄νΈ μ½λλ₯Ό λμ μΌλ‘ λ‘λνκ³ JVMμ λ©λͺ¨λ¦¬ μμμΈ Runtime Data Areaμ λ°°μΉν©λλ€.
Loading -> Linking -> Initialization μμΌλ‘ μ§νλ©λλ€.
λ‘λ©(Loading) : μ»΄νμΌλ λ°μ΄νΈμ½λ νμΌμ μ½μ΄μ λ©λͺ¨λ¦¬μ λ‘λν©λλ€.
λ§ν¬(Linking) : λ‘λλ ν΄λμ€ νμΌμ λ°μ΄νΈμ½λλ₯Ό κ²μ¦νκ³ νμν 리μμ€λ₯Ό μ°Έμ‘°νλ λ±μ μμ μ μνν©λλ€. μ΄λ¬ν κ³Όμ μ 3λ¨κ³λ‘ λλ©λλ€.
- κ²μ¦(Verfiy) : λ‘λλ ν΄λμ€ νμΌμ΄ JVMλͺ μΈμ λͺ μλ λλ‘ κ΅¬μ±λμ΄ μλμ§ κ²μ¬ν©λλ€.
- μ€λΉ(Prepare) : ν΄λμ€κ° νμλ‘ νλ λ©λͺ¨λ¦¬λ₯Ό ν λΉν©λλ€.
- -λΆμ(Resolving) : ν΄λμ€μ μμ ν λ΄ λͺ¨λ μ¬λ³Όλ¦ λ νΌλ°μ€λ₯Ό μ€μ λ©λͺ¨λ¦¬ λ νΌλ°μ€λ‘ λ³νν©λλ€.
μ΄κΈ°ν(Initialization) : ν΄λμ€ λ³μλ€μ μ μ ν κ°μΌλ‘ μ΄κΈ°ν ν©λλ€. (static νλ μ΄κΈ°ν)
μ€ν μμ§( Execution Engine )
ν΄λμ€ λ‘λλ₯Ό ν΅ν΄ λ°νμ λ°μ΄ν° μμμ λ°°μΉλ λ°μ΄νΈ μ½λλ₯Ό λͺ λ Ήμ΄ λ¨μλ‘ μ½μ΄μ μ€νν©λλ€.
λ°μ΄νΈ μ½λλ JVMμμ μ€νλ μ μλλ‘ μ»΄νμΌλ μ½λλ‘ κΈ°κ³(OS)κ° μ€νν μ μλ ννλ‘ λ³κ²½ν΄μΌ ν©λλ€.
λ°μ΄νΈ μ½λλ₯Ό κΈ°κ³μ΄λ‘ λ³κ²½ν λ, μΈν°ν리ν°μ JITμ»΄νμΌλ¬ λ°©μμ νΌν©νμ¬ λ³κ²½ν©λλ€.
μΈν°ν리ν°(Interpreter)
λ°μ΄νΈ μ½λ λͺ λ Ήμ΄λ₯Ό ν μ€μ© μ½μ΄λ€μ¬ ν΄λΉ λͺ λ Ήμ΄λ₯Ό ν΄μνκ³ μ€νν©λλ€.
JITμ»΄νμΌλ¬(Just-In-Time Compiler)
μΈν°ν리ν°μ λ¨μ μ 보μνκΈ° μν΄ λμ λ λ°©μμΌλ‘ λ°λ³΅λλ μ½λλ₯Ό λ°κ²¬νμ¬ λ°μ΄νΈ μ½λ μ 체λ₯Ό μ»΄νμΌνμ¬ Native Codeλ‘ λ³κ²½νκ³ μ΄νμ ν΄λΉ λ©μλλ₯Ό λ μ΄μ μΈν°ν리ν νμ§ μκ³ μΊμ±ν΄ λμλ€κ° λ€μ΄νΈλΈ μ½λλ‘ μ§μ μ€ννλ λ°©μμ λλ€.
λͺ¨λ λ°©μμ JITμ»΄νμΌ λ°©μμΌλ‘ μ€ννμ§ μκ³ μΈν°νλ¦¬ν° λ°©μμ μ¬μ©νλ€ μΌμ κΈ°μ€μ΄ λμ΄κ°λ©΄ JIT μ»΄νμΌ λ°©μμ μ¬μ©ν©λλ€.
κ°λΉμ§ 컬λ ν°(Garbage Collector, GC)
JVMμ GCλ₯Ό μ΄μ©νμ¬ Heap λ©λͺ¨λ¦¬ μμμμ λ μ΄μ μ¬μ©λμ§ μλ κ°μ²΄λ€μ νμ§νκ³ μ κ±°νμ¬ λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬ν©λλ€.
λ°νμ λ°μ΄ν° μμ(Runtime Data Area)
JVMμ λ©λͺ¨λ¦¬ μμμΌλ‘ μλ° μ ν리μΌμ΄μ μ μ€νν λ μ¬μ©λλ λ°μ΄ν°λ₯Ό μ μ¬νλ μμμ λλ€.
λ©μλ μμ(Method Area)
JVMμ΄ μμλ λ μμ±λλ 곡κ°μΌλ‘ λ°μ΄νΈ μ½λλ₯Ό μ²μ λ©λͺ¨λ¦¬ 곡κ°μ μ¬λ¦΄ λ μ΄κΈ°νλλ λμμ μ μ₯νκΈ° μν λ©λͺ¨λ¦¬ 곡κ°μ λλ€.
JVMμ΄ λμνκ³ ν΄λμ€κ° λ‘λλ λ μ μ¬λμ΄ νλ‘κ·Έλ¨μ΄ μ’ λ£λ λκΉμ§ μ μ₯λ©λλ€.
Class Metadata : ν΄λμ€μ μ΄λ¦, λΆλͺ¨ ν΄λμ€μ μ΄λ¦, μΈν°νμ΄μ€ μ 보 λ± ν΄λμ€μ ꡬ쑰μ μ 보μ μ κ·Ό μ μ΄μ, λ©€λ² λ³μ, λ©μλ λ±μ μ λ³΄κ° ν¬ν¨λ©λλ€.
Static Variable : ν΄λμ€ μμ€μ λ³μμΈ μ μ λ³μλ€μ΄ μ μ₯λ©λλ€. ( λͺ¨λ μΈμ€ν΄μ€κ° 곡μ νλ λ³μμ λλ€ )
Method Code : ν΄λμ€μ μ μλ λ©μλλ€μ λ°μ΄νΈμ½λκ° μ μ₯λ©λλ€.
Runtime Constant Pool : ν΄λμ€μ λν μμλ€μ μ μ₯νλ ν μ΄λΈμ λλ€, ν΄λμ€, λ©μλ, νλμ μ΄λ¦κ³Ό νμ μ 보, 리ν°λ΄ κ° λ±μ΄ ν¬ν¨λ©λλ€.
Reflection Data : 리νλ μ μ ν΅ν΄ ν΄λμ€μ ꡬ쑰λ₯Ό μ‘°μ¬νκ³ μ‘°μνλ λ° νμν λ°μ΄ν°κ° ν¬ν¨λ©λλ€.
μ΄ λ°μ΄ν°λ₯Ό ν΅ν΄ JVMμ΄ λ°νμμ ν΄λμ€μ μ 보λ₯Ό λμ μΌλ‘ κ²μ¬νκ³ μ‘°μν μ μμ΅λλ€.
π Reflection?
μλ°μ 리νλ μ μ ν΄λμ€λ λ©€λ²λ³μ, λ©μλ, μμ±μμ λν μ 보λ₯Ό κ°μ Έμ€κ±°λ μμ νκ³ , λ°νμ μμ λμ μΌλ‘ κ°μ²΄λ₯Ό μμ±νκ±°λ λ©μλλ₯Ό νΈμΆνλ λ±μ μμ μ ν μ μκ² ν΄μ£Όλ μλ° APIμ λλ€.
ν μμ(Heap Area)
λ©μλ μμμ μ μ₯λ ν΄λμ€λ₯Ό ν΅ν΄ μμ±λ λͺ¨λ κ°μ²΄μ λ°°μ΄μ΄ ν μμμ ν λΉλ©λλ€.
νμμμ νλ‘κ·Έλ¨μ μ€ν μ€μ λμ μΌλ‘ ν¬κΈ°κ° μ‘°μ λ μ μμΌλ©°, λͺ¨λ μ€λ λμμ 곡μ λ©λλ€.
μ€ν μμ(Stack Area)
μ€ν μμμ κΈ°λ³Έ μλ£νμ μμ±ν λ μ μ₯νλ 곡κ°μΌλ‘, μμμ μΌλ‘ μ¬μ©λλ λ³μλ μ 보λ€μ΄ μ μ₯λλ μμμ λλ€.
LIFO κ΅¬μ‘°λ‘ λ©μλ νΈμΆ μ μ€ν νλ μ(κ·Έ λ©μλλ§μ μν 곡κ°)μ΄ μμ±λκ³ μ€ν νλ μ μμλ λ©μλ νΈμΆμ νμν μ§μλ³μ, λ§€κ°λ³μ, λ¦¬ν΄ κ°, λ©μλ νΈμΆ μμ μ μν λ±μ΄ μ μ₯λ©λλ€.
κ·Έλ¦¬κ³ λ©μλκ° μ’ λ£λ λλ§λ€ νλ μμ΄ μ κ±°λ©λλ€.
π¨ μ£Όμ
λ°μ΄ν° νμ μ λ°λΌ μ€νκ³Ό νμ μ μ₯λλ λ°©μμ΄ λ€λ¦ λλ€.
μλ₯Ό λ€μ΄ Member m = new Member("name", "age");λΌλ μ½λκ° μμ λ
new Member("name", "age")λ₯Ό ν΅ν΄ μμ±λ κ°μ²΄λ ν μμμ μ μ₯λκ³ ,
μμ±λ λ©€λ²κ°μ²΄μ μ°Έμ‘°μΈ m λ§ μ€ν μμμ μ μ₯λ©λλ€.
μ€ν μμμ κ° μ€λ λλ§λ€ νλμ© μ‘΄μ¬νλ©°, μ€λ λκ° μμλ λ ν λΉλ©λλ€.
νλ‘μΈμ€κ° λ©λͺ¨λ¦¬μ λ‘λλ λ μ€ν μ¬μ΄μ¦κ° κ³ μ λμ΄ μμ΄, λ°νμ μμ μ€ν μ¬μ΄μ¦λ₯Ό λ°κΏ μ μμ΅λλ€.
λ§μΌ κ³ μ λ ν¬κΈ°μ JVMμ€νμμ νλ‘κ·Έλ¨ μ€ν μ€ λ©λͺ¨λ¦¬ ν¬κΈ°κ° μΆ©λΆνμ§ μλ€λ©΄ StackOverFlowErrorκ° λ°μνκ² λ©λλ€.
PCλ μ§μ€ν°(PC register)
μ°λ λ(Thread)κ° μμλ λ μμ±λλ©° νμ¬ μ€ν μ€μΈ JVMλͺ λ Ήμ΄ μ£Όμλ₯Ό μ μ₯ν©λλ€.
μ¦, νμ¬ μ€ν μ€μΈ λ°μ΄νΈμ½λμ μμΉλ₯Ό μΆμ νκ³ , λ€μμ μ€νν λ°μ΄νΈμ½λμ μμΉλ₯Ό κ²°μ ν©λλ€.
λ€μ΄ν°λΈ λ©μλ μ€ν(Native Method Stack)
λ°μ΄νΈ μ½λκ° μλ μ€νν μ μλ κΈ°κ³μ΄λ‘ μμ±λ νλ‘κ·Έλ¨μ μ€νμν€λ μμμ λλ€.
λν μλ° μ΄μΈμ μΈμ΄(C, C++ λ±)λ‘ μμ±λ λ€μ΄ν°λΈ μ½λλ₯Ό μ€ννκΈ° μν 곡κ°μ΄κΈ°λ ν©λλ€.
λ©μλλ₯Ό μ€ννλ κ²½μ° JVMμ€νμ μμ΄λ€κ° ν΄λΉ λ©μλ λ΄λΆμ λ€μ΄ν°λΈ λ°©μμ μ¬μ©νλ λ©μλκ° μλ€λ©΄ ν΄λΉ λ©μλλ λ€μ΄ν°λΈ μ€νμ μμ λλ€.
κ·Έλ¦¬κ³ λ€μ΄ν°λΈ λ©μλκ° μνμ΄ λλλ©΄ λ€μ μλ° μ€νμΌλ‘ λμμ λ€μ μμ μ μνν©λλ€.
κ·Έλμ λ€μ΄ν°λΈ μ½λλ‘ λμ΄ μλ ν¨μμ νΈμΆμ μλ° νλ‘κ·Έλ¨ λ΄μμ μ§μ μνν μ μκ³ κ·Έ κ²°κ³Όλ₯Ό λ°μμ¬ μλ μμ΅λλ€.
JNI( Java Native Interface)
μλ° μ ν리μΌμ΄μ μμ λ€μ΄ν°λΈ μ½λλ₯Ό νΈμΆνκ³ ν΅ν©νκΈ° μν μΈν°νμ΄μ€μ λλ€.
JNIλ₯Ό μ¬μ©νλ©΄ μλ° μ½λμ λ€μ΄ν°λΈ μ½λ κ°μ μνΈ μμ©μ΄ κ°λ₯ν΄μ§λλ€.
π Reference
https://coding-factory.tistory.com/828,
'CS' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] κ°λΉμ§ 컬λ μ (Garbage Collection, GC)μ΄λ 무μμΌκΉμ? (0) | 2024.04.03 |
---|