Skip to content

Latest commit

Β 

History

History
77 lines (54 loc) Β· 4.56 KB

File metadata and controls

77 lines (54 loc) Β· 4.56 KB

Java 21 - Virtual Thread

Java 21?

  • 2021λ…„ μΆœμ‹œλœ Java 17 이후 2λ…„λ§Œμ— μΆœμ‹œλœ Java의 4번째 LTS(Long Term Support) 버전
  • μ£Όμš” λ³€ν™”λŠ” λ‹€μŒκ³Ό κ°™λ‹€.
  • 이 κΈ€μ—μ„œλŠ” Virtual Thread에 λŒ€ν•΄ 닀룬닀.

기쑴의 Java μŠ€λ ˆλ“œ

tranditional thread

  • ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œκ°€ ν•˜λ‚˜μ˜ OS μŠ€λ ˆλ“œμ™€ 1:1 관계λ₯Ό κ°€μ§€λ©°, λ™μΌν•˜κ²Œ λ™μž‘ν•¨
    • κ³ λΉ„μš©μ΄λ©°, κ°œμˆ˜κ°€ 극히 μ œν•œλ˜μ–΄ 있으며, I/O μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©΄ blocking
  • μŠ€λ ˆλ“œλŠ” κ³ λΉ„μš©μ΄κΈ° λ•Œλ¬Έμ—, ν•„μš”ν•  λ•Œλ§ˆλ‹€ μƒμ„±ν•΄μ„œ μ‚¬μš©ν•˜λŠ” λŒ€μ‹  μŠ€λ ˆλ“œ 풀에 일정 개수 μŠ€λ ˆλ“œλ₯Ό ν• λ‹Ήν•˜κ³  ν•„μš”ν•  λ•Œ κΊΌλ‚΄ μ“°κ³  λ‹€ μ“°λ©΄ λ‹€μ‹œ λ°˜ν™˜
  • ν˜„λŒ€μ˜ λŒ€λΆ€λΆ„μ˜ μžλ°”μ˜ μ‚¬μš©μ²˜μΈ μ„œλ²„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ—¬λŸ¬ I/O μž‘μ—…μ„ λ™λ°˜ν•˜λ©°, 이에 따라 μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒ
    • μŠ€λ ˆλ“œκ°€ I/O λŒ€κΈ° λ“±μœΌλ‘œ 인해 μ‚¬μš© λΆˆκ°€λŠ₯ν•˜κ²Œ 되고, μŠ€λ ˆλ“œ ν’€ λ‚΄ λͺ¨λ“  μŠ€λ ˆλ“œκ°€ μ‚¬μš© λΆˆκ°€λŠ₯ν•˜λ©΄ λ’€μ˜ μš”μ²­λ“€μ€ λŒ€κΈ° νμ—μ„œ λŒ€κΈ°
    • 이 문제λ₯Ό ν•΄κ²°ν•˜μžκ³  μŠ€λ ˆλ“œ ν’€ λ‚΄ μŠ€λ ˆλ“œ 수λ₯Ό λŠ˜λ¦¬μžλ‹ˆ, 물리적으둜 ν•œκ³„κ°€ 있음
  • μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 비동기 I/O (reactor)κ°€ λ„μž…λ˜λŠ” μ‹œλ„λ„ μžˆμ—ˆμœΌλ‚˜, λ„ˆλ¬΄ μ½”λ“œκ°€ μ–΄λ ΅κ³  μ½”λ“œ μ‹€ν–‰ 흐름을 μ˜ˆμΈ‘ν•˜κΈ° μ–΄λ €μ›Œμ§€λŠ” 문제둜 잘 μ‚¬μš©λ˜μ§€λŠ” μ•ŠμŒ

Java 21에 λ„μž…λœ 가상 μŠ€λ ˆλ“œ

virtual thread

  • κΈ°μ‘΄ μŠ€λ ˆλ“œλŠ” ν”Œλž«νΌ μŠ€λ ˆλ“œ(Platform Thread)λΌλŠ” λͺ…μΉ­μœΌλ‘œ, μ—¬μ „νžˆ Thread Pool 내에 쑴재
  • κΈ°μ‘΄ μŠ€λ ˆλ“œμ™€ λ‹€λŒ€λ‹€ 관계λ₯Ό κ°–λŠ” 가상 μŠ€λ ˆλ“œκ°€ λ„μž…λ¨
  • 가상 μŠ€λ ˆλ“œλŠ” λ‹€μŒκ³Ό 같은 νŠΉμ§•μ„ 가짐
    • κΈ°μ‘΄ μŠ€λ ˆλ“œλ³΄λ‹€ 가벼움 - 생성 λΉ„μš©, μŠ€μœ„μΉ­ λΉ„μš©μ΄ μ €λ ΄
    • κΈ°μ‘΄ μŠ€λ ˆλ“œλ³΄λ‹€ 효율적 - I/O에 μ˜ν•΄ OSμŠ€λ ˆλ“œκ°€ 놀지 μ•Šλ„λ‘ λ™μž‘

κΈ°μ‘΄ μŠ€λ ˆλ“œλ³΄λ‹€ 가벼움

  • Context Switching λΉ„μš©μ΄ 더 적음
  • λ©”λͺ¨λ¦¬λ₯Ό 덜 μ‚¬μš©
  • I/O blocking에 μ˜ν•œ μ‹œκ°„ 낭비도 더 적음

