π™…π™‘π™ˆ & π™‚π˜Ύ

uuuouuoΒ·2022λ…„ 7μ›” 4일
0
post-thumbnail

JVM에 λŒ€ν•΄ 배우기 μ „ JAVA의 νŠΉμ§• μ•Œκ³ κ°€κΈ°

  • JAVA의 νŠΉμ§•
    • 객체지ν–₯적 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄
    • ν”Œλž«νΌ 독립성, λ©€ν‹°μ“°λ ˆλ“œ, μžλ™ λ©”λͺ¨λ¦¬ 관리 λ“± λ‹€μ–‘ν•œ νŠΉμ§• 가지고 있음
    • JAVA의 μž₯점
      • JVM μœ„μ—μ„œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— μš΄μ˜μ²΄μ œμ— 독립적
      • GabageCollectorλ₯Ό ν†΅ν•œ μžλ™μ μΈ λ©”λͺ¨λ¦¬ 관리가 κ°€λŠ₯
    • JAVA의 단점
      • JVM μœ„μ—μ„œ λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— μ‹€ν–‰ 속도가 μƒλŒ€μ μœΌλ‘œ 느림
      • 닀쀑 μƒμ†μ΄λ‚˜ νƒ€μž…μ— μ—„κ²©ν•˜λ©°, μ œμ•½μ΄ 많음

πŸ“– JVM


νŠΉμ§•

  • JAVA Virtual Machine(μžλ°” 가상 λ¨Έμ‹ )의 μ•½μž
    • 가상머신 : 가상 λ¨Έμ‹ (Virtual Machine, VM)은 물리적 ν•˜λ“œμ›¨μ–΄ μ‹œμŠ€ν…œμ— κ΅¬μΆ•λ˜μ–΄ 자체 CPU, λ©”λͺ¨λ¦¬, λ„€νŠΈμ›Œν¬ μΈν„°νŽ˜μ΄μŠ€ 및 μŠ€ν† λ¦¬μ§€λ₯Ό κ°–μΆ”κ³  μž‘λ™ν•˜λŠ” 가상 컴퓨터 μ‹œμŠ€ν…œ
  • Java Byte Codeλ₯Ό CPUλ‚˜ OS의 μ’…λ₯˜μ— 맞게 ν•΄μ„ν•΄μ£ΌλŠ” μ—­ν• 
  • 가비지 μ»¬λ ‰μ…˜μ„ 톡해 μžλ™μ μΈ λ©”λͺ¨λ¦¬ 관리 κ°€λŠ₯
  • μŠ€νƒ 기반으둜 λ™μž‘

πŸ’¬ JVM λ‚΄λΆ€ ꡬ쑰

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

  • μžλ°”λŠ” λ™μ μœΌλ‘œ 클래슀λ₯Ό μ½μ–΄μ˜€λ―€λ‘œ, ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰ 쀑인 λŸ°νƒ€μž„μ—μ„œμ•Ό λͺ¨λ“  μ½”λ“œκ°€ μžλ°” 가상 λ¨Έμ‹ κ³Ό μ—°κ²°
  • λ™μ μœΌλ‘œ 클래슀λ₯Ό λ‘œλ”©ν•΄μ£ΌλŠ” 역할을 ν•˜λŠ” 것이 λ°”λ‘œ 클래슀 λ‘œλ”(class loader)
  • 클래슀 λ‘œλ”λŠ” .class νŒŒμΌμ„ λ¬Άμ–΄μ„œ JVM이 μš΄μ˜μ²΄μ œλ‘œλΆ€ν„° 할당받은 λ©”λͺ¨λ¦¬ μ˜μ—­μΈ Runtime Data Area둜 적재

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

  • JVM으둜 λ‘œλ“œλœ .class 파일(λ°”μ΄νŠΈμ½”λ“œ)듀은 Runtime Data Areas의 Method Area에 배치
  • 배치된 이후 JVM은 Method Area의 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ 엔진(Execution Engine)에 μ œκ³΅ν•˜μ—¬, μ •μ˜λœ λ‚΄μš©λŒ€λ‘œ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰
  • μ΄λ•Œ, λ‘œλ“œλœ λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” λŸ°νƒ€μž„ λͺ¨λ“ˆμ΄ μ‹€ν–‰ 엔진(Execution Engine)
  • μ‹€ν–‰ 엔진은 λ°”μ΄νŠΈμ½”λ“œλ₯Ό λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ μ½μ–΄μ„œ μ‹€ν–‰

