Java

(Java)JVM λ©”λͺ¨λ¦¬ ꡬ쑰

odong2 2022. 5. 6. 17:32

πŸ“ŒJVMμ΄λž€?

JVM은 'Java virtual machine'을 쀄인 말둜 'μžλ°”λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•œ 가상 λ¨Έμ‹ ' 즉 '가상 컴퓨터'라고 ν•  수 μžˆλ‹€.
'가상 μ»΄ν“¨ν„°'λŠ” μ‹€μ œ ν•˜λ“œμ›¨μ–΄κ°€ μ•„λ‹Œ μ†Œν”„νŠΈμ›¨μ–΄λ‘œ κ΅¬ν˜„λœ μ»΄ν“¨ν„°λΌλŠ” λœ»μœΌλ‘œ μ»΄ν“¨ν„° μ†μ˜ μ»΄ν“¨ν„°λΌκ³  ν•  μˆ˜ μžˆλ‹€.
μžλ°”λ‘œ μž‘μ„±λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ΄ κ°€μƒ μ»΄ν“¨ν„°(JVM)μ—μ„œλ§Œ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ—, μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹€ν–‰λ˜κΈ° μœ„ν•΄μ„œλŠ” λ°˜λ“œμ‹œ JVM이 ν•„μš”ν•˜λ‹€.

Java와 Cμ–Έμ–΄μ˜ 비ꡐ

 

μœ„μ˜ κ·Έλ¦Όμ—μ„œ μ²˜λŸΌ Cμ–Έμ–΄ κ°™μ€ κ²½μš° OS만 κ±°μΉ˜κ³  ν•˜λ“œμ›¨μ–΄λ‘œ λ°”λ‘œ μ „λ‹¬λ˜λŠ” κ²ƒμ— λ°˜ν•΄ JAVAλŠ” JVM을 ν•œλ²ˆ λ” κ±°μΉ˜λŠ” κ²ƒμ„ λ³Ό μˆ˜ μžˆλ‹€.


그리고 ν•˜λ“œμ›¨μ–΄μ— λ§žκ²Œ μ™„μ „νžˆ μ»΄νŒŒμΌλœ μƒνƒœκ°€ μ•„λ‹ˆκ³  μ‹€ν–‰ μ‹œ ν•΄μ„(interpret)되기 λ•Œλ¬Έμ— μ†λ„κ°€ λŠλ¦¬λ‹€λŠ” λ‹¨μ μ„ κ°€μ§€κ³  μžˆλ‹€.


κ·ΈλŸ¬λ‚˜ μš”μ¦˜μ—” λ°”μ΄νŠΈμ½”λ“œ(컴파일된 μžλ°” μ½”λ“œ)λ₯Ό ν•˜λ“œμ›¨μ–΄μ˜ κΈ°κ³„μ–΄λ‘œ λ°”λ‘œ λ³€ν™˜ν•΄μ£ΌλŠ” JIT μ»΄νŒŒμΌλŸ¬μ™€ ν–₯μƒλœ μ΅œμ ν™” κΈ°μˆ μ΄ μ μš©λ˜μ–΄μ„œ μ†λ„μ˜ κ²©μ°¨λ₯Ό λ§Žμ΄ μ€„μ˜€λ‹€.

 

Java compiler

 

두 λ²ˆμ§Έ μœ„μ˜ κ·Έλ¦Όμ€ μžλ°”κ°€ OS에 λ…립적인 νŠΉμ§•μ„ κ°–κ³  μžˆλ‹€λŠ” κ²ƒμ„ λ³΄μ—¬μ£ΌλŠ” κ·Έλ¦Όμ΄λ‹€.

일반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ OS와 λ°”λ‘œ λ§žλ‹Ώμ•„ μžˆκΈ° λ•Œλ¬Έμ— OSμ—μ„œ μ‹€ν–‰μ‹œν‚€κΈ° μœ„ν•΄μ„œλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ·Έ OS에 λ§žκ²Œ λ³€κ²½ν•΄μ•Ό ν•œλ‹€. μ¦‰ OS μ’…μ†μ μ΄λΌλŠ” λ‹¨μ μ„ κ°€μ§€κ³  μžˆλ‹€.

ν•˜μ§€λ§Œ μžλ°”μ˜ κ²½μš° μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό OS의 μ€‘κ°„ λ‹¨κ³„μ—μ„œ μ†Œν†΅ν•˜λŠ” JVM이 μžˆκΈ° λ•Œλ¬Έμ— λ‹€λ₯Έ OSμ—μ„œλ„ ν˜„μž¬ OS에 λ§žλŠ” JVM을 λ‹€μš΄λ‘œλ“œν•œλ‹€λ©΄ ν”„λ‘œκ·Έλž¨μ˜ λ³€κ²½ 없이 μ‹€ν–‰μ΄ κ°€λŠ₯ν•˜λ‹€. μ¦‰ OS에 λ…립적인 μž₯점을 κ°€μ§€κ³  μžˆλ‹€.

