λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

μžλ°” JVM λ‚΄λΆ€ ꡬ쑰와 λ©”λͺ¨λ¦¬ ꡬ쑰에 λŒ€ν•˜μ—¬

by 5566 2023. 8. 14.

1. μžλ°” JVM(Java Virtual Machine)의 μ—­ν• 

JVM(Java Virtual Machine)은 μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λŠ” ν™˜κ²½μ„ μ œκ³΅ν•˜λŠ” 가상 μ»΄ν“¨ν„°μž…λ‹ˆλ‹€. μžλ°” ν”„λ‘œκ·Έλž¨μ€ JVM μœ„μ—μ„œ λ™μž‘ν•˜λ©°, μš΄μ˜μ²΄μ œλ‚˜ ν•˜λ“œμ›¨μ–΄μ— λ…λ¦½μ μœΌλ‘œ 싀행될 수 있게 ν•΄μ€λ‹ˆλ‹€.

JVM은 λ‹€μŒκ³Ό 같은 μ£Όμš”ν•œ 역할듀을 μˆ˜ν–‰ν•©λ‹ˆλ‹€:

  • μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰: JVM은 μžλ°” λ°”μ΄νŠΈμ½”λ“œλ₯Ό κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•˜κ³  μ‹€ν–‰ν•©λ‹ˆλ‹€. μ΄λŠ” μžλ°” μ–Έμ–΄μ˜ 큰 μž₯점 쀑 ν•˜λ‚˜μΈ "Write Once, Run Anywhere"λ₯Ό μ‹€ν˜„ν•˜λŠ” μ—­ν• μž…λ‹ˆλ‹€. μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 컴파일 μ‹œμ— κΈ°κ³„μ–΄λ‘œ λ³€ν™˜λ˜λŠ” 것이 μ•„λ‹ˆλΌ, λ°”μ΄νŠΈμ½”λ“œλ‘œ λ³€ν™˜λ˜μ–΄ JVMμ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€.
  • λ©”λͺ¨λ¦¬ 관리: JVM은 μžλ™μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  κ΄€λ¦¬ν•©λ‹ˆλ‹€. μ΄λŠ” κ°œλ°œμžκ°€ λ©”λͺ¨λ¦¬λ₯Ό λͺ…μ‹œμ μœΌλ‘œ ν• λ‹Ήν•˜κ±°λ‚˜ ν•΄μ œν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ” νŽΈλ¦¬ν•¨μ„ μ œκ³΅ν•©λ‹ˆλ‹€. λ˜ν•œ, 가비지 μ»¬λ ‰μ…˜(Garbage Collection) κΈ°λŠ₯을 톡해 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” 객체듀을 μžλ™μœΌλ‘œ μ œκ±°ν•˜μ—¬ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€.
  • μ˜ˆμ™Έ 처리: JVM은 μžλ°” ν”„λ‘œκ·Έλž¨μ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έ(Exception)λ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€. μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ JVM은 ν•΄λ‹Ή μ˜ˆμ™Έλ₯Ό μ μ ˆν•˜κ²Œ μ²˜λ¦¬ν•˜κ³  ν”„λ‘œκ·Έλž¨μ˜ 비정상 μ’…λ£Œλ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€.
  • μŠ€λ ˆλ“œ 관리: JVM은 λ‹€μˆ˜μ˜ λ™μ‹œμ„± μŠ€λ ˆλ“œλ₯Ό κ΄€λ¦¬ν•˜κ³  μŠ€μΌ€μ€„λ§ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ™μ‹œμ— μ—¬λŸ¬ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ±°λ‚˜ λ³‘λ ¬λ‘œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 클래슀 λ‘œλ”© 및 bytecode verification: JVM은 μžλ°” 클래슀 νŒŒμΌμ„ 클래슀둜 λ‘œλ”©ν•˜κ³ , bytecodeλ₯Ό κ²€μ¦ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©λ˜λŠ” ν΄λž˜μŠ€λ“€μ„ λ™μ μœΌλ‘œ λ‘œλ”©ν•˜κ³  μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, bytecode verification κ³Όμ •μ—μ„œ λ³΄μ•ˆμ μΈ μΈ‘λ©΄μ—μ„œλ„ 클래슀의 μ•ˆμ „μ„±μ„ κ²€μ‚¬ν•©λ‹ˆλ‹€.

JVM은 λ‹€μ–‘ν•œ ν”Œλž«νΌμ— λŒ€ν•΄ ν˜Έν™˜μ„±κ³Ό 이식성을 μ œκ³΅ν•˜λ―€λ‘œ, κ°œλ°œμžλ“€μ€ μžλ°” μ–Έμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μ–‘ν•œ μš΄μ˜μ²΄μ œμ™€ ν•˜λ“œμ›¨μ–΄μ—μ„œ λ™μž‘ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ JVM의 μ—­ν• κ³Ό κΈ°λŠ₯은 μžλ°”μ˜ 인기와 성곡에 크게 κΈ°μ—¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

