[JAVA] 1μ£Όμ°¨ - JVMμ 무μμ΄λ©° μλ° μ½λλ μ΄λ»κ² μ€ννλ κ²μΈκ°
π» μλ°κ° λ§λ€μ΄μ§κ² λ λ°°κ²½
μλ°λ κΈ°λ³Έμ μΌλ‘ C/C++κ³Ό λΉμ·νμ§λ§ C/C++μ μ¬μ©νλ©΄μ λνλλ 볡μ‘νκ³ μμ νμ§ μμ λ¬Έμ λ₯Ό ν΄κ²°νκ³ μ νλ€.
μ΄κΈ°μ μλ°κ° μ§ν₯ν λ°λ‘λ multiple host architecture μ secureμΌλ‘ ν λ² μ°κ³ μ΄λ κ³³μμλ μ€νν μ μλ κ²μ λͺ©νλ‘ νλ€. (Write Once Run Anywhere)
μλ°λ‘ κ°λ°λ νλ‘κ·Έλ¨μ CPUλ μ΄μ 체μ μ μ’ λ₯μ κ΄κ³μμ΄ JVMμ μ€μΉν μ μλ μμ€ν μμ μ΄λμλ μ€νν μ μμΌλ©° μΉ μ ν리μΌμ΄μ μ νΉμ±κ³Ό λ§μλ¨μ΄μ Έ νλ°μ μΈ μΈκΈ°λ₯Ό λκ² λμλ€.
π JVMμ΄λ 무μμΈκ°?
- μ μ : μλ° κ°μ κΈ°κ³(JVM : Java Virtual Machine)λ‘μ μλ° λ°μ΄νΈμ½λλ₯Ό μ€νν μ μλ 주체
- μ€κ³μ : μ μμ€ κ³ μ¬λ§(James Gosling)
- κ΅¬μ± : Class Loader, Excution Engine, Garbage Collector, Runtime Data Area
- μ₯μ : CPUλ μ΄μ체μ μ’ λ₯μ 무κ΄νκ² μ€νμ΄ κ°λ₯νλ€.(=νλ«νΌ λ 립μ )
- λ¨μ : λ€λ₯Έ μΈν°νλ¦¬ν° λ°©μμ μΈμ΄λ³΄λ€λ μλΉν λΉ λ₯Έ μνλ₯λ ₯μ 보μ΄μ§λ§, μΌκ΄ μ»΄νμΌ λ°©μ μΈμ΄λ³΄λ€λ μν μλκ° λ리λ€.
++ μΆκ° λ΄μ©
JVMμ JAVAμΈμ΄μ μ΄λ€ κ²λ μμ§λͺ»νκ³ λ°μ΄νΈμ½λμΈ .class νμλ§ μκ³ μλ€. κ·Έλ κΈ° λλ¬Έμ μ°λ¦¬κ° JavaνμΌμ λ§λ€λ©΄, μλ° μ»΄νμΌλ¬λ μλ° μΈμ΄λ‘ μμ±λ νλ‘κ·Έλ¨μ λ°μ΄νΈ μ½λλΌλ νΉμν λ°μ΄λ리 νν(.class)λ‘ λ³ννλ€. (.class νμΌμλ JVM λͺ λ Ήμ΄ λλ λ°μ΄νΈ μ½λμ κΈ°νΈ ν λ° κΈ°ν 보쑰 μ λ³΄κ° ν¬ν¨λμ΄ μλ€.)
π JVMμ νΉμ§
- μ€ν κΈ°λ°μ κ°μ λ¨Έμ
- λλ€μμ λͺ λ Ήμ΄κ° μ€ν μ λμμ νΌμ°μ°μλ₯Ό ννκ³ κ²°κ³Όλ₯Ό λ€μ μ€νμ λ£λ λ°©μμΌλ‘ μ§ννλ€.
- μ¬λ³Όλ¦ λ νΌλ°μ€
- κΈ°λ³Έ μλ£ν(primitive data type)μ μ μΈν λͺ¨λ νμ (ν΄λμ€, μΈν°νμ΄μ€ λ±)μ μ¬λ³Όλ¦ λ νΌλ°μ€λ₯Ό ν΅ν΄ μ°Έμ‘°νλ€.
- κΈ°λ³Έμλ£ν : boolean, char, byte, short, int, long, float, double
- κ°λΉμ§ 컬λ μ
- μ¬μ©μ μ½λλ₯Ό λͺ μμ μΌλ‘ μμ±νκ³ κ°λΉμ§ 컬λ μ μ μν΄ μλμΌλ‘ νκ΄΄ λλ€.
- λͺ¨λ κΈ°λ³Έ μλ£νμ λͺ
ννκ² μ μνμ¬ νλ«νΌ λ
λ¦½μ± λ³΄μ₯
- C/C++λ±μ μΈμ΄λ νλ«νΌμ λ°λΌ intνμ ν¬κΈ°κ° λ³νλ€.
- JVMμ κΈ°λ³Έ μλ£νμ λͺ ννκ² μ μνμ¬ νΈνμμ μ μ§νκ³ νλ«νΌ λ 립μ±μ 보μ₯νλ€.
- λ€νΈμν¬ λ°μ΄νΈ μ€λ
- μλ° ν΄λμ€ νμΌμ λ€νΈμν¬ μ μ‘ μμ μ¬μ©νλ λ°μ΄νΈ μ€λμΈ λ€νΈμν¬ λ°μ΄νΈ μ€λλ₯Ό μ¬μ©νλ€.
π JVM(Java Virtural Machine)μ ꡬμ±μμ
- ν΄λμ€ λ‘λ (Class Loader)
- μ»΄νμΌλ¬μ μν΄ λ§λ€μ΄μ§ .class νμΌμ Runtime Data Areaλ‘ μ μ¬νλ μν (=λ©λͺ¨λ¦¬μ μ¬λ¦¬λ μν )μ νλ€.
- loading, linking, initialization κ³Όμ μ κ±°μΉλ€.
- loading : .classνμΌμ μ½μ΄μ Method Areaμ μ μ₯νλ€. (ν΄λμ€/μΈν°νμ΄μ€/Enumκ³Ό κ΄λ ¨μ΄ μλμ§ νμΈνκ³ , λ³μ/λ©μλ/ν΄λμ€μ μ 보λ₯Ό κ°μ§κ³ μλ€.)
- linking : classνμΌμ μ νμ±μ κ²μ¦(μ€ν¨νλ©΄ λ°νμμλ¬)νκ³ , ν΄λμ€ λ³μμ λ©λͺ¨λ¦¬λ₯Ό ν λΉνκ³ μ΄κΈ°ννλ€.
- initialization : staticλ³μ ν λΉ
- Runtime Data Area
- νλ‘κ·Έλ¨μ μ€ννλ λμ μ¬μ©λλ λ€μν λ°νμ λ°μ΄ν° μμμ μ μνλ€.
- λ°μ΄ν° μμμΌλ‘λ Method, Heap, Stack, PC register, Native Method Stackμ΄ μ‘΄μ¬νλ€.
- Method Area : 곡μ 리μμ€λ‘ μ μ λ³μ, ν΄λμ€ μ΄λ¦, λ©μλ λ° λ³μ μ 보 μ μ₯
- Heap Area : 곡μ 리μμ€λ‘ λͺ¨λ κ°μ²΄μ μ λ³΄κ° μ μ₯
- Stack Area : μ€λ λλ³λ‘ μ€νμ΄ μ‘΄μ¬νλ©°, λ‘컬 λ³μ μ μ₯
- PC register : μ€λ λμ μ€ν λͺ λ Ή μ£Όμ
- Execution Engine
- .classλ₯Ό λ°μ΄νΈ μ½λλ₯Ό νμ€μ© μ½μΌλ©° λͺ
λ Ήμ΄ λ¨μλ‘ μ€ννλ€.
- Interprter λ°©μ : λ°μ΄νΈ μ½λλ₯Ό ν μ€μ© μ½κ³ ν΄μνλ€.
- JIT λ°©μ :
- .classλ₯Ό λ°μ΄νΈ μ½λλ₯Ό νμ€μ© μ½μΌλ©° λͺ
λ Ήμ΄ λ¨μλ‘ μ€ννλ€.
- κ°λΉμ§ μ½λ ν° (Garbage Collector)
- Heapλ©λͺ¨λ¦¬μ μ μ¬λ κ°μ²΄λ€ μ€ μ°Έμ‘°λμ§ μμ κ°μ²΄λ₯Ό μμ νλ€.
π μ»΄νμΌ νλ λ°©λ²
javac "ν΄λμ€ μ΄λ¦.java"
μμ κ°μ λͺ λ Ήμ΄λ₯Ό μμ±νλ©΄ ν΄λμ€ μ΄λ¦.class(λ°μ΄νΈνν)κ° λ§λ€μ΄μ§λ€.
μλ°μ μ»΄νμΌλ¬μ μν
- μλ° μΈμ΄λ₯Ό JVMμ΄ μ΄ν΄νλ μλ° λ°μ΄νΈμ½λλ‘ λ²μνλ€.
μλ°μ μ»΄νμΌ κ³Όμ
- κ°λ°μλ€μ΄ ideλ terminal νκ²½μμ .java νμΌμ μμ±νλ€.
- buildλΌλ μμ μ ν΅ν΄ .class νμΌμ μμ±νκ² λλ€.
javac μ΅μ
π μ€ννλ λ°©λ²
java ν΄λμ€μ΄λ¦.class
classLoaderκ° classλ₯Ό Method Areaλ‘ μ¬λ¦¬κ³ byteμ½λκ° μ ννμ§ νμΈν ν Execution Engineμμ μ€νλλ€.
π λ°μ΄νΈμ½λλ 무μμΈκ°
μμ λ§νλ―μ΄ JVMμ νλ«νΌμ μ’
μμ μ΄μ§ μκ³ , μ΄λ κ³³μμλ λμν μ μλ€.
JVMμ΄ νλ«νΌ μ’
μμ μ΄μ§ μλ κ°μ₯ ν° μ΄μ κ° λ°μ΄νΈμ½λλ₯Ό μ¬μ©νκ³ μλ€λ μ μ΄λ€.
JVMμ΄ μ΄ν΄ν μ μλ μΈμ΄λ‘ λ³νλ λ°μ΄νΈ μ½λλ μ¬μ©μ μΈμ΄μΈ μλ°μ κΈ°κ³μ΄ μ¬μ΄μ μ€κ° μΈμ΄μ΄λ©°, μλ° μ½λλ₯Ό λ°°ν¬νλ κ°μ₯ μμ λ¨μμ΄λ€.
π JIT μ»΄νμΌλ¬? μ΄λ»κ² λμν κΉ?
JIT(Just In Time) κ° λμ€κ² λ λ°°κ²½
ν΄λμ€νμΌμ μ€ννλ λ°©λ²μΌλ‘ Interpreterλ°©μμ΄ μλ€. κ·Έλ¬λ, νλμ λ°©λ²μ μ¬λ¬ λ² νΈμΆν κ²½μ° λ§€λ² ν΄μμ΄ νμνμ¬ μ€ν μλκ° λ리λ€λ λ¨μ μ΄ μλ€.
μ΄λ¬ν λ¨μ μ 극볡νκΈ° μν΄/μ»΄νμΌλ¬μ ν¨μ¨μ±μ λμ΄κΈ° μν΄ JITμ»΄νμΌλ¬κ° λμλ€.
JIT(Just In Time) λ?
λ°μ΄νΈμ½λ μ 체(.class νμΌ)λ₯Ό μ»΄νμΌνμ¬ λ€μ΄ν°λΈ μ½λλ‘ λ³κ²½νλ€.
μΈν°ν리ν°κ° λ°λ³΅λλ λ©μλ νΈμΆμ λ³Ό λλ§λ€ JIT μ»΄νμΌλ¬κ° ν΄λΉ λΆλΆμ λν΄ μ§μ λ€μ΄ν°λΈ μ½λλ₯Ό μ 곡νμ¬ μ¬ν΄μμ΄ νμνμ§ μμΌλ―λ‘ ν¨μ¨μ±μ΄ ν₯μλλ€.
cf) λ€μ΄ν°λΈ μΈμ΄λ?
π JDKμ JREμ μ°¨μ΄
JDK(Java Developement kit)
μλ° νκ²½μμ λμκ°λ νλ‘κ·Έλ¨μ κ°λ°νλ λ° νμν ν΄(JRE, μ»΄νμΌλ¬, λλ²κ±°)λ€μ λͺ¨μλ μννΈμ¨μ΄ ν¨ν€μ§
JRE(Java Runtime Environment)
JREλ μλ° μ΄ν리μΌμ΄μ μ μννκΈ° μν SWλΌκ³ λ³Ό μ μλ€.
- μλ° νμΌμ JVMμΌλ‘ λ‘λ©μν€λ μν
- JVMμ μλ°νμΌμ ν΄μν΄μ μ€νν μ μλ μνλ‘ λ§λ€μ΄μ€λ€.
- jreλ μλ° νλ‘κ·Έλ¨μ΄ μ€νλκΈ° μν μ΅μνκ²½ = javaνμΌμ μ€νλ§ μν¬ κ²μ΄λΌλ©΄ jreλ§ μμ΄λ κ°λ₯νλ€.
- runtine environmentμ λ€λ₯Έ μννΈμ¨μ΄λ₯Ό μ€ννκΈ° μν΄ κ³ μλλ μΌμ’ μ μννΈμ¨μ΄μ
μλ° μ΄ν리μΌμ΄μ μ κ°λ°νκΈ° μν΄μ
JDKλ₯Ό νμλ‘ μ€μΉν΄μΌνλ€.
μΆμ²
- oracle JVM : docs.oracle.com/javase/specs/jvms/se7/html/jvms-1.html#jvms-1.1
- How JVM work : https://www.geeksforgeeks.org/jvm-works-jvm-architecture/
- JDK μ JREμ μ°¨μ΄ : https://www.geeksforgeeks.org/differences-jdk-jre-jvm/
- μν€λ°±κ³Ό μλ° : https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)
- μν€λ°±κ³Ό JVM : ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EA%B0%80%EC%83%81_%EB%A8%B8%EC%8B%A0