Study 1. JVM πŸ™‚

정지은·2023λ…„ 1μ›” 3일
0

JAVAλ₯Ό μž‘μ•„~

λͺ©λ‘ 보기
1/15
post-thumbnail

Today's study 🧐


  1. JVM
  2. 컴파일&μ‹€ν–‰ν•˜λŠ” 방법
  3. λ°”μ΄νŠΈμ½”λ“œ
  4. JVM의 ꡬ성 μš”μ†Œ
  5. JIT 컴파일러
  6. JDK vs JRE
  7. Stop's Question

1. JVM


Java Virtual Machine 의 μ€„μž„λ§

πŸ’‘ JVM은 μžλ°” 가상 λ¨Έμ‹ μœΌλ‘œ OS와 JAVA μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ€‘κ°œμž 역할을 ν•˜μ—¬ ν•˜λ‚˜μ˜ λ°”μ΄νŠΈ μ½”λ“œ(.class)둜 λͺ¨λ“  ν”Œλž«νΌμ—μ„œ λ™μž‘ν•˜λ„λ‘ ν•  수 μžˆλ‹€.

C와 Javaλ₯Ό λΉ„κ΅ν•΄λ³΄μž.

C


C μ–Έμ–΄μ˜ 경우 Test.c μ½”λ“œλ₯Ό 각 OS에 μ‹€ν–‰μ‹œν‚€κΈ° μœ„ν•΄μ„œλŠ” μ»΄νŒŒμΌμ„ 각 OS 맞게 λ”°λ‘œ ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

Java


ν•˜μ§€λ§Œ Java의 κ²½μš°λŠ” Test.javaλ₯Ό μ»΄νŒŒμΌν•˜μ˜€μ„ λ•Œ μƒμ„±λ˜λŠ” Test.class νŒŒμΌμ„ 각 OS의 JVM을 톡해 λ°”λ‘œ μ‹€ν–‰νŒŒμΌλ‘œ λ°”κΏ” μ£ΌκΈ° λ•Œλ¬Έμ— μ»΄νŒŒμΌμ„ λ”°λ‘œ ν•  ν•„μš”κ°€ μ—†λŠ” 것이닀.

2. 컴파일&μ‹€ν–‰ν•˜λŠ” 방법


μ‹€μ œλ‘œ 컴파일 & 싀행을 ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ–΄λ–»κ²Œ ν•΄μ•Όν•˜λŠ”μ§€ μ•Œμ•„λ³΄μž. ( β€» 컴파일과 싀행은 ν•΄λ‹Ή java파일이 μžˆλŠ” μœ„μΉ˜μ—μ„œ μ§„ν–‰ν•΄μ•Ό ν•œλ‹€. )

  1. Java Source codeλ₯Ό μž‘μ„±ν•œλ‹€. (Test.java 생성)
  2. 컴파일 : Java Compilerκ°€ 이λ₯Ό μ»΄νŒŒμΌν•˜μ—¬ Test.classνŒŒμΌμ„ μƒμ„±ν•œλ‹€. μ΄λŠ” μžλ°” λ°”μ΄νŠΈ μ½”λ“œλ‘œ μ»΄ν“¨ν„°λŠ” 읽을 수 μ—†κ³  JVM이 읽을 수 μžˆλŠ” μ½”λ“œμ΄λ‹€. (컴파일러개둠 μ‹œκ°„μ— λ°°μ› λ˜ μ–΄νœ˜λΆ„μ„->ꡬ문뢄석->μ˜λ―ΈλΆ„μ„->λ°”μ΄νŠΈμ½”λ“œ 의 과정이 μˆ˜ν–‰λ˜λŠ” 것이닀.)
    $javac Test.java
  3. Test.class νŒŒμΌμ„ JVM의 Class Loaderμ—κ²Œ μ „λ‹¬ν•œλ‹€.
  1. Class LoaderλŠ” λŸ°νƒ€μž„ λ°μ΄ν„°μ˜μ—­, 즉 JVM λ©”λͺ¨λ¦¬μ— λ°”μ΄νŠΈ μ½”λ“œλ“€μ„ μ˜¬λ¦°λ‹€.
  2. μ‹€ν–‰ : μ΄λ ‡κ²Œ 올라온 λ°”μ΄νŠΈ μ½”λ“œλ“€μ„ 싀행엔진이 ν•˜λ‚˜μ”© 가져와 μ‹€ν–‰ν•œλ‹€.
    $java Test