2. JVM λ‚΄λΆ€ ꡬ쑰와 μ‹€ν–‰ κ³Όμ •

JVM은 크게 클래슀 λ‘œλ”(Class Loader), μ‹€ν–‰ 엔진(Execution Engine), λ©”λͺ¨λ¦¬(λ©”λͺ¨λ¦¬ μ˜μ—­)둜 κ΅¬μ„±λ©λ‹ˆλ‹€. 이듀 ꡬ성 μš”μ†ŒλŠ” μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λŠ” 데 ν•„μš”ν•œ 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

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

클래슀 λ‘œλ”λŠ” μžλ°” 클래슀 νŒŒμΌμ„ JVM으둜 λ‘œλ“œν•˜λŠ” 역할을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€. JVM은 λ™μ μœΌλ‘œ 클래슀λ₯Ό λ‘œλ”©ν•˜μ—¬ μ‹€ν–‰ν•˜λŠ” νŠΉμ§•μ΄ 있기 λ•Œλ¬Έμ—, 클래슀 λ‘œλ”λŠ” 클래슀 νŒŒμΌμ„ μ°Ύμ•„ λ‘œλ“œν•˜κ³  JVM이 μ‚¬μš©ν•  수 μžˆλŠ” ν˜•νƒœλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 클래슀 λ‘œλ”λŠ” 3가지 κ³„μΈ΅μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€:

  • Bootstrap Class Loader: κ°€μž₯ λ¨Όμ € μ‹€ν–‰λ˜λ©°, JVM의 κΈ°λ³Έ ν΄λž˜μŠ€λ“€μ„ λ‘œλ“œν•©λ‹ˆλ‹€. C++둜 μž‘μ„±λ˜μ–΄ μžˆμ–΄ Java μ½”λ“œλ‘œ 직접 μˆ˜μ •ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • Extension Class Loader: ν™•μž₯ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” ν΄λž˜μŠ€λ“€μ„ λ‘œλ“œν•©λ‹ˆλ‹€. 보톡 JAVA_HOME/lib/ext 디렉토리 ν•˜μœ„μ— μœ„μΉ˜ν•œ ν΄λž˜μŠ€λ“€μ„ λ‘œλ“œν•©λ‹ˆλ‹€.
  • Application Class Loader: κ°œλ°œμžκ°€ μž‘μ„±ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©ν•˜λŠ” ν΄λž˜μŠ€λ“€μ„ λ‘œλ“œν•©λ‹ˆλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 클래슀 νŒ¨μŠ€μ— ν¬ν•¨λœ ν΄λž˜μŠ€λ“€μ„ λ‘œλ“œν•©λ‹ˆλ‹€.

μ‹€ν–‰ 엔진 (Execution Engine)

μ‹€ν–‰ 엔진은 클래슀 λ‘œλ”λ₯Ό 톡해 λ‘œλ“œλœ 클래슀 νŒŒμΌμ„ κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•˜κ³  μ‹€ν–‰ν•©λ‹ˆλ‹€. JVMμ—λŠ” 두 가지 μ£Όμš”ν•œ μ‹€ν–‰ 엔진이 μžˆμŠ΅λ‹ˆλ‹€:

  • 인터프리터 (Interpreter): 클래슀 νŒŒμΌμ„ ν•œ 쀄씩 ν•΄μ„ν•˜μ—¬ κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•˜κ³  μ‹€ν–‰ν•©λ‹ˆλ‹€. μ‹€ν–‰ μ†λ„λŠ” λŠλ¦¬μ§€λ§Œ, λ°”λ‘œ μ‹€ν–‰ν•  수 있기 λ•Œλ¬Έμ— 초기 λ‘œλ”© μ‹œκ°„μ΄ μ§§μŠ΅λ‹ˆλ‹€.
  • JIT 컴파일러 (Just-In-Time Compiler): 인터프리터가 λ°”μ΄νŠΈμ½”λ“œλ₯Ό ν•΄μ„ν•˜λ©΄, JIT μ»΄νŒŒμΌλŸ¬κ°€ ν•΄λ‹Ή μ½”λ“œλ₯Ό λΆ„μ„ν•˜μ—¬ κΈ°κ³„μ–΄λ‘œ 직접 λ³€ν™˜ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ λ³€ν™˜λœ μ½”λ“œλŠ” μΊμ‹œμ— μ €μž₯λ˜μ–΄ λ‹€μŒμ— λΉ„μŠ·ν•œ μ½”λ“œκ°€ 싀행될 λ•Œ μž¬μ‚¬μš©λ  수 있으며, 이둜 인해 μ‹€ν–‰ 속도가 ν–₯μƒλ©λ‹ˆλ‹€.

