λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

빈 ꡬ멍 μ±„μš°κΈ°

[JVM] HotSpot compilation

좜처

ChatGPT


HotSpot μ»΄νŒŒμΌλŸ¬λŠ” μžλ°” 가상 λ¨Έμ‹ (Java Virtual Machine, JVM)μ—μ„œ Just-In-Time (JIT) 컴파일러의 μ€‘μš”ν•œ κ΅¬ν˜„μ²΄λ‘œ, Java ν”„λ‘œκ·Έλž¨μ„ μ΅œμ ν™”ν•˜μ—¬ μ‹€ν–‰ μ„±λŠ₯을 λ†’μ΄λŠ” 역할을 ν•œλ‹€. HotSpot μ»΄νŒŒμΌλŸ¬λŠ” Java ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 쀑에 λŸ°νƒ€μž„ ν”„λ‘œνŒŒμΌλ§μ„ 톡해 "ν•«μŠ€νŒŸ(HotSpot)"을 μ‹λ³„ν•˜κ³ , μ΄λŸ¬ν•œ μ½”λ“œ μ˜μ—­μ„ μ»΄νŒŒμΌν•˜κ³  μ΅œμ ν™”ν•œλ‹€. 이λ₯Ό 톡해 μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ‹€ν–‰ μ„±λŠ₯을 크게 ν–₯μƒμ‹œν‚¬ 수 μžˆλ‹€.

 

HotSpot Compilation의 λ™μž‘ 방식

1. 인터프리터 μ‹€ν–‰

1. 초기 μ‹€ν–‰

Java ν”„λ‘œκ·Έλž¨μ΄ 처음 싀행될 λ•Œ, JVM은 인터프리터λ₯Ό μ‚¬μš©ν•΄ λ°”μ΄νŠΈμ½”λ“œλ₯Ό ν•œ 쀄씩 ν•΄μ„ν•˜κ³  μ‹€ν–‰ν•œλ‹€. 이 방식은 초기 μ‹œμž‘ 속도λ₯Ό λΉ λ₯΄κ²Œ ν•  수 μžˆμ§€λ§Œ, 반볡적으둜 μ‹€ν–‰λ˜λŠ” μ½”λ“œμ˜ 경우 μ„±λŠ₯이 λ–¨μ–΄μ§ˆ 수 이ㄸ사.

2.ν”„λ‘œνŒŒμΌλ§ μ‹œμž‘

인터프리터 λͺ¨λ“œμ—μ„œ JVM은 λ©”μ†Œλ“œ 호좜 νšŸμˆ˜μ™€ 루프 μ‹€ν–‰ 횟수 λ“±μ˜ λŸ°νƒ€μž„ 정보λ₯Ό μˆ˜μ§‘ν•΄ μ–΄λ–€ μ½”λ“œκ°€ 자주 μ‹€ν–‰λ˜λŠ”μ§€ νŒŒμ•…ν•œλ‹€.

2. ν•«μŠ€νŒŸ(HotSpot) 감지

1. ν•«μŠ€νŒŸ 식별

JVM은 μˆ˜μ§‘λœ λŸ°νƒ€μž„ ν”„λ‘œνŒŒμΌλ§ 데이터λ₯Ό 뢄석해, 자주 ν˜ΈμΆœλ˜κ±°λ‚˜ λ°˜λ³΅λ˜λŠ” μ½”λ“œ(ν•«μŠ€νŒŸ)을 μ‹λ³„ν•œλ‹€. 일반적으둜 이 ν•«μŠ€νŒŸμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 전체 μ‹€ν–‰ μ‹œκ°„ 쀑 상당 뢀뢄을 μ°¨μ§€ν•˜λŠ” 곳이닀.

3. JIT 컴파일

1. 컴파일 트리거

