-
Live Study - Java JVM μ λν΄Hello, World π»/Java βοΈ 2020. 11. 21. 21:47
JVM, Java Virtual Machine
- JVM μ΄λ Java Virtual Machine μ μ½μλ₯Ό λ°μ μ€μ¬ λΆλ₯΄λ μ©μ΄μ΄λ€.
- JVM μ μλ° λ°μ΄νΈμ½λλ₯Ό μ€νν μ μλ 주체μ΄λ€.
- μλ° λ°μ΄νΈμ½λλ νλ«νΌμ λ 립μ μ΄λ©° λͺ¨λ μλ° κ°μ λ¨Έμ μ μλ° κ°μ λ¨Έμ κ·κ²©μ μ μλ λλ‘ μλ° λ°μ΄νΈμ½λλ₯Ό μ€ννλ€.
- νμ€ μλ° APIκΉμ§ λμΌν λμμ νλλ‘ κ΅¬νν μνμμλ μ΄λ‘ μ μΌλ‘ λͺ¨λ μλ° νλ‘κ·Έλ¨μ CPU, μ΄μ체μ μ μ’ λ₯μ 무κ΄νκ² λμΌνκ² λμν κ²μ 보μ₯νλ€.
Virtual Machine, κ°μ λ¨Έμ μ μ»΄ν¨ν νκ²½μ μννΈμ¨μ΄λ‘ ꡬνν κ²μ΄λ€. μ»΄ν¨ν° μμ μ»΄ν¨ν°λΌκ³ μκ°νλ©΄ μ½λ€. κ°μ λ¨Έμ μ OS, Applicationμ μ€μΉ & μ€νν μ μλ€.
λ°μ΄νΈμ½λ
λ¨μν μλ°μμλ§ λ°μ΄νΈμ½λλ₯Ό μ¬μ©νλκ² μλλ€. λ€λ₯Έ μ¬λ¬ μΈμ΄, νκ²½μμλ λ°μ΄νΈμ½λλ₯Ό μ¬μ©νκ³ μλ€. μν€λ₯Ό μ°Έμ‘°ν΄λ³΄λ 리μ€νμ νΉμ ꡬν체, λ§μ΄ν¬λ‘μννΈμ CIL, μ΄λ§₯μ€, 루μ λ±μ΄ μμ΄λ€.
κ°λ
- λ°μ΄νΈμ½λ(Byte Code, Portable Code, P - Code)λ νΉμ νλμ¨μ΄κ° μλ κ°μ μ»΄ν¨ν°μμ λμκ°λ μ€ν νλ‘κ·Έλ¨μ μν μ΄μ§ ννλ²μ΄λ€.
- λ°μ΄νΈμ½λλ νΉμ νλμ¨μ΄μ λν μμ‘΄μ±μ μ€μ΄κ³ , μΈν°ν리ν λ μ¬μ΄ κ²°κ³Όλ¬Όμ μμ±νκ³ μ νλ νλ‘κ·Έλλ° μΈμ΄μ μν΄ μΆλ ₯ μ½λμ ν ννλ‘ μ¬μ©λλ€. μ»΄νμΌ λ λ°μ΄νΈμ½λλ νΉμ νλμ¨μ΄μ κΈ°κ³ μ½λλ₯Ό λ§λλ μ»΄νμΌλ¬μ μ λ ₯μΌλ‘ μ¬μ©λκ±°λ, κ°μ μ»΄ν¨ν°μμ λ°λ‘ μ€νλλ€.
- μννΈμ¨μ΄μ μν΄ μ²λ¦¬λκΈ° λλ¬Έμ λ³΄ν΅ κΈ°κ³μ΄λ³΄λ€ λ μΆμμ μ΄λ€.
- λ°μ΄νΈμ½λλ λλΆλΆμ λͺ λ Ή μ§ν©μ΄ 0κ° μ΄μμ λ§€κ° λ³μλ₯Ό κ°λ 1λ°μ΄νΈ ν¬κΈ°μ λͺ λ Ή μ½λμκΈ° λλ¬Έμ λ°μ΄νΈμ½λλΌκ³ λΆλ¦¬κ² λμλ€κ³ νλ€.
λ°μ΄νΈμ½λμ μ€ν
- λ°μ΄νΈμ½λ νλ‘κ·Έλ¨μ λ³΄ν΅ μΈν°ν리ν°κ° ν λ²μ νλμ λͺ λ Ήμ΄λ₯Ό μ½μ νμ μ€ννλ€. μ΄λ¬ν ννμ λ°μ΄νΈμ½λ μΈν°ν리ν°λ λμ μ΄μμ±μ κ°λλ€.
- λ€λ₯Έ ννλ‘μ JIT (Just In Time, JIT) μ»΄νμΌλ¬λΌ λΆλ¦¬λ μμ€ν μ μ€ν μ€μ νμμ λ°λΌ λ°μ΄νΈμ½λλ₯Ό κΈ°κ³μ΄λ‘ λ²μνλ€. μ΄ λ°©λ²μ κ°μ μ»΄ν¨ν°μ μ΄μμ±μ μμ μ§λ§, λ°μ΄νΈμ½λ μ체μ λν μ΄μμ±μ μμ§λ μλλ€.
μλ°μ λ°μ΄νΈμ½λλ?
- μλ° λ°μ΄νΈμ½λλ JVMμ΄ μ€ννλ λͺ λ Ήμ΄μ ννμ΄λ€.
- κ°κ°μ λ°μ΄νΈμ½λλ 1λ°μ΄νΈλ‘ ꡬμ±λμ§λ§, λͺ κ°μ νλΌλ―Έν°κ° μ¬μ©λλ κ²½μ°κ° μμ΄μ 1λ°μ΄νΈ μ΄μμΌλ‘ ꡬμ±λλ κ²½μ°λ μλ€.
JIT, Just In Time μ»΄νμΌλ¬
- JIT μ»΄νμΌ λλ λμ λ²μμ νλ‘κ·Έλ¨μ μ€μ μ€ννλ μμ μ κΈ°κ³μ΄λ‘ λ²μνλ μ»΄νμΌ κΈ°λ²μ΄λ€.
- νλ‘κ·Έλ¨μ μ€ννλ©΄μ μμμ½λλ₯Ό ν λ²μ ν μ€ μ© μ½μ΄μ μ€ννλ μΈν°ν리ν°, νλ‘κ·Έλ¨ μ€ν μ μ λͺ¨λ μμ μ½λλ₯Ό κΈ°κ³μ΄λ‘ λ²μν΄ μ€ννλ μ μ μ»΄νμΌ λ°©μ μ€κ°μ―€μ μμΉνλ λ°©λ²μ΄λ€.
- JIT μ»΄νμΌ λ°©μμ μΈν°νλ¦¬ν° λ°©μμ μΈμ΄ ꡬνλ€μ μ±λ₯ ν₯μμ λͺ©μ μΌλ‘ λμ νλ κ²½μ°κ° λ§λ€. λ§€λ² κ°μ μ½λλ₯Ό ν΄μνλ λμ μ²μ μ€νλ λ μΈν°ν리νΈλ₯Ό νλ©΄μ μμ£Ό μ°μ΄λ μ½λλ₯Ό μΊμ±νκ³ , μ΄νμλ μΊμ±λ μ½λλ₯Ό κ°μ Έλ€ μ°λ©΄μ μΈν°ν리ν°μ λλ¦° μ€ν μλλ₯Ό κ°μ ν μ μλ€κ³ νλ€.
- JVM μ λ°μ΄νΈμ½λλ₯Ό κΈ°κ³μ΄λ‘ λ²μν λ JIT μ»΄νμΌλ¬λ₯Ό μ¬μ©νλ€.
- JVM μ λ΄λΆμ μΌλ‘ μ΄λ€ μ½λκ° μμ£Ό μνλλμ§ μ²΄ν¬νκ³ , μ μ ν μμ μ μ»΄νμΌ νλ€κ³ νλ€.
- μμ£Ό νΈμΆλμ§ μλ μ½λλ μΈν°ν리ν μ νκ³ , μμ£Ό νΈμΆλλ μ½λλ€μ λ§€λ² λ²μνκΈ° λ³΄λ€ κΈ°κ³μ΄λ‘ λ²μν΄ μΊμ±νμ¬ μ¬μ©νλ λ°©μμ΄λΌκ³ μ 리ν μ μκ² λ€.
JVMμ ꡬμ±μμ
JVMμ ν¬κ² μΈ λΆλΆμΌλ‘ λλ μ μλ€. ν΄λμ€λ‘λ(Class Loader), μ€ν μμ§(Execution Engine), Runtime Data Area (JVM Memory)
# Class Loader, ν΄λμ€ λ‘λ
-
μλ° ν΄λμ€λ₯Ό JVMμΌλ‘ λμ λ‘λνλ€. νλ‘κ·Έλ¨ μ€ν μ€μ ν΄λμ€λ₯Ό λ‘λνλ κ²μ΄λ€.
-
ν΄λμ€λ‘λκ° λΌμ΄λΈλ¬λ¦¬λ₯Ό μμΉμν€κ³ λ΄μ©λ¬Όμ μ½μΌλ©΄μ λΌμ΄λΈλ¬λ¦¬λ€ μμ ν¬ν¨λ ν΄λμ€λ€μ μ½λ μν μ νλ€.
-
μΌλ°μ μΌλ‘ ν΄λμ€λ€μ μμ² μ ν μ°¨λ‘λ§ λ‘λλλ€. μ¦, νλ‘κ·Έλ¨μ μν΄ νΈμΆλ λκΉμ§ λ‘λνμ§ μλλ€.
-
μλ°μ λ°νμ μμ€ν μ ν΄λμ€λ‘λ λλ¬Έμ νμΌκ³Ό νμΌ μμ€ν μ λν΄ μ νμκ° μλ€.
-
3κ°μ ν΄λμ€ λ‘λλ€μ΄ μλ€.
-
λΆνΈμ€νΈλ© ν΄λμ€ λ‘λ (<JAVA_HOME>/jre/lib)
-
νμ₯ ν΄λμ€ λ‘λ((<JAVA_HOME>/jre/lib/ext, java.ext.dirs)
-
μμ€ν ν΄λμ€ λ‘λ (java.class.path μμ λ³Ό μ μλ μμ€ν ν΄λμ€ λ‘λλ CLASSPATH νκ²½λ³μμ 맀νλλ€)
-
-
μλ° ν΄λμ€ λ‘λλ μλ°λ‘ μμ±λμ΄ μκΈ° λλ¬Έμ μ¬μ©μ μ μ ν΄λμ€ λ‘λλ₯Ό μμ±νλ κ²μ΄ κ°λ₯νλ€. λͺ¨λ μλ° ν΄λμ€ λ‘λλ λΆλͺ¨ ν΄λμ€ λ‘λκ° μκ³ , μ΅μμ ν΄λμ€ λ‘λλ λΆνΈμ€νΈλ© ν΄λμ€ λ‘λμ΄λ€.
-
ν΄λμ€ λ‘λκ° ν΄λμ€λ₯Ό λ‘λν λ, λ€μκ³Ό κ°μ κ³Όμ μ κ±°μΉλ€
-
λ‘λ: ν΄λμ€λ₯Ό νμΌμμ κ°μ Έμ JVM λ©λͺ¨λ¦¬μ λ‘λνλ€.
-
κ²μ¦: μ½μ΄λ€μ ν΄λμ€κ° Java Spec κ³Ό JVM Spec μ λͺ μλ λλ‘ μ ꡬμ±λμ΄ μλμ§ κ²μ¬νλ€.
-
μ€λΉ: ν΄λμ€κ° νμλ‘ νλ λ©λͺ¨λ¦¬λ₯Ό ν λΉνλ€. ν΄λμ€μμ μ μλ νλ, λ©μλ, μΈν°νμ΄μ€λ€μ λνλ΄λ λ°μ΄ν° ꡬ쑰λ₯Ό μ€λΉνλ€.
-
λΆμ: ν΄λμ€μ μμ ν λ΄μ λͺ¨λ μ¬λ³Όλ¦ λ νΌλ°μ€λ₯Ό λ€μ΄λ νΈ λνΌλ°μ€λ₯Ό λ³κ²½νλ€.
-
μ΄κΈ°ν: ν΄λμ€ λ³μλ€μ μ μ ν κ°μΌλ‘ μ΄κΈ°ννλ€.
-
# Runtime Data Area
- Runtime Data Area λ JVMμ΄ OS μμμ μ€νλλ©΄μ ν λΉλ°λ λ©λͺ¨λ¦¬ μμμ΄λ€.
- Runtime Data Area μ λ€μκ³Ό κ°μ΄ Thread, Heap, Method Area λ‘ λλκ³ κ° μμ λ΄μμ λ μμΈν λλ μ μλ€.
- Thread
- PC Register
- JVM Stack
- Native Method Stack
- Heap
- Method Area
- Runtime Constant Pool
- Thread
- Thread λ§λ€ PC Register, JVM Stack, Native Method Stack μ΄ μμ±λλ€.
- Heap, Method Area λ λͺ¨λ Thread κ° κ³΅μ ν΄μ μ¬μ©νλ€.
Thread
PC Register
-
PC Register λ νμ¬ μν μ€μΈ JVM λͺ λ Ήμ μ£Όμλ₯Ό κ°μ§κ³ μλ€.
JVM Stack
-
Stack Frame μ΄λΌλ ꡬ쑰체λ₯Ό μ μ₯νλ μ€νμΌλ‘, JVMμ μ€μ§ JVM Stackμ Stack Frame μ μΆκ°νκ³ μ κ±°νλ λμλ§ μννλ€.
-
μμΈ λ°μ μ printStackTrace() λ±μ λ©μλλ‘ λ³΄μ¬μ£Όλ Stack Traceμ κ° λΌμΈμ νλμ Stack Frame μ νννλ€.
-
Stack Frame μ
-
JVM λ΄μμ λ©μλκ° μνλ λλ§λ€ νλμ Stack Frame μ΄ μμ±λμ΄ ν΄λΉ Theadμ JVM Stackμ μΆκ°λκ³ λ©μλκ° μ’ λ£λλ©΄ μ κ±°λλ€.
-
Stack Frameμ μ§μλ³μλ°°μ΄, νΌμ°μ°μ μ€ν, νμ¬ μ€ν μ€μΈ λ©μλκ° μν ν΄λμ€μ λ°νμ μμ νμ λν λ νΌλ°μ€λ₯Ό κ°λλ€.
-
μ§μλ³μλ°°μ΄
-
0 λΆν° μμνλ μΈλ±μ€λ₯Ό κ°μ§ λ°°μ΄
-
0 μ λ©μλκ° μν ν΄λμ€ μΈμ€ν΄μ€μ this λ νΌλ°μ€
-
1 λΆν°λ λ©μλμ μ λ¬λ νλΌλ―Έν°λ€
-
λ©μλ νλΌλ―Έν° μ΄νλΆν΄ λ©μλμ μ§μλ³μλ€
-
-
νΌμ°μ°μ μ€ν
-
λ©μλμ μ€μ μμ 곡κ°
-
λ©μλλ νΌμ°μ°μ μ€ν <-> μ§μλ³μλ°°μ΄ μ¬μ΄μμ λ°μ΄ν°λ₯Ό κ΅ννκ³ , λ€λ₯Έ λ©μλ νΈμΆ κ²°κ³Όλ₯Ό μΆκ°, μ κ±°νλ€.
-
-
-
Native Method Stack
- μλ° μΈμ μΈμ΄λ‘ μμ±λ λ€μ΄ν°λΈ μ½λλ₯Ό μν μ€νμ΄λ€. μ¦, JNI(Java Native Interface)λ₯Ό ν΅ν΄ νΈμΆνλ C/C++ λ±μ μ½λλ₯Ό μννκΈ° μν μ€νμ΄λ€.
Heap
- μΈμ€ν΄μ€λ κ°μ²΄λ₯Ό μ μ₯νλ 곡κ°μΌλ‘ κ°λΉμ§ 컬λ μ λμμ΄λ€.
- JVM μ±λ₯ λ±μ μ΄μμμ κ°μ₯ λ§μ΄ μΈκΈλλ 곡κ°μ΄λ€.
Method Area
- λͺ¨λ Thead κ° κ³΅μ νλ μμμΌλ‘ JVMμ΄ μμλ λ μμ±λλ€.
- λ€μκ³Ό κ°μ μ 보λ₯Ό 보κ΄νλ€.
- ν΄λμ€μ μΈν°νμ΄μ€μ λν Runtime Constant Pool
- νλμ λ©μλ μ 보
- Static λ³μ
- λ©μλμ λ°μ΄νΈμ½λ
Runtime Constant Pool
- Method Area μ ν¬ν¨λλ μμμ΄μ§λ§, JVM λμμμ κ°μ₯ ν΅μ¬μ μΈ μν μ μννλ€.
- κ° ν΄λμ€μ μΈν°νμ΄μ€μ μμ λΏ μλλΌ, λ©μλμ νλμ λν λͺ¨λ λ νΌλ°μ€κΉμ§ λ΄κ³ μλ ν μ΄λΈμ΄λ€.
- μ¦, μ΄λ€ λ©μλλ νλλ₯Ό μ°Έμ‘°ν λ JVMμ Runtime Constant Pool μ ν΅ν΄ μ€μ λ©λͺ¨λ¦¬ μμ μ£Όμλ₯Ό μ°Ύλλ€.
# Execution Engine, μ€ν μμ§
-
ν΄λμ€ λ‘λλ₯Ό ν΅ν΄ JVM λ΄μ Runtime Data Area μ λ°°μΉλ λ°μ΄νΈμ½λλ μ€ν μμ§μ μν΄ μ€νλλ€.
-
μ€ν μμ§μ μλ° λ°μ΄νΈμ½λλ₯Ό λͺ λ Ήμ΄ λ¨μλ‘ μ½μ΄μ μ€ννλ€.
-
μ€ν μμ§μ λ°μ΄νΈμ½λλ₯Ό JVM λ΄λΆμμ κΈ°κ³κ° μ€νν μ μλ ννλ‘ λ³κ²½νλ€. κ·Έ λ°©μμ λ€μ λ κ°μ§κ° μλ€.
-
μΈν°ν리ν°
-
λ°μ΄νΈμ½λ λͺ λ Ήμ΄λ₯Ό νλμ© μ½μ΄μ ν΄μνκ³ μ€ννλ€.
-
λ°μ΄νΈμ½λλ₯Ό νλμ© μ€ννκΈ° λλ¬Έμ ν΄μμ λΉ λ₯΄μ§λ§, μ΄ κ²°κ³Όμ μ€νμ λ리λ€λ λ¨μ μ΄ μλ€.
-
-
JIT (Just In Time) μ»΄νμΌλ¬
-
μΈν°ν리ν°μ λ¨μ μ 보μνκΈ° μν΄ λμ λμλ€.
-
μΈν°νλ¦¬ν° λ°©μμΌλ‘ μ€ννλ€κ° μ μ ν μμ μ λ°μ΄νΈμ½λ μ 체λ₯Ό μ»΄νμΌνλ€.
-
μ΄νμ λ μ΄μ μΈν°νλ¦¬ν° λ°©μμΌλ‘ μ€ννμ§ μκ³ λ€μ΄ν°λΈ μ½λλ‘ μ§μ μ€ννλ€.
-
λ€μ΄ν°λΈ μ½λλ μΊμ±νκΈ° λλ¬Έμ νλ² μ»΄νμΌλ μ½λλ κ³μ λΉ λ₯΄κ² μνλ μ μλ€.
-
JIT μ»΄νμΌλ¬κ° μ»΄νμΌ νλ κ³Όμ μ λ°μ΄νΈμ½λλ₯Ό νλμ© μΈν°ν리ν νλ κ²λ³΄λ€ ν¨μ¬ μ€λ 걸리기 λλ¬Έμ νλ²λ§ μ€νλλ μ½λλΌλ©΄ μ»΄νμΌνμ§ μκ³ μΈν°ν리ν μ νλ κ²μ΄ λ μ 리νλ€. κ·Έλ κΈ° λλ¬Έμ JIT μ»΄νμΌλ¬λ₯Ό μ¬μ©νλ JVM μ λ΄λΆμ μΌλ‘ ν΄λΉ λ©μλμ νΈμΆ λΉλ λ±μ 체ν¬ν΄ μ μ ν μμ μ μ»΄νμΌμ μννλ€.
-
-
Java μ»΄νμΌ νλ λ°©λ² & μ€ννλ λ°©λ²
- 보ν΅(κ±°μ 100%..)μ IDE λ₯Ό μ¬μ©ν΄ μ»΄νμΌνκ³ μ€ννμ§λ§ λ€μμ ν°λ―Έλμ μ¬μ©ν΄ Java λ₯Ό μ»΄νμΌνκ³ μ€ννλ λ°©λ²μ μ 리ν΄λ³΄λ €κ³ νλ€.
- JDK λ₯Ό μ€μΉνλ©΄ javac μ java κ° ν¨κ» μ€μΉλλ€.
- javac λ Java μ½λλ₯Ό μ»΄λ°μΌνλ λͺ λ Ήμ΄λ€. javac λ‘ μ»΄νμΌν .class νμΌμ java λͺ λ Ήμ΄λ‘ μ€ννλ€.
public class HelloJava { public static void main(String[]args) { System.out.println("Hello, World!"); } }
javac HelloJava.java ## HelloJava.class μμ±
java HelloJava ## Hello, World!-
Java 14 λ‘ μμ±ν java μ½λλ₯Ό Java 8 μμλ μ€ν κ°λ₯νλλ‘ νλ €κ³ νλ©΄ target μ΅μ μ μ¬μ©ν΄ μ»΄νμΌ ν΄μΌνλ€.
-
--target <release>, -target <release> Generate class files suitable for the specified Java SE release. Supported releases: 7, 8, 9, 10, 11, 12, 13, 14
javac --target 8 filename
JDKμ JREμ μ°¨μ΄
- Java Runtime Environment, JRE λ Java νλ‘κ·Έλ¨μ μ€ν μν¬ μ μλ νκ²½μ΄λ€. JRE λ§ κ°μ§κ³ λ μλ° νλ‘κ·Έλ¨μ κ°λ°ν μλ μλ€.
- Java Development Kit, JDK λ Java νλ‘κ·Έλ¨μ κ°λ°, μ€ννκΈ° μν λꡬ λ±μ΄ λͺ¨λ ν¬ν¨λμ΄ μλ€.
- JDK λ₯Ό μ€μΉνλ©΄ JREλ ν¨κ» μ€μΉλλ€.
- Java 9 λΆν° JREλ λ°λ‘ λ°°ν¬νμ§ μλλ€κ³ νλ€.
Reference
-
https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EA%B0%80%EC%83%81_%EB%A8%B8%EC%8B%A0
-
https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EB%B0%94%EC%9D%B4%ED%8A%B8%EC%BD%94%EB%93%9C
-
https://ko.wikipedia.org/wiki/%EB%B0%94%EC%9D%B4%ED%8A%B8%EC%BD%94%EB%93%9C
-
https://ko.wikipedia.org/wiki/JIT_%EC%BB%B4%ED%8C%8C%EC%9D%BC
-
https://medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2
'Hello, World π» > Java βοΈ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Live Study - Java Package (0) 2020.12.30 Live Study - Java μμ (Inheritance) (0) 2020.12.23 Live Study - Java μ Class (0) 2020.12.14 Live Study - Java μ νλ¬Έ, λ°λ³΅λ¬Έ (0) 2020.12.06 Live Study - Java κ° μ 곡νλ λ€μν μ°μ°μ (0) 2020.11.24