jvm
JVM
Java Virtual Machineμ μ½μλ‘ Javaμ OSμ¬μ΄μμ μ€κ°μ μν μ νμ¬ λ©λͺ¨λ¦¬ κ΄λ¦¬, GC(garbage collection)μ μννλ μ€νκΈ°λ°μ κ°μλ¨Έμ μΌλ‘ C++,Cμ κ°μ μΈμ΄λ€κ³Ό λ€λ₯΄κ² OSμ μκ΄μμ΄ λμμ΄ κ°λ₯νλ€.
Javaλ Cλ C++κ³Ό κ°μ΄ λ°λ‘ μ»΄νμΌλλ μ»΄νμΌ μΈμ΄κ° μλλ€. μ»΄νμΌμΈμ΄λ μ»΄νμΌ νκ²½μ λ°λΌ λ€λ₯΄κ² μ»΄νμΌμ΄ λλ€λ νΉμ§μ κ°μ§κ³ μκΈ° λλ¬Έμ Javaμ κ°μ₯ ν° νΉμ§μΈ osμ νκ²½μ ꡬμ λ°μ§ μλ λ€λ μ μ μλ°νκΈ° λλ¬Έμ΄λ€. (νμ΄μ¬μ΄λ, JSλ μΈν°νλ¦¬ν° μΈμ΄)
μ»΄νμΌλ¬λ μ 체 μμ€μ½λλ₯Ό ν΅ν΄ λΆμνμ¬ μ€λ₯κ°μλμ§ νμΈνλ©° μ¬κ΅¬μ±νμ¬ κΈ°κ³μ΄λ‘ λ°κΎΈλ λ°λ©΄, μΈν°ν리ν°λ ν νμ© μ€ννλ©° λΆμμνκ³ (μ€κ° μ½λλ‘ λ³ν) μ€κ°μ μλ¬κ° λ°μμ κ·Έ μ΄νμ μ½λλ νμΈνμ§ μλλ€.
Javaλ νκ²½μ ꡬμ λ°μ§ μλλ€λ νΉμ§λλ¬Έμ μλ° μ»΄νμΌλ¬κ° μλ°μ½λλ₯Ό λ°μ΄νΈ μ½λ(.classνμΌ)λ‘ λ³ννκ³ μ΄λ₯Ό κΈ°κ³μ΄λ‘ λ²μν΄μ£Όλ κ³Όμ μ κ±°μΉλ μΈν°ν리ν°μ μ»΄νμΌλ¬λ₯Ό λͺ¨λ μ¬μ©νλ μΈμ΄μ΄λ€.
μ»΄νμΌλ¬λ κΈ°κ³μ΄λ‘ λ³νν΄μ£Όλ νλ‘κ·Έλ¨μΈλ° κΈ°κ³μ΄κ° μλ λ°μ΄νΈμ½λλ‘ λ³νν΄μ£Όλ νλ‘κ·Έλ¨μ μλ° μ»΄νμΌλ¬λΌκ³ λΆλ₯΄λ μ΄μ λ λ°μ΄νΈμ½λλ κΈ°κ³μ΄λ‘ λ³νν΄μ£Όλ JVMμ μν μΈμ΄μ΄κ³ JVMλ κΈ°κ³μ΄κΈ° λλ¬Έμ μλ° μ»΄νμΌλ¬λΌκ³ λΆλ₯Έλ€.
μλ° μΈν°ν리ν°λ μλ° μ»΄νμΌλ¬μ μν΄ λ³νλ λ°μ΄νΈμ½λλ₯Ό λ€λ₯Έ νκ²½μ JVMμμ μ€νν μ μλλ‘ κΈ°κ³μ΄λ‘ λ³νν΄μ£Όλ μν μ νλ€.
νκ²½μ ꡬμ λ°μ§ μλλ€λ μΈν°ν리ν°μ μ₯μ μ μ΄μ©νκΈ° μν΄ μ»΄νμΌλ¬λ‘ μ€κ°μΈμ΄λ‘ λ³ν ν μ΄λ₯Ό κΈ°κ³μ΄λ‘ λ³ννλ λ°©μμ μ΄μ©νλ€.
μ»΄νμΌ νλ λ°©λ²
μ»΄νμΌ μ΄λ¦ κ·Έλλ‘ μλ° μ»΄νμΌλ¬λ₯Ό μ΄μ©ν΄ μλ°μ½λλ₯Ό λ°μ΄νΈμ½λ(.classνμΌ)λ‘ λ³ννλ κ²μΌλ‘ μ€μΉν jdkμ binν΄λμμ javac
μ΄λΌλ μλ° μ»΄νμΌλ¬κ° μ‘΄μ¬νκΈ° λλ¬Έμ μ΄λ₯Ό μ΄μ©νλ©΄ λλ€.
μ»΄νμΌ κ³Όμ
μ΄ν λΆμ : public, class, operator(μ°μ°μ,κ΄νΈλ±), 리ν°λ΄(μμ), λ±μΌλ‘ λΆμνμ¬ λλκ²μ
μ΄νμ
λΌκ³ νλ©° μ΄ μ΄νμλ€μ νλμ μ€νΈλ¦Ό(ν ν° μ€νΈλ¦Ό)μΌλ‘ λ§λλ κ³Όμ ꡬ문 λΆμ : ν ν°μ€νΈλ¦Όμ ν΅ν΄ λ¬Έλ²μ λ§λμ§ νμΈνκ³ νλ Έλ€λ©΄
Syntax error
λ₯Ό λμ΄λ€.μλ―Έ λΆμ : νμ κ²μ¬λ μλ νμ λ³νμ μννμ¬ κ²μ¬νκ³ μλ¬λ₯Ό λμ΄λ€.
μ€κ° μ½λ(λ°μ΄νΈ μ½λ) μμ±
μ€νλ°©λ²
λλΆλΆμ IDEλ₯Ό ν΅ν΄ μ€ννλ CLIμ java
λͺ
λ Ήμ΄λ₯Ό μ΄μ©νμ¬ μ€νμ΄κ°λ₯νλ€.
default ν¨ν€μ§λΌλ©΄ λ°λ‘ νμΌλͺ μ ν΅ν΄ μ€νμ΄ κ°λ₯νλ©° packageλ₯Ό λͺ μνμ¬ μ€νλ κ°λ₯νλ€.
λ°μ΄νΈμ½λλ
μμμ μ€λͺ κ² μ²λΌ JVMμ΄λΌλ κΈ°κ³κ° μ΄ν΄ν μ μλ μΈμ΄μ΄λ€.
λλ¬Έμ μλ°μ½λλ₯Ό λ°μ΄νΈ μ½λλ‘ λ³ννλ κ²μ μλ° μ»΄νμΌλ¬
λΌκ³ λΆλ₯Έλ€.
JVM ꡬμ±μμ
Class Loader : λ°μ΄νΈ μ½λ(.class νμΌ)λ₯Ό JVMλ΄λ‘ λ‘λ©νκ³ λ§ν¬λ₯Ό ν΅ν΄ λ°°μΉνλ μμ μ μν
λ°νμ μμ λμ μΌλ‘ ν΄λμ€λ€μ λ‘λνκΈ° λλ¬Έμ μ΄λ ν΄λμ€λ₯Ό μ²μ μ°Έμ‘°νλ€.
λ‘λ©μμ ν΄λμ€κ° μ‘΄μ¬νμ§ μλλ€λ©΄ ν΄λμ€λ₯Ό μ°Ύμ μμλ€κ³ μλ¬κ° λ°μνλ€.
Execution Engine : ν΄λμ€λ₯Ό μ€ν μν€λ μν λ‘ JVMμ μν λ°μ΄νΈμ½λλ₯Ό κΈ°κ³μ΄λ‘ λ³κ²½νλ μμ μ μν
Interpreter : λ°μ΄νΈ μ½λλ₯Ό λͺ λ Ήμ΄ λ¨μλ‘ μ½μ΄μ μ€ννκ³ ν μ€μ© μννκΈ° λλ¬Έμ μλκ° λ리λ€λ λ§μ΄ λμ¨λ€.
JIT (Just In Time) : μΈν°ν리ν°μ λ¨μ μ 보μνκΈ° μν μ»΄νμΌλ¬λ‘ μΈν°νλ¦¬ν° λ°©μμΌλ‘ μ€ννλ€κ° μ μ ν μμ μ λ°μ΄νΈμ½λ μ 체λ₯Ό μ»΄νμΌνμ¬ κΈ°κ³μ΄λ‘ λ°κΎΈμ΄ μ€ννλ λ°©μ
κΈ°κ³μ΄λ μΊμμ 보κ΄νκΈ° λλ¬Έμ ν λ² μ»΄νμΌλ μ½λλ λΉ λ₯΄κ² μνμ΄ κ°λ₯νλ ν λ²λ§ μ€νλλ μ½λλΌλ©΄ μ»΄νμΌνμ§ μκ³ μΈν°ν리ν νλ κ²μ΄ μ 리νκΈ° λλ¬Έμ JITμ»΄νμΌλ¬λ₯Ό μ¬μ©νλ JVMλ€μ λ΄λΆμ μΌλ‘ λ©μλμ λΉλλ₯Ό 체ν¬νκ³ μ λλ₯Ό λμμ κ²½μ° μννλ μμΌλ‘ μ€μΌμ€λ§νλ€.
Garbage Collector : μ¬μ©νμ§ μλ λ©λͺ¨λ¦¬λ₯Ό 체ν¬νκ³ μ κ±°νλ garbage Collectionμ μννλ μ€λ λκ° μ‘΄μ¬νλ€.
Runtime Data Area
JVMλ΄μ λ©λͺ¨λ¦¬
PC Register : μ€λ λκ° μ΄λ€ λΆλΆμ μ΄λ€ λͺ λ ΉμΌλ‘ μ€νν μ§λ₯Ό κΈ°λ‘νλ λΆλΆμΌλ‘ νμ¬ μ€νμ€μΈ λ©μλκ° λ€μ΄ν°λΈκ° μλλ©΄ JVMλͺ λ Ήμ΄ μμΉμ μ μ₯λκ³ λ€μ΄ν°λΈμ΄λ©΄ μ μ₯λλ κ°μ μ μ λμ§ μκ³ CPUμ Registerμ λ€λ₯΄κ² μ°μ°μ μν΄ νμν νΌμ°μ°μλ₯Ό μμλ‘ μ μ₯νκΈ° μν μ©λλ‘ μ¬μ©νλ€.
νμ¬ μνμ€μΈ JVM λͺ λ Ήμ μ£Όμλ₯Ό κ°λλ€.
JVM Stack : λ§€κ°λ³μ, μ§μλ³μ, λ¦¬ν΄ κ°λ± μ€λ λλ λ©μλμ λ°μ΄ν°λ€μ μμλ‘ μ μ₯νλ 곡κ°μΌλ‘ μ€λ λλ§λ€ λ³λμ 곡κ°μ κ°κ³ μμΌλ©°, λ©μλκ° νΈμΆλ λλ§λ€
νλ μ
μ΄ μμ±λμ΄ μ΄κ³³μ μμ λ°μ΄ν°κ³΅κ°μΌλ‘ μ¬μ©νκ³ λ©μλκ° λλλ©΄ νλ μμ μμ λλ©° μ€λ λκ° μ’ λ£μ μ€ν곡κ°λ μ κ±°λλ€.Native Method Stack : λ°μ΄νΈ μ½λκ° μλ κΈ°κ³μ΄λ‘ μμ±λ νλ‘κ·Έλ¨μ μ€νμν€λ 곡κ°μΌλ‘ μλ°κ° μλ λ€λ₯ΈμΈμ΄λ‘ μμ±λ λ€μ΄ν°λΈ λ©μλλ₯Ό μ§μνκΈ° μν΄ μ¬μ©λλ μ€νμ΄λ€.
Heap : μΈμ€ν΄μ€ν λ λͺ¨λ ν΄λμ€μ λ°°μ΄, κ°μ²΄λ₯Ό μ μ₯νλ κ°μ λ©λͺ¨λ¦¬ 곡κ°μΌλ‘ λͺ¨λ JVMμ€λ λκ° κ³΅μ νλ μμμ΄κ³
GC
μ μν΄μλ§ μμμ΄ νμκ°λ₯νλ€.Permanent Generation : μμ±λ κ°μ²΄λ€μ μ 보 μ£Όμκ°μ΄ μ μ₯λ 곡κ°μΌλ‘
ν΄λμ€ λ‘λ
μ μν΄ λ‘λλλclass
,Method
λ±μ λ©νμ λ³΄κ° μ μ₯λλ μμReflection(κ°μ²΄λ₯Ό ν΅ν΄ ν΄λμ€μ μ 보λ₯Ό λΆμν΄λ΄λ νλ‘κ·Έλ¨ κΈ°λ²)μ μ¬μ©νμ¬ λμ μΌλ‘ ν΄λμ€κ° λ‘λ©λλ κ²½μ°μλ μ¬μ©λλ€.
Young Generation
Eden : κ°μ²΄λ€μ΄ μ΅μ΄λ‘ μμ±λλ 곡κ°
Survivor 0/1 : Edenμμ μ°Έμ‘°λλ κ°μ²΄λ€μ΄ μ μ₯λλ 곡κ°
λλΆλΆμ κ°μ²΄λ€μ΄ κΈλ°© μ κ·Ό λΆκ° μνκ° λκΈ° λλ¬Έμ λ§μ κ°μ²΄κ° μ΄ μμμ μμ±λμλ€κ° μ¬λΌμ§κ³ μ΄ μμμμ κ°μ²΄κ° μ¬λΌμ§λ
Minor GC
κ° λ°μνλ€κ³ νλ€.Old Generation : μ κ·Ό λΆκ°λ₯ μνλ‘ λ°λμ§ μκ³ Young μμμ λ¨μ μλ κ°μ²΄κ° μ¬κΈ°λ‘ 볡μ¬λλ©°, Young μμλ³΄λ€ ν¬κ² ν λΉλκ³ GCλ μ κ² λ°μνλ€.
μ΄ μμμμ κ°μ²΄κ° μ¬λΌμ§ λ
Major GC
κ° λ°μνλ€κ³ νλ€.
Method Area : ν΄λμ€ μ 보λ₯Ό μ²μ λ©λͺ¨λ¦¬ 곡κ°μ μ¬λ¦΄λ μ΄κΈ°ν λμμ μ μ₯νκΈ° μν λ©λͺ¨λ¦¬ 곡κ°μΌλ‘
λ°νμ μμ ν
,νλμ λ©μλ λ°μ΄ν°
,μμ±μ
,λ©μλμ μ½λ λ΄μ©
μ μ μ₯νλ€. (μ¬μ€μ μ»΄νμΌ λ λ°μ΄νΈμ½λμ λλΆλΆμ΄ λ©μλ λ°μ΄νΈ μ½λμ΄κ³ λ°μ΄νΈμ½λμλ λ°νμ μμνμ΄ μλλΌ κ·Έλ₯ μμνμ΄ ν¬ν¨λμ΄μκΈ° λλ¬Έμ κ±°μ λͺ¨λ λ°μ΄νΈμ½λκ° μ¬λΌκ°λ€κ³ λ΄λ 무방νλ€.)λ°νμ μμνμ μ΄ μμνμ λ°νμΌλ‘ λ°νμ(λ©μλ μμμ μ μ₯λ λ)μ λ§λ€μ΄μ§λ€.
JDKμ JRE μ°¨μ΄
JDK : Java Development kitμ μ½μλ‘
μ»΄νμΌλ¬
,μ μ΄μ λΈλ¬
,λλ²κ±°
,μμ‘΄κ΄κ³ λΆμ
λ± κ°λ°μ νμν λꡬλ₯Ό μ 곡JRE : Java Runtime Envirmontμ μ½μλ‘
Class Loader
,μ€ν λͺ λ Ή(java)
μ κ°μ΄ μ€νμ νμν λΌμ΄λΈλ¬λ¦¬λ₯Ό μ 곡JVM : Java Virtual Machineμ μ½μλ‘
μΈν°ν리ν°
,JIT
λ±μ μ΄μ©νμ¬ λ°μ΄νΈ μ½λλ₯Ό OSμ λ§κ² κΈ°κ³μ΄λ‘ λ³κ²½νμ¬ OSμ λ 립μ μΌλ‘ μ€ν λ μ μλλ‘ μΆμνλ₯Ό μ 곡
OracleJDK μ OpenJDKμ μ°¨μ΄
JVMμ ORACLE
μ΄λΌλ κΈ°μ
μ΄ JVMμ νμ€μ μ μνλ©΄ Amazon
μ΄λ Oracle
,Azul
μ κ°μ κΈ°μ
λ€μ΄ νμ€μ λ°λΌ μ€λ¬Όμ λ§λ€μ΄ μ 곡νκ² λλ€.
μ΄λ, μ€νκ³Ό νμ€μ μ μν Oracleμ΄ λ°°ν¬ν JDKκ° OracleJDKμ΄λ©°, κ°κ²© μ μ± μ΄ μ‘΄μ¬νλ€.
λ€λ₯Έ κΈ°μ λ€μ΄ 무λ£λ‘ λ°°ν¬ν JDKλ₯Ό OpenJDKλΌκ³ νλ€.
Reference
https://asfirstalways.tistory.com/158 https://m.blog.naver.com/ehcibear314/221228200531 https://catch-me-java.tistory.com/9 https://homoefficio.github.io/2019/01/31/Back-to-the-Essence-Java-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C-%EC%8B%A4%ED%96%89%EA%B9%8C%EC%A7%80-2/
Last updated