[JAVA] JVMμ΄λž€ λ¬΄μ—‡μΌκΉŒ?

JVMμ΄λž€?

μžλ°” 가상 λ¨Έμ‹ (Java Virtual Machine)의 μ•½μžλ‘œμ„œ, μ§μ—­ν•˜μžλ©΄ 'μžλ°”λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ 가상 기계'라고 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. '가상 기계'λŠ” SW둜 κ΅¬ν˜„λœ HWλ₯Ό λœ»ν•˜λŠ” 넓은 의미의 μš©μ–΄μ΄λ©°, 컴퓨터 μ„±λŠ₯이 ν–₯상됨에 따라 점점 더 λ§Žμ€ HW듀이 SWν™” λ˜μ–΄ 컴퓨터 μ†μœΌλ‘œ λ“€μ–΄μ˜€κ³  μžˆμŠ΅λ‹ˆλ‹€. 이와 λ§ˆμ°¬κ°€μ§€λ‘œ '가상 컴퓨터' λ˜ν•œ μ‹€μ œ 컴퓨터가 μ•„λ‹Œ μ†Œν”„νŠΈμ›¨μ–΄λ‘œ κ΅¬ν˜„λœ 컴퓨터라고 μƒκ°ν•˜λ©΄ λ©λ‹ˆλ‹€. 

 

ν•˜μ—¬νŠΌ, μžλ°”λ‘œ μž‘μ„±λœ μ—ν”Œλ¦¬μΌ€μ΄μ…˜μ€ λͺ¨λ‘ JVMμ—μ„œλ§Œ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— μžλ°” μ—ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹€ν–‰λ˜κΈ° μœ„ν•΄μ„œλŠ” λ°˜λ“œμ‹œ JVM이 ν•„μš”ν•©λ‹ˆλ‹€. 일반 μ—ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλŠ” OS만 거치고 HW둜 μ „λ‹¬λ˜λŠ”λ° λΉ„ν•΄ Javaμ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ JVM을 ν•œλ²ˆ 더 거치기 λ•Œλ¬Έμ—, 그리고 μ‹€ν–‰ μ‹œμ— 해석(Interpret)되기 λ•Œλ¬Έμ— 속도가 λŠλ¦¬λ‹€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ΅œκ·Όμ— 컴파일된 μžλ°”μ½”λ“œμΈ λ°”μ΄νŠΈμ½”λ“œλ₯Ό HW의 κΈ°κ³„μ–΄λ‘œ λ°”λ‘œ λ³€ν™˜ν•΄μ£ΌλŠ” JIT μ»΄νŒŒμΌλŸ¬μ™€ ν–₯μƒλœ μ΅œμ ν™” 기술둜 인해 μ†λ„μ˜ 격차가 많이 μ€„κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 

 

μ΄λŸ¬ν•œ 단점도 μžˆλŠ” λ°˜λ©΄μ—, Javaμ—ν”Œλ¦¬μΌ€μ΄μ…˜μ€ JVMκ³Ό μƒν˜Έμž‘μš©μ„ ν•˜κΈ° λ•Œλ¬Έμ— OS와 HW에 독립적이라 WORAκ°€ μ‹€ν˜„μ΄ κ°€λŠ₯ν•œ κ²ƒμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ, JVM은 OS와 μƒν˜Έμž‘μš©μ„ ν•˜κΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή OS에 λ§žλŠ” JVM이 ν•„μš”ν•©λ‹ˆλ‹€.

 

 

JVM의 λ©”λͺ¨λ¦¬ ꡬ쑰 

μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ 싀행이 되면. JVM은 μ‹œμŠ€ν…œμœΌλ‘œλΆ€ν„° ν”„λ‘œκ·Έλž¨μ„ μˆ˜ν–‰ν•˜λŠ”λ° ν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›κ³  JVM은 이 λ©”λͺ¨λ¦¬λ₯Ό μš©λ„μ— 따라 μ—¬λŸ¬ μ˜μ—­μœΌλ‘œ λ‚˜λˆ„μ–΄ κ΄€λ¦¬ν•˜κ²Œ λ©λ‹ˆλ‹€. κ·Έ 쀑 3가지 μ£Όμš” μ˜μ—­μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

λ©”μ„œλ“œ μ˜μ—­ 