μš”μ•½ν•˜λ©΄ JVMμ΄λž€ '가상 λ¨Έμ‹ '으둜 λ‚΄λΆ€μ μΈ λ³΅μž‘ν•œ κ΅¬μ‘°λ‘œ μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λŠ” μ£Όμ²΄λΌκ³  ν•  μˆ˜ μžˆλ‹€.


πŸ“ŒJVM λ©”λͺ¨λ¦¬ ꡬ쑰

μžλ°”μ—μ„œμ˜ μ „체적인 μ‹€ν–‰ 과정은 μ•„λž˜μ˜ μ΄λ―Έμ§€μ™€ κ°™λ‹€.

μ΄μ œλΆ€ν„° JVM의 ꡬ체적인 싀행과정을 μ•Œμ•„λ³΄μž

 

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

μš°μ„  μ†ŒμŠ€νŒŒμΌμ„ μž‘μ„±ν•˜κ³  μ €μž₯ν•˜κ²Œλ˜λ©΄ Java Compiler에 μ˜ν•΄ .java의 μ†ŒμŠ€νŒŒμΌμ΄ JVM이 μ΄ν•΄ν•  μˆ˜ μžˆλŠ” λ°”μ΄νŠΈμ½”λ“œ(Bytecode)둜 μ΄λ£¨μ–΄μ§„ .class파일둜 μ €μž₯λœλ‹€.

 

1) Class Loader

λ°”μ΄νŠΈμ½”λ“œλ‘œ μž‘μ„±λœ classνŒŒμΌμ„ JVMλ‚΄λ‘œ λ‘œλ“œν•˜λŠ” μ—­ν• μ„ ν•˜κ³ , μ΄λ ‡κ²Œ λ‘œλ”©λœ class듀은 Runtime Data Area λ°°μΉ˜λœλ‹€. (μ΄λŸ¬ν•œ λ‘œλ“œ 과정은 μš΄μ˜μ²΄μ œκ°€ λ‹΄λ‹Ήν•œλ‹€)

2) Execution Engine

Class Loader에 μ˜ν•΄ λ©”λͺ¨λ¦¬μ— 적재된 클래슀의 Bytecode듀을 BinaryCode 즉 κΈ°κ³„μ–΄λ‘œ λ³€κ²½ν•˜κ³  λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ μ‹€ν–‰ν•œλ‹€.
λͺ…λ Ήμ–΄μ˜ μ‹€ν–‰μ€ μœ„μ—μ„œ μ–ΈκΈ‰ν•œ 바와 κ°™μ΄ μΈν„°ν”„리터(Interpreter) 방식 λ˜λŠ” JIT(Just-In-Time) 컴파일러 λ°©μ‹μ΄ μžˆλ‹€. JIT λ°©μ‹μ˜ κ²½μš° λ°”μ΄νŠΈμ½”λ“œλ₯Ό κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•˜κΈ° λ•Œλ¬Έμ— λΉ λ₯΄λ‹€λŠ” μž₯점이 μžˆμ§€λ§Œ λΉ„μš©μ΄ λ°œμƒν•œλ‹€λŠ” λ‹¨μ μ΄ μžˆλ‹€.
μΈν„°ν”„λ¦¬νŠΈ λ°©μ‹μ€ μ‹€ν–‰ μ€‘ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ₯Ό μ½μ–΄κ°€λ©΄μ„œ ν•΄λ‹Ή κΈ°λŠ₯에 λŒ€μ‘ν•˜λŠ” κΈ°κ³„μ–΄ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° λ•Œλ¬Έμ— λŠλ¦¬λ‹€λŠ” λ‹¨μ μ΄ μžˆλ‹€.

3) Garbage Collector

Garbage Collector(GC)λŠ” Heap λ©”λͺ¨λ¦¬ μ˜μ—­μ— μƒμ„±(적재)된 κ°μ²΄λ“€ μ€‘에 μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” κ°μ²΄λ“€μ„ νƒμƒ‰ ν›„ μ œκ±°ν•˜λŠ” μ—­ν• μ„ ν•œλ‹€.

GCκ°€ μ—­ν• μ„ ν•˜λŠ” μ‹œκ°„은 μ •ν™•νžˆ μ–Έμ œμΈμ§€ μ•Œ μˆ˜ μ—†λ‹€.

4) Runtime Data Area

JVM의 λ©”λͺ¨λ¦¬ μ˜μ—­μœΌλ‘œ μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  λ•Œ μ‚¬μš©λ˜λŠ” λ°μ΄ν„°λ“€μ„ μ μž¬ν•˜λŠ” μ˜μ—­μ΄λ‹€.

