JVM - low-hill/Knowledge GitHub Wiki

JVM(Java Virtual Machine) μ΄λž€?

JVMμ΄λž€ μžλ°” λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚€κΈ° μœ„ν•œ κ°€μƒμ˜ 머신이닀. μžλ°”λ‘œ μž‘μ„±λœ λͺ¨λ“  ν”„λ‘œκ·Έλž¨μ€ μžλ°” 가상 λ¨Έμ‹ μ—μ„œλ§Œ 싀행될 수 μžˆμœΌλ―€λ‘œ, μžλ°” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ°˜λ“œμ‹œ μžλ°” 가상 머신이 μ„€μΉ˜λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€.

JVM은 μ„œλ‘œ λ‹€λ₯Έ μš΄μ˜μ²΄μ œμ—μ„œ μ•„λ¬΄λŸ° μΆ”κ°€ 쑰치 없이 μžλ°” ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λ„λ‘ ν•œλ‹€. λ”°λΌμ„œ κ°œλ°œμžλŠ” ν•œ 번만 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λ©΄, λͺ¨λ“  μš΄μ˜μ²΄μ œμ—μ„œ 같이 μ‚¬μš©ν•  수 μžˆλŠ” μž₯점이 μžˆλ‹€.

  • JVM은 μš΄μ˜μ²΄μ œμ— μ’…μ†μ μ΄λ―€λ‘œ 각 μš΄μ˜μ²΄μ œμ— λ§žλŠ” μžλ°” 가상 머신을 μ„€μΉ˜ν•΄μ•Ό ν•œλ‹€.

JVM μ—­ν• 

  • Java bytecode μ‹€ν–‰: μžλ°” μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ λ³€ν™˜λœ byte codeλ₯Ό ν•΄μ„ν•˜κ³  μ‹€ν–‰ν•˜μ—¬ μžλ°” ν”„λ‘œκ·Έλž¨μ΄ μ—¬λŸ¬ ν”Œλž«νΌμ—μ„œ λ™μž‘ν•  수 μžˆλ„λ‘ ν•œλ‹€.
  • λ©”λͺ¨λ¦¬ 관리: Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•œλ‹€. μ΄λŠ” λ©”λͺ¨λ¦¬λ₯Ό μš©λ„μ— 따라 νž™(Heap), μŠ€νƒ(Stack), λ©”μ†Œλ“œ μ˜μ—­(Method Area)으둜 κ΅¬λΆ„ν•˜μ—¬ κ΄€λ¦¬ν•œλ‹€.
    • νž™μ€ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ €μž₯ν•˜λŠ” 데 μ‚¬μš©λ˜κ³ , μŠ€νƒμ€ λ©”μ„œλ“œκ°€ 호좜될 λ•Œ λ©”μ†Œλ“œμ˜ μŠ€νƒ ν”„λ ˆμž„μ΄ μ €μž₯λ˜λŠ” μ˜μ—­μœΌλ‘œ λ©”μ†Œλ“œμ˜ 호좜과 κ΄€κ³„λ˜λŠ” μ§€μ—­ λ³€μˆ˜μ™€ λ§€κ°œλ³€μˆ˜λ₯Ό μ €μž₯ν•˜λŠ” 데 μ‚¬μš©
    • λ©”μ„œλ“œ μ˜μ—­μ€ 클래슀 정보와 μƒμˆ˜ ν’€ 등을 μ €μž₯ν•˜λŠ” 데 μ‚¬μš©
    • ν΄λž˜μŠ€μ— λŒ€ν•œ 정보와 ν•¨κ»˜ 정적 λ³€μˆ˜(static variable)κ°€ μ €μž₯
  • κ°€λΉ„μ§€ 컬렉터(garbage collector): μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό μžλ™μœΌλ‘œ νšŒμˆ˜ν•˜μ—¬ κ°œλ°œμžκ°€ λ”°λ‘œ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•˜μ§€ μ•Šμ•„λ„ λ˜λ―€λ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 신뒰성을 ν–₯μƒμ‹œν‚¬ 수 μžˆλ‹€.
  • JIT 컴파일러(Just-In-Time compiler): μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ μƒμ„±ν•œ byte codeλ₯Ό ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰ 쀑인 λŸ°νƒ€μž„μ— λ°”λ‘œ κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•˜λŠ” 데 μ‚¬μš©ν•œλ‹€. 동적 λ²ˆμ—­(dynamic translation)이라고도 λΆˆλ¦¬λŠ” 이 기법은 ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 속도λ₯Ό ν–₯μƒμ‹œν‚€κΈ° μœ„ν•΄ κ°œλ°œλ˜μ—ˆλ‹€. 동적 λ‘œλ”©: JVM의 λŸ°νƒ€μž„μ— 클래슀λ₯Ό λ‘œλ“œν•˜κ³  클래슀의 λ©”μ†Œλ“œ, ν•„λ“œ, 상속관계 등을 λΆ„μ„ν•œλ‹€. 이 동적 λ‘œλ“œλ₯Ό λ‹΄λ‹Ήν•˜λŠ” 클래슀 λ‘œλ”(class loader)λŠ” 클래슀 μ°Έμ‘°μ‹œμ μ— 클래슀 νŒŒμΌμ„ λ‘œλ“œν•˜κ³  객체λ₯Ό μƒμ„±ν•œλ‹€. λ˜ν•œ λŸ°νƒ€μž„μ— 클래슀 κ°„ μ°Έμ‘° 관계λ₯Ό ν•΄μ„ν•˜μ—¬ νŠΉμ • ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©λ  λ©”μ„œλ“œμ™€ 속성을 κ²°μ •ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