λ©”λͺ¨λ¦¬ (λ©”λͺ¨λ¦¬ μ˜μ—­)

JVM은 μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€. λ©”λͺ¨λ¦¬λŠ” 크게 μ—¬λŸ¬ μ˜μ—­μœΌλ‘œ λ‚˜λ‰˜λ©°, 각 μ˜μ—­μ€ νŠΉμ • μš©λ„λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€:

  • λ©”μ†Œλ“œ μ˜μ—­ (Method Area): 클래슀의 메타데이터와 μƒμˆ˜κ°’λ“€μ΄ μ €μž₯λ˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€. 클래슀 λ‘œλ”μ— μ˜ν•΄ λ‘œλ“œλœ 클래슀 νŒŒμΌλ“€μ˜ λ‚΄μš©μ΄ μ €μž₯되며, κ³΅μœ λ˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€.
  • νž™ (Heap): 객체 μΈμŠ€ν„΄μŠ€μ™€ 배열이 ν• λ‹Ήλ˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€. κ°€μž₯ 큰 λ©”λͺ¨λ¦¬ μ˜μ—­μ΄λ©°, 객체의 동적 ν• λ‹Ήκ³Ό 가비지 μ»¬λ ‰μ…˜μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • μŠ€λ ˆλ“œ μŠ€νƒ (Thread Stack): μŠ€λ ˆλ“œκ°€ λ…λ¦½μ μœΌλ‘œ 싀행될 λ•Œ 각각 λ³„λ„μ˜ μŠ€νƒμ΄ ν• λ‹Ήλ˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€. λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ μŠ€νƒ ν”„λ ˆμž„μ΄ μƒμ„±λ˜κ³ , λ©”μ†Œλ“œκ°€ μ’…λ£Œλ˜λ©΄ μŠ€νƒ ν”„λ ˆμž„μ΄ ν•΄μ œλ©λ‹ˆλ‹€.
  • PC λ ˆμ§€μŠ€ν„° (Program Counter Register): ν˜„μž¬ μ‹€ν–‰ 쀑인 JVM λͺ…λ Ήμ˜ μ£Όμ†Œλ₯Ό μ €μž₯ν•΄ λ‘λŠ” μ˜μ—­μž…λ‹ˆλ‹€.
  • λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œ μŠ€νƒ (Native Method Stack): μžλ°” μ½”λ“œμ—μ„œ ν˜ΈμΆœν•œ Native λ©”μ†Œλ“œλ“€μ΄ 싀행될 λ•Œ μŠ€νƒ ν”„λ ˆμž„μ„ μ €μž₯ν•˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€.

μ‹€ν–‰ κ³Όμ •

JVM은 λ‹€μŒκ³Ό 같은 과정을 톡해 μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•©λ‹ˆλ‹€:

  1. 클래슀 λ‘œλ”λ₯Ό 톡해 ν•„μš”ν•œ 클래슀 νŒŒμΌλ“€μ„ JVM으둜 λ‘œλ“œν•©λ‹ˆλ‹€.
  2. JVM은 λ©”μ†Œλ“œ μ˜μ—­μ— 클래슀의 메타데이터와 μƒμˆ˜κ°’λ“€μ„ μ €μž₯ν•©λ‹ˆλ‹€.
  3. νž™ μ˜μ—­μ—λŠ” 객체 μΈμŠ€ν„΄μŠ€μ™€ 배열을 μƒμ„±ν•˜μ—¬ ν• λ‹Ήν•©λ‹ˆλ‹€.
  4. 메인 μŠ€λ ˆλ“œκ°€ μ‹œμž‘λ˜λ©΄, JVM은 메인 λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜κ³  μƒˆλ‘œμš΄ μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  5. JVM은 μΈν„°ν”„λ¦¬ν„°λ‚˜ JIT 컴파일러λ₯Ό 톡해 λ°”μ΄νŠΈμ½”λ“œλ₯Ό κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•˜μ—¬ μ‹€ν–‰ν•©λ‹ˆλ‹€.
  6. μ‹€ν–‰ 쀑 λ°œμƒν•œ μ˜ˆμ™ΈλŠ” JVM의 μ˜ˆμ™Έ 처리 λ©”μ»€λ‹ˆμ¦˜μ— μ˜ν•΄ μ μ ˆν•˜κ²Œ μ²˜λ¦¬λ©λ‹ˆλ‹€.
  7. ν•„μš”μ— 따라 가비지 μ»¬λ ‰μ…˜μ„ μˆ˜ν–‰ν•˜μ—¬ 더 이상 ν•„μš”ν•˜μ§€ μ•Šμ€ 객체듀을 λ©”λͺ¨λ¦¬μ—μ„œ μ œκ±°ν•©λ‹ˆλ‹€.
  8. ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜κ±°λ‚˜ JVM이 κ°•μ œλ‘œ μ’…λ£Œλ˜λ©΄, ν• λ‹Ήλœ λ©”λͺ¨λ¦¬μ™€ λ¦¬μ†ŒμŠ€λ“€μ΄ ν•΄μ œλ©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ JVM의 λ‚΄λΆ€ ꡬ쑰와 μ‹€ν–‰ 과정을 μ΄ν•΄ν•˜λŠ” 것은 μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ™μž‘ 원리λ₯Ό μ΄ν•΄ν•˜λŠ” 데 μ€‘μš”ν•©λ‹ˆλ‹€.