νŠΉμ • μž„κ³„κ°’μ„ μ΄ˆκ³Όν•˜λŠ” λΉˆλ„λ‘œ μ‹€ν–‰λ˜λŠ” λ©”μ†Œλ“œκ°€ κ°μ§€λ˜λ©΄, JIT μ»΄νŒŒμΌλŸ¬κ°€ ν˜ΈμΆœλœλ‹€. μ΄λŠ” λ©”μ†Œλ“œλ₯Ό λ„€μ΄ν‹°λΈŒ λ¨Έμ‹  μ½”λ“œλ‘œ λ³€ν™˜ν•˜μ—¬ μ„±λŠ₯을 μ΅œμ ν™”ν•˜λŠ” 과정이닀.

2. ν΄λΌμ΄μ–ΈνŠΈ(C1)와 μ„œλ²„(C2) 컴파일러

C1 컴파일러

  • λΉ λ₯Έ 컴파일과 즉각적인 μ„±λŠ₯ κ°œμ„ μ„ μœ„ν•΄ κ²½λŸ‰μ˜ μ΅œμ ν™”λ₯Ό μˆ˜ν–‰ν•œλ‹€. 주둜 ν΄λΌμ΄μ–ΈνŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©ν•œλ‹€.

C2 컴파일러

  • 더 κΉŠμ€ μ΅œμ ν™” 기법을 μ‚¬μš©ν•΄ μ„±λŠ₯을 κ·ΉλŒ€ν™”ν•œλ‹€. μ„œλ²„ ν™˜κ²½μ—μ„œ λ”μš± μ ν•©ν•˜λ©°, μ’€ 더 λ§Žμ€ μ‹œκ°„κ³Ό λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•΄ μ΅œμ ν™”λ₯Ό μˆ˜ν–‰ν•œλ‹€.

4. μ΅œμ ν™”

인라인 inlining

자주 ν˜ΈμΆœλ˜λŠ” λ©”μ†Œλ“œλ₯Ό 호좜 지점에 직접 μ‚½μž…ν•˜μ—¬ 호좜 μ˜€λ²„ν—€λ“œλ₯Ό 쀄인닀.

루프 μ΅œμ ν™”

루프 언둀링 및 루프 μΈλ³€μˆ˜ 제거λ₯Ό 톡해 반볡 μ‹€ν–‰ μ„±λŠ₯을 κ°œμ„ ν•œλ‹€.

경둜 단좕

쑰건 λΆ„κΈ°λ₯Ό 뢄석해 자주 μ‹€ν–‰λ˜λŠ” 경둜λ₯Ό μ΅œμ ν™”ν•˜κ³ , λ“œλ¬Έ 경둜의 μ‹€ν–‰ λΉ„μš©μ„ 쀄인닀.

ν”„λ‘œνŒŒμΌ 기반 μ΅œμ ν™”

λŸ°νƒ€μž„ 정보λ₯Ό λ°”νƒ•μœΌλ‘œ ν•œ μ½”λ“œμ˜ λΆ„κΈ° 예츑 및 기타 μ΅œμ ν™” μ „λž΅μ„ μ‚¬μš©ν•œλ‹€.

5. λ°μ˜΅ν‹°λ§ˆμ΄μ œμ΄μ…˜ Deoptimization

동적 적응

JIT μ»΄νŒŒμΌλŸ¬λŠ” λŸ°νƒ€μž„μ— ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ νŒ¨ν„΄μ΄ λ³€ν•  수 μžˆλ‹€λŠ” 사싀을 κ³ λ €ν•΄, ν•„μš”μ— 따라 컴파일된 μ½”λ“œλ₯Ό λ¬΄νš¨ν™”ν•˜κ³  인터프리터 λͺ¨λ“œλ‘œ λ‹€μ‹œ μ „ν™˜ν•  수 μžˆλ‹€. μ΄λŠ” "λ°μ˜΅ν‹°λ§ˆμ΄μ œμ΄μ…˜"이라고 ν•˜λ©°, μ΅œμ ν™”κ°€ 잘λͺ»λœ 가정을 기반으둜 μ΄λ£¨μ–΄μ‘Œμ„ λ•Œ λ°œμƒν•  수 μžˆλ‹€.

