πŸ’» Computer Science

가비지 μ»¬λ ‰μ…˜ (Garbage Collection, GC)

μ«€λƒ  2023. 12. 24. 16:42

가비지 μ»¬λ ‰μ…˜μ΄λž€?

 

ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ‚¬μš©λ˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό μžλ™μœΌλ‘œ κ²€μΆœν•˜κ³  νšŒμˆ˜ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μž…λ‹ˆλ‹€.

주둜 λ©”λͺ¨λ¦¬ 관리가 ν•„μš”ν•œ μ–Έμ–΄μ—μ„œ μ‚¬μš©λ˜λ©°, κ°œλ°œμžκ°€ μˆ˜λ™μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•˜λŠ” 뢀담을 μ€„μ—¬μ€λ‹ˆλ‹€.

 

가비지 μ»¬λ ‰μ…˜μ„ μ‚¬μš©ν•˜λŠ” μ£Όμš” μ–Έμ–΄

  • Java λŠ” κ°€μž₯ λŒ€ν‘œμ μΈ 가비지 μ»¬λ ‰μ…˜μ„ μ‚¬μš©ν•˜λŠ” μ–Έμ–΄μž…λ‹ˆλ‹€. Java의 GCλŠ” λŸ°νƒ€μž„μ— μ‹€ν–‰λ˜λ©°, μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체듀을 μžλ™μœΌλ‘œ μ°Ύμ•„ λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•©λ‹ˆλ‹€. GC의 μ‹€ν–‰ μ‹œμ μ€ μ˜ˆμΈ‘ν•  수 μ—†μœΌλ©°, λ•Œλ‘œλŠ” μ„±λŠ₯에 영ν–₯을 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.
  • C# λ˜ν•œ .NET ν”„λ ˆμž„μ›Œν¬μ˜ μΌλΆ€λ‘œ 가비지 μ»¬λ ‰μ…˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€. Java와 μœ μ‚¬ν•˜κ²Œ, μ‚¬μš©λ˜μ§€ μ•ŠλŠ” 객체듀을 μžλ™μœΌλ‘œ μ°Ύμ•„ λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•©λ‹ˆλ‹€. C#의 GCλŠ” μ„ΈλŒ€λ³„ 가비지 μ»¬λ ‰μ…˜μ„ μ‚¬μš©ν•˜μ—¬ λ©”λͺ¨λ¦¬ κ΄€λ¦¬μ˜ νš¨μœ¨μ„±μ„ λ†’μž…λ‹ˆλ‹€.
  • Python도 가비지 μ»¬λ ‰μ…˜μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. Python의 경우, μ°Έμ‘° μΉ΄μš΄νŒ…κ³Ό ν•¨κ»˜ μˆœν™˜ μ°Έμ‘°λ₯Ό νƒμ§€ν•˜κΈ° μœ„ν•œ GCκ°€ κ²°ν•©λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

각 μ–Έμ–΄μ—μ„œμ˜ 차이점

 

Java의 가비지 μ»¬λ ‰μ…˜
- μž‘λ™ 원리: Javaμ—μ„œ GCλŠ” λŸ°νƒ€μž„μ— μ‹€ν–‰λ˜λ©°, 객체에 λŒ€ν•œ μ°Έμ‘°κ°€ 더 이상 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ ν•΄λ‹Ή 객체λ₯Ό κ°€λΉ„μ§€λ‘œ κ°„μ£Όν•©λ‹ˆλ‹€.
- μ„ΈλŒ€λ³„ GC: JavaλŠ” μ‹ μƒλŒ€(Young Generation), ν…Œλ‰΄μ–΄λ“œ μ„ΈλŒ€(Old Generation), λ©”νƒ€μŠ€νŽ˜μ΄μŠ€(Metaspace)와 같이 λ©”λͺ¨λ¦¬λ₯Ό μ„ΈλŒ€λ³„λ‘œ κ΄€λ¦¬ν•˜μ—¬ νš¨μœ¨μ„ λ†’μž…λ‹ˆλ‹€.