3. λ°”μ΄νŠΈμ½”λ“œ


πŸ’‘ Java bytecodeλŠ” JVM이 이해할 수 μžˆλŠ” μ–Έμ–΄λ‘œ λ³€ν™˜λœ Java Source codeλ₯Ό λ§ν•œλ‹€. μžλ°” μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ λ³€ν™˜λ˜λŠ” μ½”λ“œμ˜ λͺ…λ Ήμ–΄ 크기가 1 byteλΌμ„œ λ°”μ΄νŠΈμ½”λ“œλΌκ³  뢈리고 μžˆλ‹€.



4. JVM의 ꡬ성 μš”μ†Œ


πŸ’‘ JVM은 크게 3κ°€μ§€ (클래슀 λ‘œλ”, λ©”λͺ¨λ¦¬, μ‹€ν–‰ μ—”μ§„)둜 κ΅¬μ„±λœλ‹€.


1) 클래슀 λ‘œλ” (Class Loader)

JVM λ‚΄λ‘œ Test.class νŒŒμΌμ„ λ‘œλ“œν•˜μ—¬ 링크λ₯Ό 톡해 λ°°μΉ˜ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.

μžλ°”λŠ” λ™μ λ‘œλ”©μ„ μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ— ν•œλ²ˆμ— λ©”λͺ¨λ¦¬μ˜ λͺ¨λ“  클래슀λ₯Ό λ‘œλ“œν•˜μ§€ μ•Šκ³ , ν•„μš”ν•œ μˆœκ°„μ— ν•„μš”ν•œ 클래슀λ₯Ό μ°Ύμ•„ λ©”λͺ¨λ¦¬μ— λ‘œλ”©ν•΄μ£Όκ²Œ λ˜λŠ”λ° 이 역할을 Class Loaderκ°€ ν•˜κ²Œ λœλ‹€.


2) λ©”λͺ¨λ¦¬

- νž™
μΈμŠ€ν„΄μŠ€ν™” 된 λͺ¨λ“  클래슀의 μΈμŠ€ν„΄μŠ€μ™€ λ°°μ—΄, 객체λ₯Ό μ €μž₯ν•œλ‹€.

λͺ¨λ“  JVM μŠ€λ ˆλ“œμ— κ³΅μœ λ˜λŠ” κ³΅μœ μžμ›μœΌλ‘œ Garbage Collector만 νž™μ˜ λ©”λͺ¨λ¦¬μ— λŒ€ν•œ 회수 κΆŒν•œμ΄ μžˆλ‹€.

Garbage Collector : νž™ λ©”λͺ¨λ¦¬ μ˜μ—­μ— μƒμ„±λœ 객체듀 μ€‘μ—μ„œ μ°Έμ‘°λ˜μ§€ μ•Šμ€ 객체듀을 νƒμƒ‰ν•œ ν›„ μ œκ±°ν•˜λŠ” 역할을 ν•œλ‹€. λ©”λͺ¨λ¦¬ 관리λ₯Ό μžλ™μœΌλ‘œ ν•΄μ£Όκ³  μ–Έμ œ 일을 μˆ˜ν–‰ν•˜λŠ”μ§€λŠ” μ•Œ 수 μ—†λ‹€.

- λ©”μ†Œλ“œ
λͺ¨λ“  μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•˜λŠ” μ˜μ—­μœΌλ‘œ 클래슀, μΈν„°νŽ˜μ΄μŠ€, λ©”μ†Œλ“œ, ν•„λ“œ, Static λ³€μˆ˜ λ“±μ˜ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λ³΄κ΄€ν•œλ‹€.