GC

  • Minor GC
    • Young μ˜μ—­μ—μ„œ GCκ°€ λ°œμƒ μ‹œ
  • Major GC
    • Old μ˜μ—­μ΄ 가득차면 λ°œμƒ
  • Full GC
    • Old μ˜μ—­μ—μ„œ λ°œμƒν•˜λŠ” GC

GC 삼색 λ§ˆν‚Ή

삼색 λ§ˆν‚Ήμ€ GCμ•Œκ³ λ¦¬μ¦˜μ˜ μΌμ’…μœΌλ‘œ λ©”λͺ¨λ¦¬μ—μ„œ μƒμ‘΄ν•˜κ³  νšŒμˆ˜ν•΄μ•Ό ν•˜λŠ” 객체 정보λ₯Ό ν‘œμ‹œν•˜λŠ” 데 μ‚¬μš©λœλ‹€. JVM은 λ©”λͺ¨λ¦¬μ— μžˆλŠ” 객체λ₯Ό 흰색, νšŒμƒ‰, κ²€μ •μƒ‰μœΌλ‘œ λ‚˜λˆˆλ‹€.

  1. 흰색(White): GC에 μ˜ν•΄ μŠ€μΊ”λ˜μ§€ μ•ŠλŠ” 객체
  2. 검정색(Black): GC에 μ˜ν•΄ μŠ€μΊ”λ˜μ—ˆκ³  객체와 ν•΄λ‹Ή 객체λ₯Ό μ°Έμ‘°ν•˜λŠ” λ‹€λ₯Έ 객체가 λͺ¨λ‘ 생쑴
  3. νšŒμƒ‰(Grey): GC에 μ˜ν•΄ μŠ€μΊ”λ˜μ—ˆμ§€λ§Œ 객체가 참쑰된 λ‹€λ₯Έ κ°μ²΄λŠ” μŠ€μΊ”λ˜μ§€ μ•Šμ•˜λ‹€λŠ”κ²ƒμ„ 의미
  • STW(stop-the-world) GC사이클이 λ°œμƒν•˜μ—¬ κ°€λΉ„μ§€λ₯Ό μˆ˜μ§‘ν•˜λŠ” λ™μ•ˆ GCλ₯Ό μ‹€ν–‰ν•˜λŠ” μŠ€λ ˆλ“œλ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ μŠ€λ ˆλ“œλŠ” λͺ¨λ‘ μž‘μ—…μ„ λ©ˆμΆ˜λ‹€. λŒ€κ°œμ˜ 경우 GC νŠœλ‹μ΄λž€ STW μ‹œκ°„μ„ μ€„μ΄λŠ”κ²ƒμ΄λ‹€.