이 μ˜μ—­μ€ ν¬κ²Œ μ•„λž˜μ™€ κ°™μ΄ λ‚˜λ‰œλ‹€.

 

 4-1) Method area

  • Class area, Method area, Static area라고 λΆˆλ¦°λ‹€.
  • ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œ ν•„μš”ν•œ ν΄λž˜μŠ€κ°€ μΈμŠ€ν„΄μŠ€μ˜ 생성과 상관없이 jvm λ©”λͺ¨λ¦¬ 상에 λ‘œλ”©λœλ‹€. jvm λ©”λͺ¨λ¦¬μ— λ‘œλ”©μ΄ 되면 λ©”μ„œλ“œ μ˜μ—­μ— 클래슀의 정보듀이 μ˜¬λΌκ°€κ²Œ λœλ‹€.
  • Static μ˜μ—­μ˜ μž₯점은 ν”„λ‘œκ·Έλž¨ μ’…λ£Œ μ‹œκΉŒμ§€ ν΄λž˜μŠ€μ— λŒ€ν•œ 정보가 λ©”λͺ¨λ¦¬μ— μƒμ£Όν•˜κ³  있기 λ•Œλ¬Έμ— μ–΄λ””μ„œλ“  μ‚¬μš© κ°€λŠ₯ν•˜λ‹€λŠ” 것이닀. 단점은 λ¬΄λΆ„λ³„ν•˜κ²Œ Static을 λ‚¨λ°œν•˜λ©΄ λ©”λͺ¨λ¦¬λ₯Ό 많이 μž‘μ•„λ¨Ήκ²Œ λœλ‹€.
  • λͺ¨λ“  μ“°λ ˆλ“œκ°€ κ³΅μœ ν•˜λŠ” μ˜μ—­μ΄λ‹€.
  • λ©”μ„œλ“œ 정보 즉 λ©”μ„œλ“œ 이름, 리턴 νƒ€μž…, λ§€κ°œλ³€μˆ˜, μ ‘κ·Όμ œμ–΄μž λ“±μ˜ 정보 μ €μž₯
  • μƒμˆ˜ ν’€(Constant pool)
      1) Typeμ—μ„œ μ‚¬μš©λœ μƒμˆ˜λ₯Ό μ €μž₯ν•˜λŠ” κ³³
      2) λ¬Έμž μƒμˆ˜, νƒ€μž…, ν•„λ“œ, Method reference도 μƒμˆ˜ ν’€μ— μ €μž₯
      3) final class λ³€μˆ˜μ˜ κ²½μš°λ„ μƒμˆ˜ 풀에 κ°’ 볡사
  • Static λ³€μˆ˜ μ €μž₯

4-2) Heap area

  • Newμ—°μ‚°μžλ₯Ό 톡해 μƒμ„±ν•œ 객체, λ˜λŠ” μΈμŠ€ν„΄μŠ€μ™€ 배열을 μ €μž₯ν•˜λŠ” κ³΅κ°„μœΌλ‘œ JVM이   κ΄€λ¦¬ν•˜λŠ” μ˜μ—­μ΄λ‹€.
  • νž™ μ˜μ—­μ— μƒμ„±λœ 객체 및 배열은 μŠ€νƒ μ˜μ—­μ˜ λ³€μˆ˜λ‚˜ λ‹€λ₯Έ 객체의 ν•„λ“œμ—μ„œ μ°Έμ‘°ν•œλ‹€.
  • λͺ¨λ“  μ“°λ ˆλ“œμ—μ„œ κ³΅μœ ν•˜λŠ” μ˜μ—­μ΄λ‹€.
  • 객체가 더 이상 쓰이지 μ•Šκ±°λ‚˜, μ°Έμ‘°κ°€ λŠμ–΄μ§„ 객체의 경우 Garbage Collector에   μ˜ν•΄ 이 μ˜μ—­μ—μ„œ μ œκ±°λœλ‹€.