C#의 가비지 μ»¬λ ‰μ…˜
- .NET ν™˜κ²½: C#μ—μ„œ GCλŠ” .NET ν”„λ ˆμž„μ›Œν¬μ˜ μΌλΆ€λ‘œ, μžλ™ λ©”λͺ¨λ¦¬ 관리λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
- μ„ΈλŒ€λ³„ GC: C# μ—­μ‹œ Java와 μœ μ‚¬ν•˜κ²Œ μ„ΈλŒ€λ³„ λ©”λͺ¨λ¦¬ 관리λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
- μ΅œμ ν™”λœ μ„±λŠ₯: C#의 GCλŠ” λ©”λͺ¨λ¦¬ 관리에 μ΅œμ ν™”λ˜μ–΄ 있으며, λŒ€λΆ€λΆ„μ˜ κ²½μš°μ— λŒ€ν•œ λ©”λͺ¨λ¦¬ 관리λ₯Ό μžλ™μœΌλ‘œ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

Python의 가비지 μ»¬λ ‰μ…˜
- μ°Έμ‘° μΉ΄μš΄νŒ…: Python의 μ£Όμš” λ©”λͺ¨λ¦¬ 관리 기법은 μ°Έμ‘° μΉ΄μš΄νŒ…μ΄λ©°, 객체에 λŒ€ν•œ μ°Έμ‘° μˆ˜κ°€ 0이 되면 λ©”λͺ¨λ¦¬λ₯Ό μžλ™μœΌλ‘œ ν•΄μ œν•©λ‹ˆλ‹€.
- μˆœν™˜ μ°Έμ‘°: Python의 GCλŠ” μˆœν™˜ μ°Έμ‘°(μ„œλ‘œ μ°Έμ‘°ν•˜λŠ” 객체듀)λ₯Ό κ°μ§€ν•˜κ³  ν•΄μ œν•˜λŠ” κΈ°λŠ₯을 ν¬ν•¨ν•©λ‹ˆλ‹€.
- 동적 μ–Έμ–΄: Python은 동적 타이핑 μ–Έμ–΄λ‘œ, λ©”λͺ¨λ¦¬ 관리가 λŸ°νƒ€μž„μ— μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

 

 

가비지 μ»¬λ ‰μ…˜μ˜ 곡톡점과 차이점

 

- 곡톡점: λͺ¨λ“  μ–Έμ–΄μ—μ„œ GCλŠ” λ©”λͺ¨λ¦¬ 관리λ₯Ό μžλ™ν™”ν•˜μ—¬ 개발자의 뢀담을 쀄이고, λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ˜ μœ„ν—˜μ„ κ°μ†Œμ‹œν‚΅λ‹ˆλ‹€.
- 차이점: 가비지 μ»¬λ ‰μ…˜μ˜ κ΅¬ν˜„κ³Ό μ•Œκ³ λ¦¬μ¦˜μ€ μ–Έμ–΄λ³„λ‘œ λ‹€λ¦…λ‹ˆλ‹€. Java와 C#은 μ„ΈλŒ€λ³„ GCλ₯Ό μ‚¬μš©ν•˜μ—¬ νš¨μœ¨μ„±μ„ λ†’μ΄λŠ” 반면, Python은 주둜 μ°Έμ‘° μΉ΄μš΄νŒ…μ— μ˜μ‘΄ν•˜κ³  μˆœν™˜ μ°Έμ‘° λ¬Έμ œμ— λŒ€μ‘ν•˜κΈ° μœ„ν•΄ 좔가적인 GC λ©”μ»€λ‹ˆμ¦˜μ„ κ°€μ§‘λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ°¨μ΄λŠ” 각 μ–Έμ–΄μ˜ λŸ°νƒ€μž„ ν™˜κ²½κ³Ό λ©”λͺ¨λ¦¬ 관리 μ „λž΅μ— κΈ°μΈν•©λ‹ˆλ‹€.


 

κ·Έλ ‡λ‹€λ©΄ C++은 가비지 μ»¬λ ‰μ…˜μ΄ μ—†λŠ”λ°, μ–΄λ–»κ²Œ ν•˜λŠ”μ§€?

C++은 λ‚΄μž₯된 가비지 μ»¬λ ‰μ…˜ κΈ°λŠ₯이 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λ©”λͺ¨λ¦¬ κ΄€λ¦¬λŠ” 주둜 개발자의 μ±…μž„μž…λ‹ˆλ‹€. C++μ—μ„œ λ©”λͺ¨λ¦¬ 관리λ₯Ό μˆ˜ν–‰ν•˜λŠ” λͺ‡ 가지 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