6. 온-μŠ€νƒ ꡐ체 On-Stack Replacement, OSR

λŸ°νƒ€μž„ μ΅œμ ν™”

κΈ΄ λ£¨ν”„λ‚˜ λ¬΄ν•œ λ£¨ν”„μ²˜λŸΌ μ§€μ†μ μœΌλ‘œ μ‹€ν–‰λ˜λŠ” μ½”λ“œ 블둝에 λŒ€ν•΄, 루프 쀑간에 μ΅œμ ν™”λœ μ½”λ“œλ₯Ό μ‚½μž…ν•΄ μ‹€ν–‰ν•˜λŠ” 기술. 이λ₯Ό 톡해 이미 μ‹œμž‘λœ λ£¨ν”„μ˜ μ„±λŠ₯도 κ°œμ„ ν•  수 μžˆλ‹€.

 

HotSpot Compilation의 μ£Όμš” νŠΉμ§•

1. μ μ‘ν˜• μ΅œμ ν™”

HotSpot μ»΄νŒŒμΌλŸ¬λŠ” ν”„λ‘œκ·Έλž¨μ˜ λŸ°νƒ€μž„ νŠΉμ„±μ— κΈ°λ°˜ν•΄ μ μ‘ν˜•μœΌλ‘œ μ΅œμ ν™”λ₯Ό μˆ˜ν–‰ν•œλ‹€. 즉, ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 도쀑 μ½”λ“œ μ‚¬μš© νŒ¨ν„΄μ— 따라 μ΅œμ ν™” μ „λž΅μ„ λ™μ μœΌλ‘œ λ³€κ²½ν•œλ‹€.

2. ν”„λ‘œνŒŒμΌ 기반 μ΅œμ ν™”

λŸ°νƒ€μž„ ν”„λ‘œνŒŒμΌλ§ 데이터λ₯Ό μ΄μš©ν•΄ μ‹€μ œ μ‚¬μš© νŒ¨ν„΄μ— λ§žλŠ” μ΅œμ ν™”λ₯Ό μˆ˜ν–‰ν•œλ‹€. μ΄λŠ” μ»΄νŒŒμΌλŸ¬κ°€ 사전에 μ•Œ 수 μ—†λŠ” 정보λ₯Ό λŸ°νƒ€μž„μ— νšλ“ν•΄ μ΅œμ ν™”μ— ν™œμš©ν•˜λŠ” 방식이닀.

3. 단기 및 μž₯κΈ° μ΅œμ ν™”

C1κ³Ό C2 컴파일러λ₯Ό ν™œμš©ν•΄ λ‹¨κΈ°μ μœΌλ‘œλŠ” λΉ λ₯Έ μ„±λŠ₯을 μ œκ³΅ν•˜κ³ , μž₯κΈ°μ μœΌλ‘œλŠ” 심측 μ΅œμ ν™”λ₯Ό 톡해 μ΅œλŒ€ μ„±λŠ₯을 λŒμ–΄λ‚Έλ‹€.

4. λ°μ˜΅ν‹°λ§ˆμ΄μ œμ΄μ…˜

동적 μ–Έμ–΄ νŠΉμ„±μ— 맞좰 ν•„μš”ν•  경우 μ΅œμ ν™”λ₯Ό μ·¨μ†Œν•˜κ³ , μƒˆλ‘œμš΄ μ‹€ν–‰ νŒ¨ν„΄μ— 맞게 μž¬μ΅œμ ν™”λ₯Ό μˆ˜ν–‰ν•  수 μžˆλ‹€.

5. 온-μŠ€νƒ ꡐ체 OSR

ν”„λ‘œκ·Έλž¨μ˜ 일뢀가 이미 μ‹€ν–‰ 쀑일 λ•Œμ—λ„ μ΅œμ ν™”λœ μ½”λ“œλ₯Όκ΅μ²΄μ•  μ„±λŠ₯을 κ°œμ„ ν•œλ‹€.

 