4-3) Stack area 

  • λ©”μ„œλ“œκ°€ 호좜되면 μˆ˜ν–‰μ— ν•„μš”ν•œ 만큼의 λ©”λͺ¨λ¦¬λ₯Ό μŠ€νƒμ— ν• λ‹Ήλ°›λŠ”λ‹€
  • ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λŠ” 이 λ©”μ„œλ“œκ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λ™μ•ˆ λ©”μ„œλ“œ 정보, μ§€μ—­λ³€μˆ˜(λ§€κ°œλ³€μˆ˜ 포함)λ“€κ³Ό μ—°μ‚°μ˜ 쀑간 κ²°κ³Ό 등을 μ €μž₯ν•˜λŠ” 데 μ‚¬μš©λœλ‹€.
  • κΈ°λ³Έν˜• λ³€μˆ˜λŠ” μŠ€νƒ μ˜μ—­μ—μ„œ 직접 값을 κ°€μ§„λ‹€.
  • μ°Έμ‘°ν˜• λ³€μˆ˜λŠ” 객체의 νž™ μ˜μ—­μ˜ 객체의 μ£Όμ†Œ 값을 κ°€μ§€κ³  νž™ μ˜μ—­μ— 객체λ₯Ό κ°€λ¦¬ν‚€κ²Œ λœλ‹€.
  • Last In First Out (LIFO) ꡬ쑰둜 호좜 μŠ€νƒμ˜ 제일 μœ„μ— μžˆλŠ” λ©”μ„œλ“œκ°€ ν˜„μž¬ μ‹€ν–‰ 쀑인 λ©”μ„œλ“œμ΄κ³  μ•„λž˜μ— μžˆλŠ” λ©”μ„œλ“œκ°€ λ°”λ‘œ μœ„μ˜ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ λ©”μ„œλ“œμ΄λ‹€.

4-4) PC Register

  • Thread(μ“°λ ˆλ“œ)κ°€ 생성될 λ•Œλ§ˆλ‹€ μƒμ„±λ˜λŠ” μ˜μ—­μœΌλ‘œ Program Counter 즉, ν˜„μž¬   μ“°λ ˆλ“œκ°€ μ‹€ν–‰λ˜λŠ” λΆ€λΆ„μ˜ μ£Όμ†Œμ™€ λͺ…령을 μ €μž₯ν•˜κ³  μžˆλŠ” μ˜μ—­μ΄λ‹€. (*CPU의 λ ˆμ§€μŠ€ν„°μ™€ 닀름)
  • 이것을 μ΄μš©ν•΄μ„œ μ“°λ ˆλ“œλ₯Ό λŒμ•„κ°€λ©΄μ„œ μˆ˜ν–‰ν•  수 있게 ν•œλ‹€.

4-5) Native method stack

  • μžλ°” μ™Έ μ–Έμ–΄λ‘œ μž‘μ„±λœ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό μœ„ν•œ λ©”λͺ¨λ¦¬μ΄λ‹€.

 


πŸ“Reference

https://jeong-pro.tistory.com/148

 

JVM ꡬ쑰와 μžλ°” λŸ°νƒ€μž„ λ©”λͺ¨λ¦¬ ꡬ쑰 (μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 싀행될 λ•Œ JVMμ—μ„œ μΌμ–΄λ‚˜λŠ” 일, κ³Όμ •

JVM(Java Virtual Machine) : μžλ°” 가상 λ¨Έμ‹ μœΌλ‘œ μžλ°” λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆλŠ” 주체닀. CPUλ‚˜ 운영체제(ν”Œλž«νΌ)의 μ’…λ₯˜μ™€ λ¬΄κ΄€ν•˜κ²Œ 싀행이 κ°€λŠ₯ν•˜λ‹€. 즉, 운영체제 μœ„μ—μ„œ λ™μž‘ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ‘œ 자

jeong-pro.tistory.com

https://limkydev.tistory.com/51

 

[Java] JVM λ©”λͺ¨λ¦¬ ꡬ쑰

μ˜€λŠ˜μ€ μžλ°” JVM의 λ©”λͺ¨λ¦¬μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² λ‹€. 사싀 JVM λ©”λͺ¨λ¦¬μ— λŒ€ν•΄μ„œ μ™œ μ•Œμ•„μ•Όν• κΉŒ? 슀슀둜 μžλ¬Έν–ˆμ„ λ•Œ λ©”λͺ¨λ¦¬ 관리정도?라고 닡변을 ν–ˆλ‹€. μ†Œκ·œλͺ¨ν”„λ‘œμ νŠΈλ‚˜ κ°„λ‹¨ν•œν”„λ‘œκ·Έλž¨μ„

limkydev.tistory.com

https://cafe.naver.com/jjdev/227

 

[18] μžλ°” λ©”λͺ¨λ¦¬ ꡬ쑰

1. λ©”λͺ¨λ¦¬ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜κΈ° μœ„ν•œ 데이터 및 λͺ…λ Ήμ–΄λ₯Ό μ €μž₯ν•˜λŠ” 곡간※ λ©”λͺ¨λ¦¬κ΅¬μ‘°λ₯Ό κ³΅λΆ€ν•˜λŠ” 이유- 같은 κΈ°λŠ₯의 ν”„λ‘œκ·Έλž¨μ΄λ”λΌλ„ λ©”λͺ¨λ¦¬ 관리에 따라 μ„±λŠ₯이 쒌우됨.- λ©”λͺ¨λ¦¬ ...

cafe.naver.com