- PC λ ˆμ§€μŠ€ν„°
μŠ€λ ˆλ“œκ°€ μ‹œμž‘λ  λ•Œ μƒμ„±λ˜λŠ” κ³΅κ°„μœΌλ‘œ μŠ€λ ˆλ“œλ§ˆλ‹€ ν•˜λ‚˜μ”© μ‘΄μž¬ν•œλ‹€. 연산을 μœ„ν•΄ ν•„μš”ν•œ ν”Όμ—°μ‚°μžλ₯Ό μž„μ‹œλ‘œ μ €μž₯ν•˜κΈ°μœ„ν•œ μš©λ„λ‘œ μ‚¬μš©ν•œλ‹€.

- μŠ€νƒ (JVM Stack)
λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ 각각의 μŠ€νƒ ν”„λ ˆμž„μ΄ μƒμ„±λ˜κ³  λ©”μ„œλ“œ μ•ˆμ—μ„œ μ‚¬μš©λ˜λŠ” κ°’, λ§€κ°œλ³€μˆ˜, μ§€μ—­λ³€μˆ˜, 리턴 κ°’, μ—°μ‚°μ‹œ μΌμ–΄λ‚˜λŠ” 값듀이 μž„μ‹œλ‘œ μ €μž₯λœλ‹€. λ©”μ„œλ“œ μˆ˜ν–‰μ΄ λλ‚˜λ©΄ ν”„λ ˆμž„λ³„λ‘œ μ‚­μ œλ˜κ²Œ λœλ‹€.

- λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œ μŠ€νƒ (Native Method stack)
JVM의 μŠ€νƒμ΄ μ•„λ‹Œ C μŠ€νƒμ„ κ°€λ₯΄ν‚€λ©° μžλ°”κ°€ μ•„λ‹Œ λ‹€λ₯Έ μ–Έμ–΄λ‘œ μž‘μ„±λœ λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œλ₯Ό μ§€μ›ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” μŠ€νƒμ΄λ‹€.


3) μ‹€ν–‰ μ—”μ§„ (Execution Engine)

- μžλ°” 인터프리터 (interpreter)

μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ λ³€ν™˜λœ λ°”μ΄νŠΈ μ½”λ“œ(Test.class)λ₯Ό ν•œμ€„μ”© κΈ°κ³„μ–΄λ‘œ ν•΄μ„ν•˜λŠ” 역할을 ν•œλ‹€.

μ›λž˜λŠ” JVMμ—μ„œ 인터프리터 λ°©μ‹λ§Œ μ‚¬μš©ν–ˆμ§€λ§Œ μ„±λŠ₯ 이슈둜 인해 JIT 컴파일러λ₯Ό μΆ”κ°€ν•˜μ˜€λ‹€. μ†ŒμŠ€μ½”λ“œλ₯Ό λΉŒλ“œν•  λ•ŒλŠ” 아무것도 ν•˜μ§€ μ•Šλ‹€κ°€ λŸ°νƒ€μž„μ‹œμ— ν•œμ€„μ”© 읽으며 λ³€ν™˜ν•œλ‹€.

- JIT 컴파일러
μ΄λŠ” λ‹€μŒμœΌλ‘œ λ„˜μ–΄κ°€ μžμ„Ένžˆ μ‚΄νŽ΄λ³΄κ² λ‹€.



5. JIT 컴파일러


Just In Time

πŸ’‘ JIT μ»΄νŒŒμΌλŸ¬λŠ” μ‹€ν–‰ μ‹œμ μ—μ„œ 인터프리터 λ°©μ‹μœΌλ‘œ 기계어 μ½”λ“œλ₯Ό 생성할 λ•Œ 컴파일 μž„κ³„μΉ˜λ₯Ό λ„˜μ–΄κ°„ λ©”μ†Œλ“œκ°€ 생기면 이λ₯Ό κΈ°κ³„μ–΄λ‘œ μΊμ‹±ν•˜μ—¬ 두고 μΆ”ν›„ λ‹€μ‹œ ν˜ΈμΆœλ˜μ—ˆμ„λ•Œ 이λ₯Ό μ°Έμ‘°ν•œλ‹€.