κ°œλ°œμžλŠ” `new` μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ νž™μ— λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³ , `delete` μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•©λ‹ˆλ‹€. 이 방법은 μ •ν™•ν•˜κ²Œ λ©”λͺ¨λ¦¬λ₯Ό 관리할 수 μžˆμ§€λ§Œ, λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ‚˜ 이쀑 ν•΄μ œμ™€ 같은 였λ₯˜κ°€ λ°œμƒν•  μœ„ν—˜μ΄ μžˆμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ C++11λΆ€ν„°λŠ” 슀마트 포인터(`std::unique_ptr`, `std::shared_ptr`, `std::weak_ptr`)λ₯Ό μ‚¬μš©ν•˜μ—¬ μžλ™ λ©”λͺ¨λ¦¬ 관리λ₯Ό μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 슀마트 ν¬μΈν„°λŠ” 객체의 수λͺ…이 λλ‚˜λ©΄ μžλ™μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•©λ‹ˆλ‹€. RAII(Resource Acquisition Is Initialization) νŒ¨ν„΄μ€ 객체의 수λͺ…κ³Ό μžμ›(λ©”λͺ¨λ¦¬, 파일 ν•Έλ“€, λ„€νŠΈμ›Œν¬ μ—°κ²° λ“±)의 관리λ₯Ό μ—°κ²°ν•©λ‹ˆλ‹€. 객체가 μ†Œλ©Έλ  λ•Œ μžλ™μœΌλ‘œ μžμ›μ΄ ν•΄μ œλ˜λ„λ‘ ν•˜μ—¬, λ©”λͺ¨λ¦¬ 관리λ₯Ό 보닀 μ•ˆμ „ν•˜κ²Œ ν•©λ‹ˆλ‹€.

λ˜ν•œ C++ ν‘œμ€€ 라이브러리의 μ»¨ν…Œμ΄λ„ˆλ“€(예: `std::vector`, `std::map` λ“±)은 자체적으둜 λ©”λͺ¨λ¦¬ 관리λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚¬μš©ν•˜λ©΄ κ°œλ°œμžκ°€ 직접 λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  ν•΄μ œν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

μžλ°”μ˜ 가비지 μ»¬λ ‰μ…˜μ— λŒ€ν•œ μ„€λͺ…

 