3. JVM λ©”λͺ¨λ¦¬ ꡬ쑰와 λ©”λͺ¨λ¦¬ μ˜μ—­

JVM은 μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€. λ©”λͺ¨λ¦¬λŠ” 크게 μ—¬λŸ¬ μ˜μ—­μœΌλ‘œ λ‚˜λ‰˜λ©°, 각 μ˜μ—­μ€ νŠΉμ • μš©λ„λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€. JVM의 λ©”λͺ¨λ¦¬ ꡬ쑰와 λ©”λͺ¨λ¦¬ μ˜μ—­μ— λŒ€ν•΄ μžμ„Ένžˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

λ©”λͺ¨λ¦¬ ꡬ쑰

JVM의 λ©”λͺ¨λ¦¬ κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό 같이 크게 λ‚˜λ‰©λ‹ˆλ‹€:

  • λ©”μ†Œλ“œ μ˜μ—­ (Method Area)
  • νž™ (Heap)
  • μŠ€λ ˆλ“œ μŠ€νƒ (Thread Stack)
  • PC λ ˆμ§€μŠ€ν„° (Program Counter Register)
  • λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œ μŠ€νƒ (Native Method Stack)

JVM Memory Structure

λ©”μ†Œλ“œ μ˜μ—­ (Method Area)

λ©”μ†Œλ“œ μ˜μ—­μ€ 클래슀의 메타데이터와 μƒμˆ˜κ°’λ“€μ„ μ €μž₯ν•˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€. 클래슀 λ‘œλ”λ₯Ό 톡해 λ‘œλ“œλœ 클래슀 νŒŒμΌλ“€μ˜ λ‚΄μš©μ΄ μ €μž₯λ©λ‹ˆλ‹€. λ©”μ†Œλ“œ μ˜μ—­μ€ JVMμ—μ„œ κ³΅μœ λ˜λŠ” μ˜μ—­μ΄λ―€λ‘œ, λͺ¨λ“  μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ©”μ†Œλ“œ μ˜μ—­μ—λŠ” λ‹€μŒκ³Ό 같은 정보듀이 μ €μž₯λ©λ‹ˆλ‹€:

  • 클래슀 이름, λΆ€λͺ¨ 클래슀 이름, ν•„λ“œ 정보, λ©”μ†Œλ“œ 정보 λ“±μ˜ 메타데이터
  • λ©”μ†Œλ“œ μ½”λ“œ (λ°”μ΄νŠΈμ½”λ“œ)
  • μƒμˆ˜ ν’€ (Constant Pool): 클래슀 νŒŒμΌμ— ν¬ν•¨λœ μ‚¬μš©λ˜λŠ” μƒμˆ˜ κ°’λ“€

νž™ (Heap)

νž™μ€ 객체 μΈμŠ€ν„΄μŠ€μ™€ 배열이 μ €μž₯λ˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€. κ°€μž₯ 큰 λ©”λͺ¨λ¦¬ μ˜μ—­μ΄λ©°, JVMμ—μ„œ 가비지 μ»¬λ ‰μ…˜μ΄ μ΄λ£¨μ–΄μ§€λŠ” μ˜μ—­μ΄κΈ°λ„ ν•©λ‹ˆλ‹€. νž™μ€ λͺ¨λ“  μŠ€λ ˆλ“œμ— κ³΅μœ λ˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€. νž™μ€ 두 가지 μ£Όμš”ν•œ 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€:

  • 객체 μΈμŠ€ν„΄μŠ€μ™€ λ°°μ—΄μ˜ ν• λ‹Ή: new ν‚€μ›Œλ“œλ₯Ό 톡해 객체 μΈμŠ€ν„΄μŠ€μ™€ 배열이 νž™ 내에 ν• λ‹Ήλ©λ‹ˆλ‹€.
  • 가비지 μ»¬λ ‰μ…˜: 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” 객체듀은 가비지 μ»¬λ ‰μ…˜μ΄λΌλŠ” 과정을 톡해 μžλ™μœΌλ‘œ μ œκ±°λ©λ‹ˆλ‹€.

μŠ€λ ˆλ“œ μŠ€νƒ (Thread Stack)