3. 가비지 컬렉터 (Garbage Collector)

  • μžλ°” 가상 머신은 가비지 컬렉터(garbage collector)λ₯Ό μ΄μš©ν•˜μ—¬ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό μžλ™μœΌλ‘œ 회수
  • Heap λ©”λͺ¨λ¦¬ μ˜μ—­μ— 생성(적재)된 객체듀 쀑에 μ°Έμ‘°λ˜μ§€ μ•Šμ€ 객체듀을 탐색 ν›„ μ œκ±°ν•˜λŠ” μ—­ν• 
  • GC역할을 μˆ˜ν–‰ν•˜λŠ” μŠ€λ ˆλ“œλ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ λͺ¨λ“  μŠ€λ ˆλ“œλ“€μ€ μΌμ‹œμ •μ§€μƒνƒœ

4. λŸ°νƒ€μž„ 데이터 μ˜μ—­ (Runtime Data Area)

πŸ‘‰ JVM λ©”λͺ¨λ¦¬ μ˜μ—­ μ„€λͺ… 링크



πŸ’¬ μžλ°” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ κ³Όμ •



1. κ°œλ°œμžκ°€ μžλ°” μ†ŒμŠ€μ½”λ“œ(.java)λ₯Ό μž‘μ„±
2. μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ μ†ŒμŠ€νŒŒμΌλ₯Ό .class 파일(λ°”μ΄νŠΈ μ½”λ“œ) 생성

μžλ°” λ°”μ΄νŠΈ μ½”λ“œ

  • JVM이 이해 κ°€λŠ₯ν•œ μ–Έμ–΄λ‘œ λ³€ν™˜λœ μžλ°” μ†ŒμŠ€ μ½”λ“œ
  1. .class νŒŒμΌμ€ Class Loader에 μ˜ν•΄ JVMλ‚΄λ‘œ λ‘œλ“œ
  2. 싀행엔진을 μ΄μš©ν•΄ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λ°”μ΄λ„ˆλ¦¬ μ½”λ“œλ‘œ λ³€ν™˜
  3. λŸ°νƒ€μž„ 데이터 μ˜μ—­μ— μ˜ν•΄ JVM λ©”λͺ¨λ¦¬μ— 올라감
  4. 싀행엔진은 JVM λ©”λͺ¨λ¦¬μ— 올라온 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό ν•˜λ‚˜μ”© 가져와 μ‹€ν–‰ν•΄μ„œ κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ (Java 컴파일러 μ‚¬μš©)


πŸ“– GC


νŠΉμ§•

  • Garbage Collection의 μ•½μž
  • μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” κ°μ²΄λŠ” λ©”λͺ¨λ¦¬μ—μ„œ μ‚­μ œν•˜λŠ” μž‘μ—…
  • μžλ°” μ–Έμ–΄μ˜ 큰 μž₯점
  • JVMμ—μ„œ μ‹€ν–‰
  • JVM의 λ©”λͺ¨λ¦¬ 쀑 νž™ λ©”λͺ¨λ¦¬λ§Œ λ‹€λ£Έ

GC의 λŒ€μƒ

  • 객체가 NULL인 경우 (ex. String str = null)
  • λΈ”λŸ­ μ‹€ν–‰ μ’…λ£Œ ν›„, λΈ”λŸ­ μ•ˆμ—μ„œ μƒμ„±λœ 객체
  • λΆ€λͺ¨ 객체가 NULL인 경우, ν¬ν•¨ν•˜λŠ” μžμ‹ 객체

πŸ’¬ GC의 λ©”λͺ¨λ¦¬ ν•΄μ œ κ³Όμ •


  • GC의 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ JVM이 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 싀행을 μž μ‹œ 멈좀
  • GCλ₯Ό μ‹€ν–‰ν•˜λŠ” μ“°λ ˆλ“œλ₯Ό μ œμ™Έν•œ λͺ¨λ“  μ“°λ ˆλ“œλ“€μ˜ μž‘μ—…μ„ 쀑단(Stop The World κ³Όμ •)Β 
  • μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό 제거(Mark and Sweep κ³Όμ •)ν•˜κ³  μž‘μ—…μ΄ 재개

0개의 λŒ“κΈ€