μžλ°”μ—μ„œμ˜ 가비지 μ»¬λ ‰μ…˜μ€ 사싀 λ©”λͺ¨λ¦¬ μ²­μ†ŒλΆ€ 같은 역할을 ν•©λ‹ˆλ‹€. μžλ°” 가비지 μ»¬λ ‰μ…˜μ˜ μ£Ό λͺ©μ μ€ ν”„λ‘œκ·Έλž¨μ— μ˜ν•΄ ν• λ‹Ήλ˜μ—ˆμ§€λ§Œ 더 이상 μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체듀을 λ©”λͺ¨λ¦¬μ—μ„œ μ œκ±°ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이λ₯Ό 톡해 λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ°©μ§€ν•˜κ³ , ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±κ³Ό μ„±λŠ₯을 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.이 덕뢄에 κ°œλ°œμžλ“€μ€ λ©”λͺ¨λ¦¬ 관리에 μ‹ κ²½ 쓰지 μ•Šκ³  ν”„λ‘œκ·Έλž˜λ°μ— 집쀑할 수 μžˆμŠ΅λ‹ˆλ‹€. 가비지 μ»¬λ ‰ν„°λŠ” 객체가 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠμœΌλ©΄, 즉 더 이상 μ°Έμ‘°λ˜μ§€ μ•ŠμœΌλ©΄ λ©”λͺ¨λ¦¬μ—μ„œ κ·Έ 객체λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.
μžλ°”μ—μ„œλŠ” 객체듀을 μ„ΈλŒ€λ³„λ‘œ κ΄€λ¦¬ν•΄μš”. μƒˆλ‘œ μƒμ„±λœ κ°μ²΄λŠ” '신생 μ„ΈλŒ€'에 λ“€μ–΄κ°€κ³ , μ‹œκ°„μ΄ μ§€λ‚˜ 살아남은 객체듀은 'μ£Ό μ„ΈλŒ€'둜 μ΄λ™ν•˜μ£ . 이런 λ°©μ‹μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό 효율적으둜 κ΄€λ¦¬ν•©λ‹ˆλ‹€. λ˜ν•œ, λ©”λͺ¨λ¦¬μ˜ λ‹¨νŽΈν™”λ₯Ό 막기 μœ„ν•΄ 가끔 'μ»΄νŒ©μ…˜' μž‘μ—…μ„ μ§„ν–‰ν•˜κΈ°λ„ ν•΄μš”. 가비지 μ»¬λ ‰μ…˜μ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯에 큰 영ν–₯을 미치기 λ•Œλ¬Έμ—, 이λ₯Ό 잘 μ΄ν•΄ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

  1. 도달 κ°€λŠ₯μ„± 뢄석(Reachability Analysis): GCλŠ” '가비지'λ₯Ό μ‹λ³„ν•˜κΈ° μœ„ν•΄ '도달 κ°€λŠ₯μ„± 뢄석'μ΄λΌλŠ” 과정을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. 이 κ³Όμ •μ—μ„œ GCλŠ” '루트 집합(root set)'μœΌλ‘œλΆ€ν„° μ‹œμž‘ν•˜μ—¬ μ°Έμ‘°λ₯Ό 따라가며 도달 κ°€λŠ₯ν•œ 객체λ₯Ό μ‹λ³„ν•©λ‹ˆλ‹€. 루트 μ§‘ν•©μ—λŠ” ν™œμ„± μŠ€λ ˆλ“œ, 정적 ν•„λ“œ, JNI μ°Έμ‘° 등이 ν¬ν•¨λ©λ‹ˆλ‹€.
  2. λ§ˆν‚Ή(Marking): 도달 κ°€λŠ₯ν•œ 객체듀은 'λ§ˆν‚Ή' 과정을 톡해 μ‹λ³„λ©λ‹ˆλ‹€. 이 λ‹¨κ³„μ—μ„œ GCλŠ” λͺ¨λ“  도달 κ°€λŠ₯ν•œ 객체λ₯Ό ν‘œμ‹œν•˜κ³ , 이듀이 μ°Έμ‘°ν•˜λŠ” λ‹€λ₯Έ 객체듀을 μž¬κ·€μ μœΌλ‘œ νƒμƒ‰ν•©λ‹ˆλ‹€.
  3. μŠ€μœ„ν•‘(Sweeping): λ§ˆν‚Ή 과정이 μ™„λ£Œλœ ν›„, GCλŠ” λ§ˆν‚Ήλ˜μ§€ μ•Šμ€ 객체듀을 λ©”λͺ¨λ¦¬μ—μ„œ μ œκ±°ν•©λ‹ˆλ‹€. 이 λ‹¨κ³„μ—μ„œ μ‹€μ œλ‘œ λ©”λͺ¨λ¦¬κ°€ ν•΄μ œλ©λ‹ˆλ‹€.
  4. μ»΄νŒ©μ…˜(Compaction): 가비지 μ»¬λ ‰μ…˜ κ³Όμ •μ—μ„œλŠ” λ©”λͺ¨λ¦¬ λ‹¨νŽΈν™”κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ»΄νŒ©μ…˜ λ‹¨κ³„μ—μ„œλŠ” μƒμ‘΄ν•˜λŠ” 객체듀을 λ©”λͺ¨λ¦¬ μƒμ˜ μ—°μ†λœ μ˜μ—­μœΌλ‘œ μ΄λ™μ‹œμΌœ λ‹¨νŽΈν™”λ₯Ό μ€„μž…λ‹ˆλ‹€.
  5. μ„ΈλŒ€λ³„ 가비지 μ»¬λ ‰μ…˜(Generational GC): μžλ°”μ˜ GCλŠ” 객체의 수λͺ… μ£ΌκΈ°λ₯Ό 기반으둜 μ—¬λŸ¬ 'μ„ΈλŒ€(generations)'둜 λ©”λͺ¨λ¦¬λ₯Ό λ‚˜λˆ„μ–΄ κ΄€λ¦¬ν•©λ‹ˆλ‹€. 일반적으둜 '신생 μ„ΈλŒ€(Young Generation)', 'μ£Ό μ„ΈλŒ€(Old Generation)', '영ꡬ μ„ΈλŒ€(Permanent Generation λ˜λŠ” Metaspace)'둜 κ΅¬λΆ„λ©λ‹ˆλ‹€.
  6. 신생 μ„ΈλŒ€(Young Generation) GC: 신생 μ„ΈλŒ€λŠ” μƒˆλ‘œ μƒμ„±λœ 객체듀이 μœ„μΉ˜ν•˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ κ°μ²΄λŠ” μ—¬κΈ°μ„œ μƒμ„±λ˜κ³  λΉ λ₯΄κ²Œ μ†Œλ©Έλ©λ‹ˆλ‹€. 신생 μ„ΈλŒ€μ—μ„œ GCκ°€ λ°œμƒν•˜λŠ” 것을 'Minor GC'라고 λΆ€λ¦…λ‹ˆλ‹€.
  7. μ£Ό μ„ΈλŒ€(Old Generation) GC: μ‹œκ°„μ΄ μ§€λ‚˜ 신생 μ„ΈλŒ€μ—μ„œ 살아남은 객체듀은 μ£Ό μ„ΈλŒ€λ‘œ μ΄λ™ν•©λ‹ˆλ‹€. μ£Ό μ„ΈλŒ€μ—μ„œμ˜ GCλŠ” 'Major GC' λ˜λŠ” 'Full GC'라고 ν•˜λ©°, 더 였래 걸리고 신생 μ„ΈλŒ€λ³΄λ‹€ 덜 자주 λ°œμƒν•©λ‹ˆλ‹€.
  8. 가비지 μ»¬λ ‰ν„°μ˜ μ’…λ₯˜: μžλ°”λŠ” λ‹€μ–‘ν•œ 가비지 컬렉터λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, Serial GC, Parallel GC, CMS(Concurrent Mark-Sweep) GC, G1(Garbage-First) GC 등이 있으며, 각각의 GCλŠ” μ„œλ‘œ λ‹€λ₯Έ μ„±λŠ₯ νŠΉμ„±κ³Ό μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μš”κ΅¬ 사항에 맞좰 μ‚¬μš©λ©λ‹ˆλ‹€.