HotSpot Compilation의 이점

1. ν–₯μƒλœ μ„±λŠ₯

인터프리터 λͺ¨λ“œμ—μ„œ 컴파일 λͺ¨λ“œλ‘œ  μ „ν™˜ν•¨μœΌλ‘œμ¨ μ‹€ν–‰ μ„±λŠ₯이 크게 ν–₯μƒλœλ‹€. μ΅œμ ν™”λœ λ„€μ΄ν‹°λΈŒ μ½”λ“œλŠ” ν•΄μ„λœ λ°”μ΄νŠΈμ½”λ“œλ³΄λ‹€ 훨씬 λΉ λ₯΄κ²Œ μ‹€ν–‰λœλ‹€.

2. λΉ λ₯Έ μ‹œμž‘ μ‹œκ°„

초기 인터프리터λ₯Ό μ‚¬μš©ν•΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ‹œμž‘ μ‹œκ°„μ„ 쀄일 수 μžˆλ‹€. 이후 μ μ§„μ μœΌλ‘œ JIT μ»΄νŒŒμΌμ„ 톡해 μ„±λŠ₯을 μ΅œμ ν™”ν•œλ‹€.

3. 동적 적응성

ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ ν™˜κ²½κ³Ό μž…λ ₯에 따라 μ΅œμ ν™” μ „λž΅μ„ λ™μ μœΌλ‘œ μ‘°μ •ν•˜μ—¬ λ‹€μ–‘ν•œ 상황에 적응할 수 μžˆλ‹€.

4. λ©”λͺ¨λ¦¬ μ‚¬μš© νš¨μœ¨μ„±

λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ 할당을 μ΅œμ†Œν™”ν•˜κ³ , λΆˆν•„μš”ν•œ 객체 생성 및 GC(가비지 μ»¬λ ‰μ…˜) 뢀담을 μ€„μ΄λŠ” μ΅œμ ν™”λ₯Ό μˆ˜ν–‰ν•œλ‹€.

 

κ²°λ‘ 

HotSpot μ»΄νŒŒμΌλŸ¬λŠ” μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ‹€ν–‰ μ„±λŠ₯을 μ΅œμ ν™”ν•˜λŠ” 데 μ€‘μš”ν•œ 역할을 ν•œλ‹€. λŸ°νƒ€μž„ ν”„λ‘œνŒŒμΌλ§μ„ 톡해 자주 μ‚¬μš©λ˜λŠ” μ½”λ“œ μ˜μ—­μ„ μ‹λ³„ν•˜κ³ , 이λ₯Ό λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ μ»΄νŒŒμΌν•˜μ—¬ μ‹€ν–‰ 속도λ₯Ό 크게 ν–₯μƒμ‹œν‚¨λ‹€. HotSpot의 μ μ‘ν˜• μ΅œμ ν™”μ™€ 동적 λ°μ˜΅ν‹°λ§ˆμ΄μ œμ΄μ…˜μ€ λ‹€μ–‘ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν™˜κ²½μ—μ„œ 높은 μ„±λŠ₯κ³Ό μœ μ—°μ„±μ„ μ œκ³΅ν•œλ‹€.

μ΄λŸ¬ν•œ νŠΉμ„± 덕뢄에 HotSpot μ»΄νŒŒμΌλŸ¬λŠ” Java κ°œλ°œμžλ“€μ—κ²Œ 큰 이점을 μ œκ³΅ν•˜λ©°, Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ‹€μ–‘ν•œ ν”Œλž«νΌμ—μ„œ 효율적으둜 μ‹€ν–‰λ˜λ„λ‘ μ§€μ›ν•œλ‹€. Java의 "Write Once, Run Anywhere" 철학을 μ‹€ν˜„ν•˜λŠ” 데 μ€‘μš”ν•œ 역할을 ν•˜λŠ” 것이닀.