μŠ€λ ˆλ“œ μŠ€νƒμ€ μŠ€λ ˆλ“œκ°€ λ…λ¦½μ μœΌλ‘œ 싀행될 λ•Œ 각각 λ³„λ„μ˜ μŠ€νƒμ΄ ν• λ‹Ήλ˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€. λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ ν•΄λ‹Ή λ©”μ†Œλ“œμ˜ μŠ€νƒ ν”„λ ˆμž„μ΄ μŠ€λ ˆλ“œ μŠ€νƒμ— μƒμ„±λ˜κ³ , λ©”μ†Œλ“œκ°€ μ’…λ£Œλ˜λ©΄ ν•΄λ‹Ή μŠ€νƒ ν”„λ ˆμž„μ΄ μŠ€λ ˆλ“œ μŠ€νƒμ—μ„œ μ œκ±°λ©λ‹ˆλ‹€. μŠ€λ ˆλ“œ μŠ€νƒμ€ 각 μŠ€λ ˆλ“œμ—κ²Œ κ³ μœ ν•œ λ©”λͺ¨λ¦¬ 곡간을 μ œκ³΅ν•˜μ—¬ μŠ€λ ˆλ“œ λ³„λ‘œ 독립적인 μ‹€ν–‰ 흐름을 μœ μ§€ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

PC λ ˆμ§€μŠ€ν„° (Program Counter Register)

PC λ ˆμ§€μŠ€ν„°λŠ” ν˜„μž¬ μ‹€ν–‰ 쀑인 JVM λͺ…λ Ήμ˜ μ£Όμ†Œλ₯Ό μ €μž₯ν•΄ λ‘λŠ” μ˜μ—­μž…λ‹ˆλ‹€. 이 μ˜μ—­μ€ μŠ€λ ˆλ“œ λ³„λ‘œ 각각 μ‘΄μž¬ν•˜λ©°, μŠ€λ ˆλ“œκ°€ μ‹€ν–‰ 쀑인 JVM λͺ…λ Ήμ˜ μ£Όμ†Œλ₯Ό κΈ°λ‘ν•˜μ—¬ λ‹€μŒμ— μ–΄λ–€ λͺ…령을 싀행할지λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.

λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œ μŠ€νƒ (Native Method Stack)

λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œ μŠ€νƒμ€ μžλ°” μ½”λ“œμ—μ„œ ν˜ΈμΆœν•œ Native λ©”μ†Œλ“œλ“€μ΄ 싀행될 λ•Œ μŠ€νƒ ν”„λ ˆμž„μ„ μ €μž₯ν•˜λŠ” μ˜μ—­μž…λ‹ˆλ‹€. λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œλŠ” μžλ°”κ°€ μ•„λ‹Œ λ‹€λ₯Έ μ–Έμ–΄λ‘œ μž‘μ„±λœ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” 것을 λ§ν•˜λ©°, Cλ‚˜ C++κ³Ό 같은 μ–Έμ–΄λ‘œ μž‘μ„±λœ λ©”μ†Œλ“œλ“€μž…λ‹ˆλ‹€.

μ΄λŸ¬ν•œ JVM의 λ©”λͺ¨λ¦¬ ꡬ쑰와 λ©”λͺ¨λ¦¬ μ˜μ—­μ€ μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ‹€ν–‰ λ™μ•ˆ 객체와 λ°μ΄ν„°μ˜ ν• λ‹Ήκ³Ό 관리, λ©”μ†Œλ“œμ˜ 호좜 및 μ‹€ν–‰ 흐름 등을 λ‹΄λ‹Ήν•˜λŠ” μ€‘μš”ν•œ 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. λ©”λͺ¨λ¦¬ μ˜μ—­ λ‚΄μ˜ 각 μ˜μ—­μ€ μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 싀행에 ν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό 효율적으둜 ν• λ‹Ήν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 데 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€.

4. JVM 가비지 μ»¬λ ‰μ…˜(Garbage Collection)κ³Ό λ©”λͺ¨λ¦¬ 관리

JVM은 가비지 μ»¬λ ‰μ…˜ (Garbage Collection)을 톡해 λ™μ μœΌλ‘œ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ μ˜μ—­μ—μ„œ 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” 객체듀을 μžλ™μœΌλ‘œ μ œκ±°ν•˜μ—¬ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€. 가비지 μ»¬λ ‰μ…˜μ€ λ©”λͺ¨λ¦¬ λˆ„μˆ˜(memory leak)와 같은 문제λ₯Ό λ°©μ§€ν•˜κ³ , κ°œλ°œμžκ°€ λͺ…μ‹œμ μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•  ν•„μš” 없이 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ 쀑에 μžμ›μ„ 효율적으둜 κ΄€λ¦¬ν•©λ‹ˆλ‹€.

가비지 μ»¬λ ‰μ…˜μ˜ λ™μž‘ 원리