ν”„λ‘œκ·Έλž¨ 싀행쀑 μ–΄λ–€ ν΄λž˜μŠ€κ°€ μ‚¬μš©λ˜λ©΄, JVM은 ν•΄λ‹Ή 클래슀의 ν΄λž˜μŠ€νŒŒμΌμ„ μ½μ–΄μ„œ λΆ„μ„ν•˜μ—¬ ν΄λž˜μŠ€μ— λŒ€ν•œ 정보와 κ·Έ 클래슀의 λ³€μˆ˜λ₯Ό 이곳에 μ €μž₯ν•œλ‹€.

νž™

μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜λŠ” 곡간이닀. ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 μƒμ„±λ˜λŠ” μΈμŠ€ν„΄μŠ€λ“€μ΄ λͺ¨λ‘ 여기에 μ €μž₯λœλ‹€. 즉, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ“€μ΄ μƒμ„±λ˜λŠ” 곡간이닀. 

 ν˜ΈμΆœμŠ€νƒ  

ν˜ΈμΆœμŠ€νƒμ€ λ©”μ„œλ“œμ˜ μž‘μ—…μ— ν•„μš”ν•œ λ©”λͺ¨λ¦¬ 곡간을 μ œκ³΅ν•œλ‹€. λ©”μ„œλ“œκ°€ 호좜되면, ν˜ΈμΆœμŠ€νƒμ— 호좜된 λ©”μ„œλ“œλ₯Ό μœ„ν•œ λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ήλ˜λ©°, 이 λ©”λͺ¨λ¦¬λŠ” λ©”μ„œλ“œκ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λ™μ•ˆ μ§€μ—­λ³€μˆ˜(λ§€κ°œλ³€μˆ˜ 포함)λ“€κ³Ό μ—°μ‚°μ˜ 쀑간결과 등을 μ €μž₯ν•˜λŠ”λ° μ‚¬μš©λ˜λ©°, λ©”μ„œλ“œκ°€ μž‘μ—…μ„ 마치면 ν• λ‹Ήλ˜μ—ˆλ˜ λ©”λͺ¨λ¦¬κ³΅κ°„은 λ°˜ν™˜λ˜μ–΄ μ§€μ›Œμ§„λ‹€. μŠ€νƒμ˜ μž‘λ™μ›λ¦¬μ²˜λŸΌ 맨 μœ„μ˜ λ©”μ„œλ“œκ°€ ν˜„μž¬ μ‹€ν–‰λ˜λŠ” λ©”μ„œλ“œμ΄λ©°, 맨 μœ„μ˜ λ©”μ„œλ“œκ°€ μ™„λ£Œλœ ν›„ λ©”λͺ¨λ¦¬λ₯Ό λ°˜λ‚©ν•˜κ³  κ·Έ 밑에 μžˆλŠ” λ©”μ„œλ“œκ°€ 싀행이 λœλ‹€. λ‹Ήμ—°νžˆ μ•„λž˜μ— μžˆλŠ” λ©”μ„œλ“œκ°€ μœ„μ— μžˆλŠ” λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ©”μ„œλ“œμ΄λ‹€.

JVM의 λ™μž‘κ³Όμ • 

JVM

  1. ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λ©΄ JVM은 OSλ‘œλΆ€ν„° λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›λŠ”λ‹€. μœ„μ— μ–ΈκΈ‰ν–ˆλ˜ λ©”λͺ¨λ¦¬ ꡬ쑰에 따라 μ˜μ—­μ„ λ‚˜λˆ„μ–΄ κ΄€λ¦¬ν•œλ‹€.
  2. μžλ°”μ»΄νŒŒμΌλŸ¬κ°€ μžλ°” μ†ŒμŠ€μ½”λ“œλ₯Ό 읽어듀어 μžλ°” λ°”μ΄νŠΈμ½”λ“œ(.class)둜 λ³€ν™˜μ‹œν‚¨λ‹€.
  3. Class Loaderλ₯Ό 톡해 classνŒŒμΌλ“€μ„ JVM으둜 λ‘œλ”©ν•œλ‹€.
  4. λ‘œλ”©λœ classνŒŒμΌλ“€μ€ Execution engine을 톡해 ν•΄μ„λœλ‹€.
  5. ν•΄μ„λœ λ°”μ΄νŠΈμ½”λ“œλŠ” Runtime Data Area에 λ°°μΉ˜λ˜μ–΄ μ‹€μ§ˆμ μΈ μˆ˜ν–‰μ΄ μ΄λ£¨μ–΄μ§€κ²Œ λœλ‹€. 
  6. μœ„μ˜ μ‹€ν–‰κ³Όμ • μ†μ—μ„œ JVM은 ν•„μš”μ— 따라 Thread Synchronization, GC같은 관리 μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.