μžλ°”μ˜ JVM에 λŒ€ν•œ μ„€λͺ…


μžλ°”μ˜ JVM은 μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰μ‹œν‚€λŠ” λ¬΄λŒ€λΌκ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μžλ°”λ‘œ μž‘μ„±λœ λͺ¨λ“  ν”„λ‘œκ·Έλž¨μ€ JVM μœ„μ—μ„œ μ‹€ν–‰λ˜μ£ . JVM 덕뢄에 μžλ°”λŠ” 'ν•œ 번 μž‘μ„±ν•˜λ©΄ μ–΄λ””μ„œλ“  μ‹€ν–‰ν•  수 μžˆλ‹€'λŠ” 큰 μž₯점을 κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€. μžλ°” μ½”λ“œλŠ” λ°”μ΄νŠΈμ½”λ“œλ‘œ 컴파일되고, 이 λ°”μ΄νŠΈμ½”λ“œκ°€ λ‹€μ–‘ν•œ ν”Œλž«νΌμ—μ„œ 싀행될 수 있게 JVM이 κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•΄ μ‹€ν–‰ν•˜λŠ” κ±°μ£ .
그리고 JVM은 λ©”λͺ¨λ¦¬ 관리, 가비지 μ»¬λ ‰μ…˜ 같은 μ€‘μš”ν•œ 업무도 λ‹΄λ‹Ήν•©λ‹ˆλ‹€. 이둜 인해 κ°œλ°œμžλ“€μ€ ν”Œλž«νΌμ— ꡬ애받지 μ•Šκ³ , λ©”λͺ¨λ¦¬ 관리에 μ‹ κ²½ 쓰지 μ•Šκ³ λ„ 효율적으둜 κ°œλ°œν•  수 μžˆμ–΄μš”. ν•˜μ§€λ§Œ JVM 섀정이 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯에 큰 영ν–₯을 미치기 λ•Œλ¬Έμ—, JVM에 λŒ€ν•œ 이해도 μ€‘μš”ν•©λ‹ˆλ‹€. 이 κ³Όμ •μ—μ„œ μžλ°”μ˜ 핡심 원칙인 "Write Once, Run Anywhere"을 μ‹€ν˜„ν•©λ‹ˆλ‹€. JVM 덕뢄에 κ°œλ°œμžλ“€μ€ 운영 μ²΄μ œλ‚˜ ν•˜λ“œμ›¨μ–΄μ— ꡬ애받지 μ•Šκ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•˜κ³  배포할 수 μžˆμŠ΅λ‹ˆλ‹€.

  1. ν”Œλž«νΌ 독립성: μžλ°” μ†ŒμŠ€ μ½”λ“œλŠ” λ¨Όμ € λ°”μ΄νŠΈμ½”λ“œλ‘œ μ»΄νŒŒμΌλ©λ‹ˆλ‹€. 이 λ°”μ΄νŠΈμ½”λ“œλŠ” μ–΄λ–€ JVMμ—μ„œλ„ 싀행될 수 μžˆμœΌλ―€λ‘œ, μžλ°” ν”„λ‘œκ·Έλž¨μ€ λ‹€μ–‘ν•œ 운영 μ²΄μ œμ™€ ν•˜λ“œμ›¨μ–΄ ν”Œλž«νΌμ—μ„œ λ™μΌν•˜κ²Œ 싀행될 수 μžˆμŠ΅λ‹ˆλ‹€.
  2. 클래슀 λ‘œλ”(Class Loader): JVM은 클래슀 λ‘œλ”λ₯Ό μ‚¬μš©ν•΄ λ°”μ΄νŠΈμ½”λ“œλ₯Ό λŸ°νƒ€μž„ μ‹œ λ©”λͺ¨λ¦¬λ‘œ λ‘œλ“œν•©λ‹ˆλ‹€. 클래슀 λ‘œλ”λŠ” μžλ°” 클래슀 파일(.class)을 λΆˆλŸ¬μ™€ JVM의 λ©”λͺ¨λ¦¬ μ˜μ—­μ— μ μž¬ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.
  3. λŸ°νƒ€μž„ 데이터 μ˜μ—­: JVM은 λ©”λͺ¨λ¦¬ 관리λ₯Ό μœ„ν•΄ μ—¬λŸ¬ λŸ°νƒ€μž„ 데이터 μ˜μ—­μ„ μœ μ§€ν•©λ‹ˆλ‹€. 이 μ˜μ—­μ—λŠ” λ©”μ†Œλ“œ μ˜μ—­(Method Area), νž™(Heap), μŠ€νƒ(Stack), ν”„λ‘œκ·Έλž¨ μΉ΄μš΄ν„°(Program Counter) 등이 ν¬ν•¨λ©λ‹ˆλ‹€.
  4. μ‹€ν–‰ 엔진(Execution Engine): λ°”μ΄νŠΈμ½”λ“œλŠ” μ‹€ν–‰ 엔진에 μ˜ν•΄ κΈ°κ³„μ–΄λ‘œ ν•΄μ„λ˜μ–΄ μ‹€ν–‰λ©λ‹ˆλ‹€. μ‹€ν–‰ μ—”μ§„μ—λŠ” 인터프리터와 JIT(Just-In-Time) μ»΄νŒŒμΌλŸ¬κ°€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
  5. 인터프리터: λ°”μ΄νŠΈμ½”λ“œλ₯Ό ν•œ 쀄씩 μ½μ–΄μ„œ μ‹€ν–‰ν•©λ‹ˆλ‹€. 이 과정은 λŠλ¦¬μ§€λ§Œ, 각 λͺ…λ Ήμ–΄μ˜ 싀행을 μ •ν™•νžˆ μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  6. JIT 컴파일러: λ°”μ΄νŠΈμ½”λ“œμ˜ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€κΈ° μœ„ν•΄, λŸ°νƒ€μž„μ— λ°”μ΄νŠΈμ½”λ“œμ˜ 일뢀λ₯Ό 직접 μ‹€ν–‰ κ°€λŠ₯ν•œ κΈ°κ³„μ–΄λ‘œ μ»΄νŒŒμΌν•©λ‹ˆλ‹€. μ΄λŠ” ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 속도λ₯Ό κ°œμ„ ν•©λ‹ˆλ‹€.
  7. 가비지 컬렉터(Garbage Collector): JVM의 가비지 μ»¬λ ‰ν„°λŠ” 더 이상 μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체λ₯Ό μžλ™μœΌλ‘œ κ°μ§€ν•˜κ³ , 이λ₯Ό λ©”λͺ¨λ¦¬μ—μ„œ μ œκ±°ν•©λ‹ˆλ‹€. μ΄λŠ” λ©”λͺ¨λ¦¬ 관리λ₯Ό λ‹¨μˆœν™”ν•˜κ³  λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€.
  8. λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œ μΈν„°νŽ˜μ΄μŠ€(Native Method Interface): μžλ°” ν”„λ‘œκ·Έλž¨μ΄ 운영 체제의 λ„€μ΄ν‹°λΈŒ 라이브러리(예: C, C++ 라이브러리)와 μƒν˜Έ μž‘μš©ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.
  9. λ„€μ΄ν‹°λΈŒ 라이브러리: JVM은 μžλ°” ν”„λ‘œκ·Έλž¨μ΄ ν•„μš”λ‘œ ν•˜λŠ” νŠΉμ • κΈ°λŠ₯을 μ œκ³΅ν•˜κΈ° μœ„ν•΄ 운영 체제의 λ„€μ΄ν‹°λΈŒ 라이브러리λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.