# [Java] JVM(Java Virtual Machine)의 ꡬ쑰와 λ™μž‘λ°©μ‹μ— λŒ€ν•΄
Study Repository

[Java] JVM(Java Virtual Machine)의 ꡬ쑰와 λ™μž‘λ°©μ‹μ— λŒ€ν•΄

by rlaehddnd0422

JavaλŠ” 컴파일 방식과, 인터프리터 λ°©μ‹μ˜ μž₯점을 κ²°ν•©ν•œ ν•˜μ΄λΈŒλ¦¬λ“œ μ–Έμ–΄μž…λ‹ˆλ‹€.

ν•˜μ΄λΈŒλ¦¬λ“œ λ°©μ‹μ—μ„œλŠ” μž‘μ„±λœ μ›μ‹œμ½”λ“œλ₯Ό μ΄μ§„νŒŒμΌλ‘œ μ»΄νŒŒμΌν•˜λŠ” κ³Όμ •κ³Ό, μ‹€μ œ ν•΄λ‹Ή μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” μ‹œμ (Runtime)μ—μ„œ JVMμ—μ„œ 이 μ΄μ§„νŒŒμΌμ—μ„œ ν•„μš”ν•œ 뢀뢄듀을 ν•œ 쀄씩 읽어(interprete) μ‹€ν–‰λ©λ‹ˆλ‹€.

 

Runtime μ‹œμ μ—μ„œ JVM을 톡해 λ™μž‘ν•˜μ—¬ μžλ°”λŠ” μš΄μ˜μ²΄μ œλ‘œλΆ€ν„° 독립적인 ν™˜κ²½μ—μ„œ μ‹€ν–‰ κ°€λŠ₯ν•˜λ‹€λŠ” μž₯점을 가지고 μžˆμŠ΅λ‹ˆλ‹€.

 

이 번 ν¬μŠ€νŒ…μ—μ„œ 이 JVM이 λ‚΄λΆ€μ—μ„œ μ–΄λ–»κ²Œ λ™μž‘ν•˜κ³  κ΅¬μ‘°λŠ” 어떀지 μ•Œμ•„λ΄…μ‹œλ‹€.

JVM의 λ™μž‘ 방식과 ꡬ쑰 

 

1. μžλ°”λ‘œ μž‘μ„±λœ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ©΄ JVM은 μš΄μ˜μ²΄μ œλ‘œλΆ€ν„° λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ή λ°›μŠ΅λ‹ˆλ‹€

-> 할당받은 μ˜μ—­ : Runtime Data Area

 

2. μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ μžλ°” μ†ŒμŠ€μ½”λ“œλ₯Ό μžλ°” λ°”μ΄νŠΈ μ½”λ“œ(.class)둜 컴파일

 

3. 이 λ°”μ΄νŠΈ μ½”λ“œ νŒŒμΌμ„ JVM λ‚΄λΆ€ Class Loaderλ₯Ό 톡해 Runtime Data Area둜 λ‘œλ”©ν•©λ‹ˆλ‹€.

  • Class Loader
    • μžλ°”λŠ” μ‹€ν–‰ μ‹œμ μ— λ™μ μœΌλ‘œ 클래슀λ₯Ό μ½μ–΄μ˜€κΈ° 떄문에, μ‹€ν–‰ μ‹œμ μ—μ„œ μ½”λ“œκ°€ JVMκ³Ό μ—°κ²°λ©λ‹ˆλ‹€. μ΄λ ‡κ²Œ λ™μ μœΌλ‘œ 클래슀λ₯Ό λ‘œλ”©ν•΄μ£ΌλŠ” 역할을 ν•˜λŠ” 것이 λ°”λ‘œ Class Loader.
    • Javaμ—μ„œ μ†ŒμŠ€λ₯Ό μž‘μ„±ν•œ νŒŒμΌμ„ .java -> μ‹€ν–‰ μ‹œμ μ— .java둜 λΆ€ν„° ν•„μš”ν•œ μ½”λ“œλ₯Ό λ½‘μ•„μ˜¨ 이후 이진 파일둜 λ³€ν™˜λœ .class νŒŒμΌλ“€μ„ μ μž¬ν•˜λŠ” 곳이 Class Loader

  • Runtime Data Area
    • μ‹€ν–‰ μ‹œμ μ— μ‚¬μš©ν•˜λŠ” 데이터듀은 μš΄μ˜μ²΄μ œλ‘œλΆ€ν„° 할당받은 λ©”λͺ¨λ¦¬ μ˜μ—­μΈ Runtime Data Area에 λ©”μ†Œλ“œ μ˜μ—­, νž™ μ˜μ—­, μŠ€νƒ μ˜μ—­, PC λ ˆμ§€μŠ€ν„°, λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œ μŠ€νƒ 5κ°€μ§€λ‘œ κ΅¬λΆ„ν•˜μ—¬ μ μž¬ν•©λ‹ˆλ‹€.
    • Class Loaderμ—μ„œ λ‘œλ“œλ°›μ€ .class νŒŒμΌλ“€μ„ λ©”μ†Œλ“œ μ˜μ—­μ— μ €μž₯.