가비지 μ»¬λ ‰μ…˜μ€ λ‹€μŒκ³Ό 같은 μ›λ¦¬λ‘œ λ™μž‘ν•©λ‹ˆλ‹€:

  1. Reachability Analysis (도달성 뢄석): 가비지 μ»¬λ ‰μ…˜μ€ 도달 κ°€λŠ₯ν•œ 객체(reachable object)와 도달 λΆˆκ°€λŠ₯ν•œ 객체(unreachable object)λ₯Ό κ΅¬λΆ„ν•©λ‹ˆλ‹€. 도달 κ°€λŠ₯ν•œ κ°μ²΄λŠ” μ΅œμ†Œν•œ ν•˜λ‚˜ μ΄μƒμ˜ μ°Έμ‘°(reference)λ₯Ό 가지고 μžˆμ–΄ λ‹€λ₯Έ κ°μ²΄λ‚˜ μ‹€ν–‰ 쀑인 μ½”λ“œμ—μ„œ μ ‘κ·Όν•  수 μžˆλŠ” 객체λ₯Ό λ§ν•©λ‹ˆλ‹€.
  2. Marking (ν‘œμ‹œ): 도달 κ°€λŠ₯ν•œ 객체듀은 ν‘œμ‹œ(Marked)되고, 도달 λΆˆκ°€λŠ₯ν•œ 객체듀은 ν‘œμ‹œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  3. Sweep (μ²­μ†Œ): ν‘œμ‹œλ˜μ§€ μ•Šμ€ 객체듀은 λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œλ˜κ³ , μ‚¬μš©λ˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬ 곡간은 νšŒμˆ˜λ©λ‹ˆλ‹€.

참쑰의 μ’…λ₯˜

μ°Έμ‘°(reference)λŠ” 객체가 λ‹€λ₯Έ 객체λ₯Ό μ°Έμ‘°ν•˜κ±°λ‚˜, μ°Έμ‘°λ₯Ό 톡해 λ‹€λ₯Έ 객체에 μ ‘κ·Όν•  수 μžˆλ„λ‘ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 가비지 μ»¬λ ‰μ…˜μ€ λ‹€μŒκ³Ό 같은 참쑰의 μ’…λ₯˜λ₯Ό κ³ λ €ν•©λ‹ˆλ‹€:

  • κ°•ν•œ μ°Έμ‘° (Strong Reference): 일반적인 참쑰둜, 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” 레퍼런슀 λ³€μˆ˜κ°€ μžˆμ„ 경우 ν•΄λ‹Ή κ°μ²΄λŠ” κ°•ν•œ μ°Έμ‘°λ₯Ό κ°€μ§‘λ‹ˆλ‹€. JVM은 νž™μ—μ„œ 객체가 κ°•ν•œ μ°Έμ‘°λ₯Ό 가지고 μžˆλŠ” λ™μ•ˆμ€ κ·Έ 객체λ₯Ό μˆ˜κ±°ν•˜μ§€ μ•Šκ³  μœ μ§€ν•©λ‹ˆλ‹€.
  • μ†Œν”„νŠΈ μ°Έμ‘° (Soft Reference): λ©”λͺ¨λ¦¬ λΆ€μ‘± μ‹œμ—λ§Œ μˆ˜κ±°λ˜λŠ” μ°Έμ‘°μž…λ‹ˆλ‹€. JVM은 νž™ λ‚΄μ˜ λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•˜λ©΄ 가비지 μ»¬λ ‰μ…˜ μ‹œλ„λ₯Ό ν•˜μ—¬ μ†Œν”„νŠΈ μ°Έμ‘°λ₯Ό 가진 객체듀을 μ œκ±°ν•©λ‹ˆλ‹€.
  • μ•½ν•œ μ°Έμ‘° (Weak Reference): μ–΄λ–€ 객체에 λŒ€ν•œ μ•½ν•œ μ°Έμ‘°λŠ” ν•΄λ‹Ή 객체λ₯Ό μˆ˜κ±°ν•˜λŠ” 데 큰 영ν–₯을 주지 μ•ŠμŠ΅λ‹ˆλ‹€. JVM은 가비지 μ»¬λ ‰μ…˜μ— μ˜ν•΄ μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체λ₯Ό μ•½ν•œ 참쑰둜 κ°€μ§€λŠ” 객체λ₯Ό μ¦‰μ‹œ μ œκ±°ν•©λ‹ˆλ‹€.
  • νŒ¬ν…€ μ°Έμ‘° (Phantom Reference): 객체가 finalize() λ©”μ†Œλ“œ 호좜 ν›„ 회수되기 직전에 μ‚¬μš©λ©λ‹ˆλ‹€. νŒ¬ν…€ μ°Έμ‘°λ₯Ό 톡해 κ°•ν•œ μ°Έμ‘° ν—ˆμš© 없이 객체의 ν•΄μ œ μ‹œμ μ„ μΆ”μ ν•˜κ³  λ©”λͺ¨λ¦¬ κ΄€λ¦¬μžμ—κ²Œ μ•Œλ¦¬λŠ” μš©λ„λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