컴파일 μž„κ³„μΉ˜ (Compile Threshold)
μž„κ³„μΉ˜λŠ” λ©”μ„œλ“œκ°€ 호좜된 νšŸμˆ˜μ™€ λ©”μ„œλ“œμ˜ 루프λ₯Ό λΉ μ Έ λ‚˜μ˜€κΈ°κΉŒμ§€ 돈 횟수λ₯Ό 기반으둜 ν•œλ‹€. μ–Όλ§ˆλ‚˜ 자주 μ½”λ“œκ°€ μ‹€ν–‰λ˜μ—ˆλŠ”κ°€ 이닀.
일정 횟수만큼 μ‹€ν–‰λ˜λ©΄ 컴파일 μž„κ³„μΉ˜μ— λ„λ‹¬ν•˜κ²Œ 되고 λ„λ‹¬ν•œ μ½”λ“œλ₯Ό λŒ€μƒμœΌλ‘œ JIT 컴파일러λ₯Ό 톡해 캐싱을 μˆ˜ν–‰ν•˜κ²Œ λœλ‹€.

컴파일러만 μ‚¬μš©ν•˜λŠ” C언어와 μΈν„°ν”„λ¦¬ν„°λ§Œ μ‚¬μš©ν•˜λŠ” Python에 λΉ„ν•΄ μ•ˆκ·Έλž˜λ„ 느린데 JVMμ—μ„œκΉŒμ§€ λ°”μ΄νŠΈμ½”λ“œλ₯Ό μΈν„°ν”„λ¦¬ν„°λ‘œ ν•œμ€„μ”© λ³€ν™˜ν•˜λ‹ˆ JIT 컴파일러λ₯Ό λ„μž…ν•˜μ—¬ JVM의 속도λ₯Ό κ°œμ„ ν•œ 것이닀.



6. JDK vs JRE


JDK (Java Development Kit) : 읽기

JDKλŠ” λ§κ·ΈλŒ€λ‘œ Java κ°œλ°œμ„ μœ„ν•΄ ν•„μš”ν•œ 도ꡬ듀이닀. JDK의 κ°œλ°œλ„κ΅¬λ“€ 쀑 ν•˜λ‚˜κ°€ JRE이고, 이 JREκ°€ JVM을 κ°€μ§€κ³  μžˆλŠ” ν˜•μ‹μ΄λ‹€.

JRE (Java Runtime Environment) : 읽기&μ“°κΈ°

JREλŠ” μžλ°” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚¬ 수 μžˆλŠ” μžλ°” ν™˜κ²½μ„ λ§ν•œλ‹€. μžλ°” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚€κΈ° μœ„ν•΄ λ°˜λ“œμ‹œ μžˆμ–΄μ•Ό ν•˜λŠ” 것이닀.

πŸ’‘ μœ„μ˜ 사진을 보면 JDK 쀑 JAVACκ°€ 있고 JRE 쀑 JAVAκ°€ μžˆλ‹€. 이 κΈ€μ˜ 2λ²ˆμ—μ„œ Test.javaλ₯Ό μ»΄νŒŒμΌν•˜μ˜€μ„λ•Œ μ‚¬μš©ν–ˆλ˜ $javac와 이λ₯Ό μ‹€ν–‰ν• λ•Œ μ‚¬μš©ν–ˆλ˜ $javaκ°€ λ°”λ‘œ 이것이닀. JDK의 κ°œλ°œλ„κ΅¬λ“€λ‘œ Test.javaλ₯Ό μž‘μ„±ν•˜κ³  이λ₯Ό javacλ₯Ό μ‚¬μš©ν•΄ λ°”μ΄νŠΈμ½”λ“œλ‘œ λ³€ν™˜ν•œλ‹€. 이 λ°”μ΄νŠΈμ½”λ“œλ₯Ό JRE의 java와 JVM을 μ‚¬μš©ν•΄ 읽고 κ²€μ¦ν•œ ν›„ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚€λŠ” 것이닀.