4. Runtime Data Area에 λ‘œλ”©λœ .class νŒŒμΌλ“€μ€ Excution Engine을 톡해 ν•΄μ„λ©λ‹ˆλ‹€.

  • Execution Engine
    • Runtime Data Area의 λ©”μ†Œλ“œ μ˜μ—­μ— 배치된 .class νŒŒμΌλ“€μ„ Execution Engine에 provideν•˜μ—¬, μ •μ˜λœ λ‚΄μš©λŒ€λ‘œ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚΅λ‹ˆλ‹€. (μ‹€μ œμ μœΌλ‘œ μ΄μ§„νŒŒμΌλ“€μ΄ μ‹€ν–‰λ˜λŠ” μ€‘μš”ν•œ κ³³)

 

5. ν•΄μ„λœ λ°”μ΄νŠΈ μ½”λ“œλŠ” Runtime Data Area의 각 μ˜μ—­μ— λ°°μΉ˜λ˜μ–΄ μˆ˜ν–‰ν•˜λ©°, 이 κ³Όμ •μ—μ„œ Excution Engine에 μ˜ν•΄ 가비지 컬렉터가 λ™μž‘ν•˜λ©°, μŠ€λ ˆλ“œ 동기화 λ˜ν•œ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

  • GC(Garbage Collector)
    • 더 이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό μžλ™μœΌλ‘œ νšŒμˆ˜ν•΄μ£ΌλŠ” μ—­ν• 
    • 이 덕뢄에 κ°œλ°œμžλŠ” λ³„λ„λ‘œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.
    • μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”κ°€?
      • Heap λ©”λͺ¨λ¦¬ μ˜μ—­μ— 생성(적재)된 객체듀 쀑에 μ°Έμ‘°λ˜μ§€ μ•Šμ€ 객체듀을 탐색 ν›„ μ œκ±°ν•˜λŠ” 역할을 ν•˜λ©° ν•΄λ‹Ή 역할을 ν•˜λŠ” μ‹œκ°„μ€ μ •ν™•νžˆ μ–Έμ œμΈμ§€λ₯Ό μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.

Runtime Data Area의 각 μ˜μ—­μ— μ–΄λ–€κ²Œ μ €μž₯될까?

λͺ¨λ“  Thraedκ°€ κ³΅μœ ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 곡간

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

  • μ•„κΉŒ μ–ΈκΈ‰ν–ˆλ“―μ΄ μ‹€ν–‰ μ‹œμ μ— μ‚¬μš©λ˜λŠ” .class νŒŒμΌλ“€μ΄ λ©”μ†Œλ“œ μ˜μ—­μ— μ €μž₯λ©λ‹ˆλ‹€.
  • 뿐만 μ•„λ‹ˆλΌ 클래슀 멀버 λ³€μˆ˜μ˜ 이름, 데이터 νƒ€μž…, μ ‘κ·Ό μ œμ–΄μž 정보와 같이 각쒅 ν•„λ“œ 정보듀과 λ©”μ†Œλ“œ 정보 λ°μ΄ν„° Type 정보, static λ³€μˆ˜, final class, μƒμˆ˜ ν’€ 등이 이 곳에 μ €μž₯λ©λ‹ˆλ‹€.

 

2. νž™ μ˜μ—­ ( Heap Area )

  • new ν‚€μ›Œλ“œλ‘œ μƒμ„±λœ 객체, 배열이 μ €μž₯λ˜λŠ” κ³³
  • 효율적인 가비지 컬렉터 λ™μž‘μ„ μœ„ν•΄ νž™ μ˜μ—­μ€ λ‹€μ‹œ 3가지 μ˜μ—­μœΌλ‘œ λ‚˜λ‰©λ‹ˆλ‹€.
    • Young Generation : 객체가 μƒμ„±λ˜μžλ§ˆμž μ €μž₯되고 생긴지 μ–Όλ§ˆ λ˜μ§€ μ•Šμ€ 객체가 μ €μž₯λ˜λŠ” 곡간.
    • Tenured Generation : Young Generation 곡간이 꽉 찼을 λ•Œ μƒˆλ‘œμš΄ κ°μ²΄λ‚˜ 배열이 μƒμ„±λ˜λ©΄ 기쑴에 Young Generation에 있던 객체 및 λ°°μ—΄μ˜ μ°Έμ‘°κ°€ 이곳의 Oldμ˜μ—­μœΌλ‘œ μ΄λ™λ˜κ±°λ‚˜ νšŒμˆ˜λ©λ‹ˆλ‹€. 
      • Young Generationκ³Ό Tenured Generation μ—μ„œμ˜ GCλ₯Ό Minor GC라고 ν•œλ‹€κ³  ν•œλ‹€.
    •  Old μ˜μ—­μ— ν• λ‹Ήλœ λ©”λͺ¨λ¦¬κ°€ ν—ˆμš©μΉ˜λ₯Ό λ„˜κ²Œ 되면, Old μ˜μ—­μ— μžˆλŠ” λͺ¨λ“  객체듀을 κ²€μ‚¬ν•˜μ—¬ μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체듀을 ν•œκΊΌλ²ˆμ— μ‚­μ œν•˜λŠ” GCκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€. 
      • Old μ˜μ—­μ˜ λ©”λͺ¨λ¦¬λ₯Ό νšŒμˆ˜ν•˜λŠ” GCλ₯Ό Major GC라고 ν•œλ‹€κ³  ν•œλ‹€.

 