가비지 μ»¬λ ‰μ…˜μ˜ μž₯단점

가비지 μ»¬λ ‰μ…˜μ€ μžλ™μœΌλ‘œ λ©”λͺ¨λ¦¬ 관리λ₯Ό λŒ€μ‹ ν•΄ 쀌으둜써 κ°œλ°œμžκ°€ λͺ…μ‹œμ μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•˜λŠ” μž‘μ—…μ„ μ€„μ—¬μ£ΌλŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ 가비지 μ»¬λ ‰μ…˜μ€ λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ°©μ§€ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ•ˆμ •μ„±μ„ ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 가비지 μ»¬λ ‰μ…˜μ€ λ‹€μŒκ³Ό 같은 단점도 가지고 μžˆμŠ΅λ‹ˆλ‹€:

  • μ‹€ν–‰μ‹œκ°„ μ˜€λ²„ν—€λ“œ: 가비지 μ»¬λ ‰μ…˜μ€ μ‹€ν–‰ 쀑인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯을 μ•½κ°„ μ €ν•˜μ‹œν‚¬ 수 있으며, 가끔씩 κΈ΄ μΌμ‹œ 정지(stop-the-world)λ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.
  • 예츑 λΆˆκ°€λŠ₯ν•œ λ™μž‘: 가비지 μ»¬λ ‰μ…˜μ€ JVM이 μžλ™μœΌλ‘œ μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μ΄κΈ° λ•Œλ¬Έμ—, κ°œλ°œμžκ°€ 직접 μ œμ–΄ν•  수 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 가비지 μ»¬λ ‰μ…˜μ˜ 타이밍과 μž‘μ—…λŸ‰μ€ μ˜ˆμΈ‘ν•˜κΈ° μ–΄λ €μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.

가비지 μ»¬λ ‰μ…˜μ˜ νŠœλ‹

가비지 μ»¬λ ‰μ…˜μ˜ λ™μž‘μ„ μ‘°μ •ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 일반적인 가비지 μ»¬λ ‰μ…˜μ˜ νŠœλ‹ μ˜΅μ…˜μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

5. JVM의 μ„±λŠ₯ ν–₯상을 μœ„ν•œ νŠœλ‹ 방법

JVM의 μ„±λŠ₯을 ν–₯μƒμ‹œν‚€κΈ° μœ„ν•΄μ„œλŠ” λ‹€μ–‘ν•œ νŠœλ‹ 방법을 μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ νŠœλ‹ 방법은 JVM의 λ©”λͺ¨λ¦¬ 관리, 가비지 μ»¬λ ‰μ…˜, JIT 컴파일러 λ“± λ‹€μ–‘ν•œ μ˜μ—­μ— 걸쳐 적용될 수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜μ—μ„œλŠ” 일반적으둜 μ‚¬μš©λ˜λŠ” JVM의 μ„±λŠ₯ ν–₯상을 μœ„ν•œ νŠœλ‹ 방법을 μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

λ©”λͺ¨λ¦¬ 관리 νŠœλ‹

  • νž™ 크기 μ‘°μ •: νž™(heap)은 JVMμ—μ„œ 객체 μΈμŠ€ν„΄μŠ€μ™€ 배열이 ν• λ‹Ήλ˜λŠ” λ©”λͺ¨λ¦¬ κ³΅κ°„μž…λ‹ˆλ‹€. νž™ ν¬κΈ°λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ— 맞게 μ μ ˆν•˜κ²Œ μ‘°μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€. νž™ 크기λ₯Ό μž‘κ²Œ μ„€μ •ν•˜λ©΄ 가비지 μ»¬λ ‰μ…˜μ˜ νšŸμˆ˜κ°€ μ¦κ°€ν•˜μ—¬ μ‹€ν–‰ 속도가 느렀질 수 있고, λ„ˆλ¬΄ 크게 μ„€μ •ν•˜λ©΄ λ©”λͺ¨λ¦¬ λ‚­λΉ„κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 가비지 μ»¬λ ‰μ…˜ νŠœλ‹: 가비지 μ»¬λ ‰μ…˜μ€ λ©”λͺ¨λ¦¬μ—μ„œ 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” 객체듀을 μ •λ¦¬ν•˜λŠ” μž‘μ—…μž…λ‹ˆλ‹€. 가비지 μ»¬λ ‰μ…˜μ„ 효과적으둜 μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” 각 μ˜μ—­μ— λŒ€ν•œ 가비지 μ»¬λ ‰μ…˜ μ•Œκ³ λ¦¬μ¦˜κ³Ό μŠ€λ ˆλ“œμ˜ λ™μž‘μ„ μ΅œμ ν™”ν•  ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€. 가비지 μ»¬λ ‰μ…˜ μ•Œκ³ λ¦¬μ¦˜μ˜ μ’…λ₯˜, 가비지 μ»¬λ ‰μ…˜ μŠ€λ ˆλ“œμ˜ μš°μ„ μˆœμœ„ 등을 μ‘°μ •ν•˜μ—¬ νŠœλ‹ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