κΈ°μ‘΄ μŠ€λ ˆλ“œλ³΄λ‹€ 효율적

  • ν•˜λ‚˜μ˜ 가상 μŠ€λ ˆλ“œκ°€ μ—¬λŸ¬ ν”Œλž«νΌ μŠ€λ ˆλ“œμ— μ˜ν•΄ μ‚¬μš©λ˜κΈ°λ„ ν•˜λ©°, ν•˜λ‚˜μ˜ ν”Œλž«νΌ μŠ€λ ˆλ“œλŠ” μ—¬λŸ¬ 가상 μŠ€λ ˆλ“œλ₯Ό μ‚¬μš© (N:M)
  • ν”Œλž«νΌ μŠ€λ ˆλ“œκ°€ μ‚¬μš© 쀑인 가상 μŠ€λ ˆλ“œκ°€ I/O에 μ˜ν•΄ 응닡 λŒ€κΈ° μƒνƒœμ— μ ‘μ–΄λ“€λ©΄, λ‹€λ₯Έ 가상 μŠ€λ ˆλ“œλ₯Ό μ‹€ν–‰ν•˜μ—¬ ν”Œλž«νΌ μŠ€λ ˆλ“œκ°€ 놀지 μ•Šλ„λ‘ 함
  • λ”°λΌμ„œ, λ™κΈ°λ‘œ λ™μž‘ν•˜λ„λ‘ 짜인 μ½”λ“œλ„ μ‹€μ œλ‘œλŠ” λΉ„λ™κΈ°μ²˜λŸΌ λ™μž‘ν•˜λ„λ‘ ν•  수 있음

가상 μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•  λ•Œ μ£Όμ˜ν•  점

Pinned Threadκ°€ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ 주의

  • Pinned λž€, 가상 μŠ€λ ˆλ“œκ°€ 캐리어에 κ³ μ •λ˜λŠ” ν˜„μƒμ„ 말함
    • μΊλ¦¬μ–΄λž€, 가상 μŠ€λ ˆλ“œμ˜ μ‹€ν–‰ 주체둜 ν”„λ‘œμ„Έμ„œμ™€ λ™μΌν•˜λ‹€κ³  보면 됨
  • 가상 μŠ€λ ˆλ“œκ°€ 캐리어에 κ³ μ •λ˜λ©΄ ν•΄λ‹Ή 가상 μŠ€λ ˆλ“œκ°€ blocking λ˜μ—ˆμ„ λ•Œ 이λ₯Ό μ‹€ν–‰ 쀑인 ν”Œλž«νΌ μŠ€λ ˆλ“œλ„ ν•¨κ»˜ blocking
    • 즉, κΈ°μ‘΄ μŠ€λ ˆλ“œμ˜ λ™μž‘κ³Ό 동일해짐
  • Pinned ThreadλŠ” 두 κ°€μ§€ μƒν™©μ—μ„œ λ°œμƒ
    • synchronized μ‚¬μš©
    • λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œλ‚˜ μ™ΈλΆ€ ν•¨μˆ˜λ₯Ό μ‚¬μš©

ThreadLocal μ‚¬μš© μ‹œ 주의

  • 가상 μŠ€λ ˆλ“œμ˜ κ°œμˆ˜λŠ” 맀우 많음
    • 이 가상 μŠ€λ ˆλ“œλ§ˆλ‹€ ThreadLocal을 μ‚¬μš©ν•˜κ²Œλ˜λ©΄, κ·Έ 크기가 아무리 μž‘λ”λΌλ„ μ°¨μ§€ν•˜λŠ” λ©”λͺ¨λ¦¬μ˜ 양을 λ¬΄μ‹œν•  수 μ—†κ²Œ 됨

Pooling이 ν•„μš” μ—†μŒ

  • 가상 μŠ€λ ˆλ“œμ˜ 생성 λΉ„μš©μ€ 맀우 μ €λ ΄
  • λ”°λΌμ„œ ν•„μš” μ‹œλ§ˆλ‹€ μƒμ„±ν•˜λŠ” 것이 λ³„λ„μ˜ μŠ€λ ˆλ“œ 풀을 μ‚¬μš©ν•˜λŠ” 것보닀 κ°„νŽΈ

CPUλ₯Ό 주둜 μ‚¬μš©ν•˜λŠ” μž‘μ—…μ—μ„œλŠ” μ„±λŠ₯ κ°œμ„ μ„ κΈ°λŒ€ν•  수 μ—†μŒ

  • κΈ°μ‘΄ μŠ€λ ˆλ“œμ˜ λ¬Έμ œλŠ” I/Oκ°€ λ°œμƒν•  λ•Œ blocking이 λ°œμƒν•œλ‹€λŠ” 점
  • 가상 μŠ€λ ˆλ“œκ°€ κ°œμ„ ν•œ 것 μ—­μ‹œ 이 λΆ€λΆ„μœΌλ‘œ, I/Oκ°€ λ°œμƒν•΄λ„ μŠ€λ ˆλ“œκ°€ wait μƒνƒœκ°€ λ˜λŠ” λŒ€μ‹  λ‹€λ₯Έ λ™μž‘μ„ μ‹€ν–‰ν•  수 μžˆλ„λ‘ ν•œ 것
  • λ”°λΌμ„œ μ½”λ“œ 자체λ₯Ό 더 λΉ λ₯΄κ²Œ μ‹€ν–‰ν•˜λŠ” 것은 μ•„λ‹ˆλ©°, 였히렀 CPUλ₯Ό μ‚¬μš©ν•˜λŠ” λ™μž‘μ—μ„œλŠ” Thread Switching λ™μž‘μ΄ 더 자주 λ°œμƒν•˜λ―€λ‘œ μ•½κ°„ μ„±λŠ₯이 μ €ν•˜λœλ‹€κ³  λ³Ό 수 있음

좜처