μŠ€λ ˆλ“œλ§ˆλ‹€ ν•˜λ‚˜μ”© μƒμ„±λ˜λŠ” 곡간

1. μŠ€νƒ μ˜μ—­ ( Stack Area ) 

  • μ§€μ—­λ³€μˆ˜, νŒŒλΌλ―Έν„° , 리턴 κ°’, 연산에 μ‚¬μš©λ˜λŠ” μž„μ‹œ κ°’ 등이 μƒμ„±λ˜λŠ” μ˜μ—­

 

2. PC λ ˆμ§€μŠ€ν„°

  • μŠ€λ ˆλ“œκ°€ 생성될 λ–„λ§ˆλ‹€ μƒμ„±λ˜λŠ” μ˜μ—­μœΌλ‘œ, ν˜„μž¬ μŠ€λ ˆλ“œκ°€ μ‹€ν–‰λ˜λŠ” λΆ€λΆ„μ˜ μ£Όμ†Œμ™€ λͺ…령을 μ €μž₯ν•˜κ³  μžˆλŠ” μ˜μ—­

 

3. λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œ μŠ€νƒ 

  • μžλ°”  μ΄μ™Έμ˜ μ–Έμ–΄λ‘œ μž‘μ„±λœ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  λ•Œ λ©”λͺ¨λ¦¬ μ˜μ—­μœΌλ‘œ 일반적인 C μŠ€νƒμ„ μ‚¬μš©
  • 보톡 C/C++ μ½”λ“œλ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ μŠ€νƒ

 

 

JVM의 ꡬ쑰와 λ™μž‘λ°©μ‹μ— λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

이 μ „μ—λŠ” μžλ°”λ₯Ό μ‚¬μš©ν•˜μ—¬ κ°œλ°œν•  λ•Œ μžλ°”μ˜ λ™μž‘λ°©μ‹λ„ λͺ¨λ₯΄κ³  κ·Έλƒ₯ 아무 생각없이 μ‚¬μš©ν–ˆλŠ”λ° μ΄λ ‡κ²Œ μžμ„Ένžˆ μ•Œμ•„λ³΄λ‹ˆ μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 싀행원리와 λ©”λͺ¨λ¦¬ 관리 λ“±μ˜ λ™μž‘μ›λ¦¬λ₯Ό μ΄ν•΄ν•˜λŠ”λ° λ§Žμ€ 도움이 된 것 κ°™μŠ΅λ‹ˆλ‹€.


 

 

<참고 자료>

 

 

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

μ €λ²ˆ ν¬μŠ€νŒ…μ—μ„œλŠ” JVM에 λŒ€ν•΄μ„œ κ°„λž΅ν•˜κ²Œ μ•Œμ•„λ³΄λŠ” μ‹œκ°„μ„ κ°€μ‘Œλ‹€λ©΄ 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” JVM의 λ‚΄λΆ€ ꡬ쑰에 λŒ€ν•΄ μ’€ 더 μžμ„Έν•˜κ²Œ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. ν˜Ήμ‹œ JVM의 μ •μ˜μ™€ μ™œ ν•„μš”ν•œμ§€ κΆκΈˆν•˜μ‹œ

coding-factory.tistory.com

 

 

[Java] μžλ°” 가상머신 JVM(Java Virtual Machine) 총정리

JVM(Java Virtual Machine)μ΄λž€? μžλ°” 가상 λ¨Έμ‹  JVM(Java Virtual Machine)은 μžλ°” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ν™˜κ²½μ„ λ§Œλ“€μ–΄ μ£ΌλŠ” μ†Œν”„νŠΈμ›¨μ–΄μž…λ‹ˆλ‹€. μžλ°” μ½”λ“œλ₯Ό μ»΄νŒŒμΌν•˜μ—¬ .class λ°”μ΄νŠΈ μ½”λ“œλ‘œ λ§Œλ“€λ©΄ 이 μ½”λ“œκ°€ μžλ°” κ°€

coding-factory.tistory.com

 

λΈ”λ‘œκ·Έμ˜ 정보

Study Repository

rlaehddnd0422

ν™œλ™ν•˜κΈ°