JIT 컴파일러 νŠœλ‹

  • HotSpot μ˜΅μ…˜ μ„€μ •: HotSpot은 JVM의 기본적인 JIT 컴파일러둜 μ„±λŠ₯ ν–₯상을 μœ„ν•œ λ‹€μ–‘ν•œ μ˜΅μ…˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, -client μ˜΅μ…˜μ€ λΉ λ₯Έ μ‹œμž‘ μ‹œκ°„κ³Ό μž‘μ€ λ©”λͺ¨λ¦¬ ν”Œλž˜κ·Έλ₯Ό μ§€μ›ν•˜λ©°, -server μ˜΅μ…˜μ€ 응닡 μ‹œκ°„κ³Ό μ²˜λ¦¬λŸ‰μ„ μ΅œμ ν™”ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. 이외에도 인라이닝, μ½”λ“œ μ΅œμ ν™”, μŠ€λ ˆλ“œ 병렬화 등에 κ΄€λ ¨λœ λ‹€μ–‘ν•œ μ˜΅μ…˜μ„ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 컴파일 μ˜΅μ…˜ μ„€μ •: JIT μ»΄νŒŒμΌλŸ¬λŠ” μ‹€ν–‰ μ‹œμ— μžλ°” λ°”μ΄νŠΈμ½”λ“œλ₯Ό κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•˜λŠ” 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. 컴파일러의 μ˜΅μ…˜μ„ μ„€μ •ν•˜μ—¬ μ΅œμ ν™” μˆ˜μ€€, 인라이닝 μ •μ±…, μ½”λ“œ μΊμ‹œ 크기 등을 μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 섀정은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ νŠΉμ„±μ— 맞게 μ‘°μ •ν•΄μ•Ό ν•˜λ©°, μ‹€ν—˜κ³Ό μ„±λŠ₯ ν…ŒμŠ€νŠΈλ₯Ό 톡해 νŠœλ‹ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

GC λ‘œκΉ… 및 뢄석

  • GC 둜그 ν™œμ„±ν™”: 가비지 μ»¬λ ‰μ…˜ λ‘œκ·ΈλŠ” JVM이 가비지 μ»¬λ ‰μ…˜ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” λ‚΄μš©μ„ κΈ°λ‘ν•©λ‹ˆλ‹€. 둜그λ₯Ό ν™œμ„±ν™”ν•˜μ—¬ 가비지 μ»¬λ ‰μ…˜μ˜ λ™μž‘μ„ λͺ¨λ‹ˆν„°λ§ν•˜κ³  뢄석할 수 μžˆμŠ΅λ‹ˆλ‹€. 둜그λ₯Ό 톡해 가비지 μ»¬λ ‰μ…˜μ˜ 횟수, μ‹œκ°„, λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ 등을 확인할 수 있으며, 이 정보λ₯Ό 기반으둜 가비지 μ»¬λ ‰μ…˜μ˜ νš¨μœ¨μ„±κ³Ό μ„±λŠ₯을 ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • GC 둜그 뢄석: GC λ‘œκ·ΈλŠ” λ‹€μ–‘ν•œ 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ 뢄석할 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 가비지 μ»¬λ ‰μ…˜ μž‘μ—…μ˜ μ„ΈλΆ€ 정보, λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰, 가비지 μ»¬λ ‰μ…˜ μ•Œκ³ λ¦¬μ¦˜μ˜ 선택 및 μˆ˜ν–‰ μ‹œκ°„ 등을 뢄석할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 뢄석을 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ©”λͺ¨λ¦¬ μ‚¬μš© νŒ¨ν„΄μ„ μ΄ν•΄ν•˜κ³ , 가비지 μ»¬λ ‰μ…˜μ˜ νš¨μœ¨μ„±μ„ κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

JVM의 μ„±λŠ₯을 ν–₯μƒμ‹œν‚€κΈ° μœ„ν•΄μ„œλŠ” μ—¬λŸ¬ 가지 νŠœλ‹ μ˜΅μ…˜κ³Ό μ ‘κ·Ό 방법을 κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€. 반볡적인 μ‹€ν—˜κ³Ό μ„±λŠ₯ ν…ŒμŠ€νŠΈλ₯Ό 톡해 졜적의 μ„€μ • 값을 μ°Ύκ³ , μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ νŠΉμ„±κ³Ό μš”κ΅¬μ‚¬ν•­μ— 맞게 νŠœλ‹ μž‘μ—…μ„ μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 JVM의 μ„±λŠ₯을 μ΅œλŒ€ν•œ λŒμ–΄μ˜¬λ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ“κΈ€