7. Stop's Question πŸ€·β€β™€οΈ


Q1. JVM은 JAVAμ–Έμ–΄μ—μ„œλ§Œ μ‚¬μš©ν•œλ‹€?
πŸ™…β€β™€οΈ JVM을 μ‚¬μš©ν•˜λŠ” λŒ€ν‘œμ μΈ μ–Έμ–΄λŠ” 슀칼라, JRUBY, μ½”ν‹€λ¦°, JAVAκ°€ μžˆλ‹€. ( JAVA와 코틀린을 ν˜Όμš©ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλŠ” μ΄μœ κ°€ 이 λ•Œλ¬ΈμΈ 것 κ°™λ‹€. )

Q2. μΈν„°ν”„λ¦¬ν„°λž‘ JIT 컴파일러λ₯Ό μ™œ κ΅¬λΆ„ν•΄μ„œ 써?
μ†ŒμŠ€ μ½”λ“œ ν•œμ€„μ„ λ³€ν™˜ν•΄ λ°”λ‘œ μ‹€ν–‰ν•˜λŠ” 인터프리터가 μ‹€ν–‰μ‹œμž‘ μ‹œκ°„μ€ μ»΄νŒŒμΌλŸ¬λ³΄λ‹€ λΉ λ₯΄λ‹€. ν•˜μ§€λ§Œ 전체 μ‹€ν–‰ μ†λ„λŠ” μ»΄νŒŒμΌλŸ¬κ°€ 훨씬 λΉ λ₯΄λ‹€. κ·Έλž˜μ„œ μžμ£Όμ“°μ§€μ•ŠλŠ” μ½”λ“œλŠ” line-by-line 싀행이 λΉ λ₯΄κ³  μžμ£Όμ“°λŠ” λ©”μ†Œλ“œλŠ” 전체λ₯Ό μ‹€ν–‰ν•΄ λ†“λŠ” JIT 컴파일러λ₯Ό μ‚¬μš©ν•΄ μ €μž₯ν•΄λ†“λŠ” 것이닀.

Q3. 기계어 vs λ°”μ΄νŠΈ μ½”λ“œ vs λ°”μ΄λ„ˆλ¦¬ μ½”λ“œ

  • λ°”μ΄λ„ˆλ¦¬ μ½”λ“œ : 컴퓨터(CPU)κ°€ 인식할 수 μžˆλŠ” 0κ³Ό 1둜 κ΅¬μ„±λœ μ΄μ§„μ½”λ“œ
  • λ°”μ΄νŠΈ μ½”λ“œ : 가상 머신이 이해할 수 μžˆλŠ” μ–Έμ–΄λ‘œ λ°”μ΄λ„ˆλ¦¬ μ½”λ“œλ‘œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€.
  • 기계어 : λ°”μ΄λ„ˆλ¦¬μ½”λ“œλ‘œμ΄λ£¨μ–΄μ ΈμžˆλŠ” CPU μ œμ‘°μ‚¬μ—μ„œ CPUλ₯Ό λ§Œλ“€ λ•Œ ν•΄λ‹Ή CPUμ—μ„œ μ‚¬μš©ν•˜λŠ” λͺ…λ Ήμ–΄ 집합을 κ³΅κ°œν•˜λŠ”λ° 이걸 기계어라고 ν•œλ‹€. CPUκ°€ λ‹€λ₯΄λ©΄ 기계어가 달라진닀.

λ³Έ μŠ€ν„°λ””λŠ” 2020 λ°±κΈ°μ„ λ‹˜μ˜ μžλ°”μŠ€ν„°λ””μ˜ μ»€λ¦¬ν˜λŸΌμ„ μ°Έκ³ ν•˜μ—¬ μ§„ν–‰ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

0개의 λŒ“κΈ€