Search
πŸͺ’

jvm

JVM 에 λŒ€ν•΄μ„œ

β€’
μžλ°” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ν™˜κ²½μ„ λ§Œλ“€μ–΄ μ£ΌλŠ” μ†Œν”„νŠΈμ›¨μ–΄
β€’
μžλ°” μ½”λ“œλ₯Ό μ»΄νŒŒμΌν•˜μ—¬ .class λ°”μ΄νŠΈ μ½”λ“œλ‘œ λ§Œλ“€λ©΄ 이 μ½”λ“œκ°€ μžλ°” 가상 λ¨Έμ‹  ν™˜κ²½μ—μ„œ μ‹€ν–‰
β€’
JavaλŠ” ν”Œλž«νΌμ— 쒅속적이지 μ•Šμ§€λ§Œ JVM은 ν”Œλž«νΌμ— 쒅속적
β€’
interpreter 방식 JIT 방식 혼용
β—¦
interpreter 방식: ν•œ 쀄씩 해석, μ‹€ν–‰
β—¦
JIT 방식:
β–ͺ
λ°”μ΄νŠΈμ½”λ“œλ₯Ό JIT 컴파일러λ₯Ό μ΄μš©ν•΄ ν”„λ‘œκ·Έλž¨μ„ μ‹€μ œ μ‹€ν–‰ν•˜λŠ” μ‹œμ (λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” μ‹œμ )에 각 OS에 λ§žλŠ” Native Code둜 λ³€ν™˜
β–ͺ
JIT μ»΄νŒŒμΌλŸ¬λŠ” 같은 μ½”λ“œλ₯Ό 맀번 ν•΄μ„ν•˜μ§€ μ•Šκ³ , μ‹€ν–‰ν•  λ•Œ μ»΄νŒŒμΌμ„ ν•˜λ©΄μ„œ ν•΄λ‹Ή μ½”λ“œλ₯Ό μΊμ‹±ν•΄λ²„λ¦½λ‹ˆλ‹€. μ΄ν›„μ—λŠ” 바뀐 λΆ€λΆ„λ§Œ μ»΄νŒŒμΌν•˜κ³ , λ‚˜λ¨Έμ§€λŠ” μΊμ‹±λœ μ½”λ“œλ₯Ό μ‚¬μš©

JVM λ™μž‘ 방식

1.
μžλ°”λ‘œ 개발된 ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ©΄ JVM은 OSλ‘œλΆ€ν„° λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•©λ‹ˆλ‹€.
2.
μžλ°” 컴파일러(javac)κ°€ μžλ°” μ†ŒμŠ€μ½”λ“œ(.java)λ₯Ό μžλ°” λ°”μ΄νŠΈμ½”λ“œ(.class)둜 μ»΄νŒŒμΌν•©λ‹ˆλ‹€.
3.
Class Loaderλ₯Ό 톡해 JVM Runtime Data Area둜 λ‘œλ”©ν•©λ‹ˆλ‹€.
4.
Runtime Data Area에 λ‘œλ”© 된 .class듀은 Execution Engine을 톡해 ν•΄μ„ν•©λ‹ˆλ‹€.
5.
ν•΄μ„λœ λ°”μ΄νŠΈ μ½”λ“œλŠ” Runtime Data Area의 각 μ˜μ—­μ— λ°°μΉ˜λ˜μ–΄ μˆ˜ν–‰ν•˜λ©° 이 κ³Όμ •μ—μ„œ Execution Engine에 μ˜ν•΄ GC의 μž‘λ™κ³Ό μŠ€λ ˆλ“œ 동기화가 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

JVM λ‚΄λΆ€ ꡬ쑰

β€’
클래슀 λ‘œλ”(Class Loader)
β—¦
ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰ 쀑인 λŸ°νƒ€μž„μ—μ„œμ•Ό λͺ¨λ“  μ½”λ“œκ°€ μžλ°” 가상 λ¨Έμ‹ κ³Ό μ—°κ²°
β—¦
λ™μ μœΌλ‘œ 클래슀λ₯Ό λ‘œλ”©ν•΄μ£ΌλŠ” 역할을 ν•˜λŠ” 것이 λ°”λ‘œ 클래슀 λ‘œλ”(class loader)
β—¦
JVM이 μš΄μ˜μ²΄μ œλ‘œλΆ€ν„° 할당받은 λ©”λͺ¨λ¦¬ μ˜μ—­μΈ Runtime Data Areas의 Method Area에 배치
β€’
μ‹€ν–‰ μ—”μ§„(Execution Engine)
β—¦
λ‘œλ“œλœ λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” λŸ°νƒ€μž„ λͺ¨λ“ˆμ΄ μ‹€ν–‰ μ—”μ§„
β€’
λŸ°νƒ€μž„ 데이터 μ˜μ—­ (Runtime Data Area)
β—¦
JVM의 λ©”λͺ¨λ¦¬ μ˜μ—­μœΌλ‘œ μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  λ•Œ μ‚¬μš©λ˜λŠ” 데이터듀을 μ μž¬ν•˜λŠ” μ˜μ—­
β€’
κ°€λΉ„μ§€ 컬렉터(Garbage Collector)
β—¦
λ”λŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬λ₯Ό μžλ™μœΌλ‘œ 회수
β—¦
λ”°λΌμ„œ κ°œλ°œμžκ°€ λ”°λ‘œ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•˜μ§€ μ•Šμ•„λ„ λ˜λ―€λ‘œ, λ”μš± μ†μ‰½κ²Œ ν”„λ‘œκ·Έλž˜λ°μ„ ν•  수 μžˆλ„λ‘ λ•λŠ”λ‹€.
β—¦
Heap λ©”λͺ¨λ¦¬ μ˜μ—­μ— 생성(적재)된 객체듀 쀑에 μ°Έμ‘°λ˜μ§€ μ•Šμ€ 객체듀을 탐색 ν›„ μ œκ±°ν•˜λŠ” 역할을 ν•˜λ©° ν•΄λ‹Ή 역할을 ν•˜λŠ” μ‹œκ°„μ€ μ •ν™•νžˆ μ–Έμ œμΈμ§€λ₯Ό μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.
β—¦
GC역할을 μˆ˜ν–‰ν•˜λŠ” μŠ€λ ˆλ“œλ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ λͺ¨λ“  μŠ€λ ˆλ“œλ“€μ€ μΌμ‹œμ •μ§€μƒνƒœ

JVM λ©”λͺ¨λ¦¬ ꡬ쑰

β€’
νž™ μ˜μ—­, λ©”μ„œλ“œ μ˜μ—­μ€ λͺ¨λ“  μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•΄μ„œ μ‚¬μš©
λ©”μ„œλ“œ μ˜μ—­(Method Area)
β€’
클래슀 멀버 λ³€μˆ˜μ˜ 이름, 데이터 νƒ€μž…, μ ‘κ·Ό μ œμ–΄μž 정보와 같은 각쒅 ν•„λ“œ 정보
β€’
λ©”μ„œλ“œ 정보, 데이터 Type 정보, Constant Pool, staticλ³€μˆ˜, final class 등이 μƒμ„±λ˜λŠ” μ˜μ—­
νž™ μ˜μ—­ (Heap Area)
β€’
new ν‚€μ›Œλ“œλ‘œ μƒμ„±λœ 객체와 배열이 μƒμ„±λ˜λŠ” μ˜μ—­
β€’
주기적으둜 GCκ°€ μ œκ±°ν•˜λŠ” μ˜μ—­
β€’
μŠ€νƒ μ˜μ—­, PC λ ˆμ§€μŠ€ν„°, λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ μŠ€νƒ λͺ¨λ“  μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•΄μ„œ μ‚¬μš© (GC의 λŒ€μƒ)
μŠ€νƒ μ˜μ—­(Stack Area)
β€’
μ§€μ—­λ³€μˆ˜, νŒŒλΌλ―Έν„°, 리턴 κ°’, 연산에 μ‚¬μš©λ˜λŠ” μž„μ‹œ κ°’ 등이 μƒμ„±λ˜λŠ” μ˜μ—­
PC λ ˆμ§€μŠ€ν„° (PC Register)
β€’
Threadκ°€ 생성될 λ•Œλ§ˆλ‹€ μƒμ„±λ˜λŠ” μ˜μ—­μœΌλ‘œ ν”„λ‘œκ·Έλž¨ μΉ΄μš΄ν„°, 즉 ν˜„μž¬ μŠ€λ ˆλ“œκ°€ μ‹€ν–‰λ˜λŠ” λΆ€λΆ„μ˜ μ£Όμ†Œμ™€ λͺ…령을 μ €μž₯ν•˜κ³  μžˆλŠ” μ˜μ—­
λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ μŠ€νƒ(Native Method Stack)
1.
μžλ°” μ΄μ™Έμ˜ μ–Έμ–΄(C, C++, μ–΄μ…ˆλΈ”λ¦¬ λ“±)둜 μž‘μ„±λœ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  λ•Œ μ‚¬μš©λ˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μœΌλ‘œ 일반적인 C μŠ€νƒμ„ μ‚¬μš©ν•©λ‹ˆλ‹€.
2.
보톡 C/C++ λ“±μ˜ μ½”λ“œλ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ μŠ€νƒμ„ λ§ν•˜λ©° (JNI) μžλ°” μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ λ³€ν™˜λœ μžλ°” λ°”μ΄νŠΈ μ½”λ“œλ₯Ό 읽고 ν•΄μ„ν•˜λŠ” 역할을 ν•˜λŠ” 것이 μžλ°” 인터프리터(interpreter)

κ°€λΉ„μ§€ 컬렉터

β€’
μžλ°”μ˜ λ©”λͺ¨λ¦¬ 관리 방법 μ€‘μ˜ ν•˜λ‚˜λ‘œ JVM의 Heap μ˜μ—­μ—μ„œ λ™μ μœΌλ‘œ ν• λ‹Ήν–ˆλ˜ λ©”λͺ¨λ¦¬ μ˜μ—­ 쀑 ν•„μš” μ—†κ²Œ 된 λ©”λͺ¨λ¦¬ μ˜μ—­μ„ 주기적으둜 μ‚­μ œν•˜λŠ” ν”„λ‘œμ„ΈμŠ€
β€’
μ°Έμ‘°κ°€ ν•΄μ œλœ 객체(unreachable)κ°€ GC λŒ€μƒ

μž₯점

β€’
개발자 μž…μž₯μ—μ„œ λ©”λͺ¨λ¦¬ 관리, λ©”λͺ¨λ¦¬ λˆ„μˆ˜(Memory Leak) λ¬Έμ œμ—μ„œ λŒ€ν•΄ μ™„λ²½ν•˜κ²Œ κ΄€λ¦¬ν•˜μ§€ μ•Šμ•„λ„ λ˜μ–΄ 였둯이 κ°œλ°œμ—λ§Œ 집쀑할 수 μžˆλ‹€λŠ” μž₯점

단점

β€’
κ°œλ°œμžκ°€ λ©”λͺ¨λ¦¬κ°€ μ–Έμ œ ν•΄μ œλ˜λŠ”μ§€ μ •ν™•ν•˜κ²Œ μ•Œ 수 μ—†λ‹€.
β€’
κ°€λΉ„μ§€ μ»¬λ ‰μ…˜(GC)이 λ™μž‘ν•˜λŠ” λ™μ•ˆμ—λŠ” λ‹€λ₯Έ λ™μž‘μ„ λ©ˆμΆ”κΈ° λ•Œλ¬Έμ— μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•œλ‹€.

Mark and Sweep μ•Œκ³ λ¦¬μ¦˜

β€’
Mark κ³Όμ • : λ¨Όμ € Rootλ‘œλΆ€ν„° κ·Έλž˜ν”„ 순회λ₯Ό 톡해 μ—°κ²°λœ 객체듀을 μ°Ύμ•„λ‚΄μ–΄ 각각 μ–΄λ–€ 객체λ₯Ό μž μ‘°ν•˜κ³  μžˆλŠ”μ§€ μ°Ύμ•„μ„œ λ§ˆν‚Ήν•©λ‹ˆλ‹€.
β€’
Sweep κ³Όμ • : μ°Έμ‘°ν•˜κ³  μžˆμ§€ μ•Šμ€ 객체 즉 Unreachable 객체듀을 Heapμ—μ„œ μ œκ±°ν•©λ‹ˆλ‹€.
β€’
Compact κ³Όμ • : Sweep 후에 λΆ„μ‚°λœ 객체듀을 Heap의 μ‹œμž‘ μ£Όμ†Œλ‘œ λͺ¨μ•„ λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ήλœ λΆ€λΆ„κ³Ό κ·Έλ ‡μ§€ μ•Šμ€ λΆ€λΆ„μœΌλ‘œ μ••μΆ•ν•©λ‹ˆλ‹€. (κ°€λΉ„μ§€ 컬렉터 μ’…λ₯˜μ— 따라 ν•˜μ§€ μ•ŠλŠ” κ²½μš°λ„ 있음)

GC λ™μž‘ κ³Όμ •

1.
객체가 처음 μƒμ„±λ˜κ³  Heapμ˜μ—­μ˜ Eden에 age-bit 0으둜 ν• λ‹Ήλ©λ‹ˆλ‹€. 이 age-bitλŠ” Minor GCμ—μ„œ 살아남을 λ•Œλ§ˆλ‹€ 1μ”© 증가
2.
μ‹œκ°„μ΄ μ§€λ‚˜ Heap Area의 Eden μ˜μ—­μ— 객체가 λ‹€ μŒ“μ΄κ²Œ 되면 Minor GCκ°€ ν•œλ²ˆ μΌμ–΄λ‚˜κ²Œ 되고 μ°Έμ‘° 정도에 따라 Servivor0 μ˜μ—­μœΌλ‘œ μ΄λ™ν•˜κ±°λ‚˜ 회수
3.
κ³„μ†ν•΄μ„œ Edenμ˜μ—­μ—λŠ” μ‹ κ·œ 객체듀이 μƒμ„±λ©λ‹ˆλ‹€. μ΄λ ‡κ²Œ 또 Edenμ˜μ—­μ— 객체가 λ‹€ μŒ“μ΄κ²Œ 되면 Young Generation(Eden+Servivor) μ˜μ—­μ— μžˆλŠ” 객체듀을 λΉ„μ–΄μžˆλŠ” Survival인 Survival1 μ˜μ—­μ— μ΄λ™ν•˜κ³  살아남은 λͺ¨λ“  객체듀은 ageκ°€ 1μ”© 증가
4.
λ˜λ‹€μ‹œ Eden μ˜μ—­μ— μ‹ κ·œ κ°μ²΄λ“€λ‘œ 가득 차게 되면 λ‹€μ‹œν•œλ²ˆ minor GCκ°€ μΌμ–΄λ‚˜κ³  Young Generation(Eden+Servivor) μ˜μ—­μ— μžˆλŠ” 객체듀을 λΉ„μ–΄μžˆλŠ” Survival인 Survival0으둜 μ΄λ™μ‹œν‚¨ λ’€ ageλ₯Ό 1 μ¦κ°€μ‹œν‚΅λ‹ˆλ‹€. 이 과정을 계속 반볡
5.
μœ„ 과정을 λ°˜λ³΅ν•˜λ‹€ 보면 age bitκ°€ νŠΉμ • 숫자 μ΄μƒμœΌλ‘œ λ˜λŠ” κ²½μš°κ°€ λ°œμƒν•©λ‹ˆλ‹€. μ΄λ•Œ JVMμ—μ„œ 섀정해놓은 age bit에 λ„λ‹¬ν•˜κ²Œ 되면 μ˜€λž«λ™μ•ˆ 쓰일 객체라고 νŒλ‹¨ν•˜κ³  Old generation μ˜μ—­μœΌλ‘œ μ΄λ™μ‹œν‚΅λ‹ˆλ‹€. 이 과정을 ν”„λ‘œλͺ¨μ…˜(Promotion)
6.
μ‹œκ°„μ΄ μ§€λ‚˜ Oldμ˜μ—­μ— ν• λ‹Ήλœ λ©”λͺ¨λ¦¬κ°€ ν—ˆμš©μΉ˜λ₯Ό λ„˜κ²Œ 되면, Old μ˜μ—­μ— μžˆλŠ” λͺ¨λ“  객체듀을 κ²€μ‚¬ν•˜μ—¬ μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체듀을 ν•œκΊΌλ²ˆμ— μ‚­μ œν•˜λŠ” GCκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€. μ΄λ ‡κ²Œ Old generationμ˜μ—­μ˜ λ©”λͺ¨λ¦¬λ₯Ό νšŒμˆ˜ν•˜λŠ” GCλ₯Ό Major GC라고 ν•©λ‹ˆλ‹€. Major GCλŠ” μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ΄κ³  μ΄λ•Œ GCλ₯Ό μ‹€ν–‰ν•˜λŠ” μŠ€λ ˆλ“œλ₯Ό μ œμ™Έν•œ λͺ¨λ“  μŠ€λ ˆλ“œλŠ” μž‘μ—…μ„ λ©ˆμΆ”κ²Œ λ©λ‹ˆλ‹€. 이λ₯Ό 'Stop-the-World'

Heap Area

Young Generation μ˜μ—­
β€’
μžλ°” 객체가 μƒμ„±λ˜μžλ§ˆμž μ €μž₯되고, 생긴지 μ–Όλ§ˆ μ•ˆλ˜λŠ” 객체가 μ €μž₯λ˜λŠ” 곡간
β€’
Heap μ˜μ—­μ— 객체가 μƒμ„±λ˜λ©΄ 졜초둜 Eden μ˜μ—­μ— ν• λ‹Ή
β€’
이 μ˜μ—­μ— 데이터가 μ–΄λŠμ •λ„ μŒ“μ΄κ²Œ 되면 참쑰정도에 따라 Servivor의 빈 κ³΅κ°„μœΌλ‘œ μ΄λ™λ˜κ±°λ‚˜ 회수
β€’
Young Generation(Eden+Servivor) μ˜μ—­μ΄ 차게 되면 또 참쑰정도에 따라 Oldμ˜μ—­μœΌλ‘œ 이동 되게 λ˜κ±°λ‚˜ 회수
β€’
μ΄λ ‡κ²Œ Young Generationκ³Ό Tenured Generation μ—μ„œμ˜ GCλ₯Ό Minor GC
β€’
Oldμ˜μ—­μ— ν• λ‹Ήλœ λ©”λͺ¨λ¦¬κ°€ ν—ˆμš©μΉ˜λ₯Ό λ„˜κ²Œ 되면, Old μ˜μ—­μ— μžˆλŠ” λͺ¨λ“  객체듀을 κ²€μ‚¬ν•˜μ—¬ μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체듀을 ν•œκΊΌλ²ˆμ— μ‚­μ œν•˜λŠ” GCκ°€ μ‹€ν–‰
β€’
μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ΄κ³  이 λ•Œ GCλ₯Ό μ‹€ν–‰ν•˜λŠ” μ“°λ ˆλ“œλ₯Ό μ œμ™Έν•œ λͺ¨λ“  μŠ€λ ˆλ“œλŠ” μž‘μ—…μ„ 멈좀. 이λ₯Ό 'Stop-the-World'
β€’
그리고 μ΄λ ‡κ²Œ 'Stop-the-World'κ°€ λ°œμƒν•˜κ³  Oldμ˜μ—­μ˜ λ©”λͺ¨λ¦¬λ₯Ό νšŒμˆ˜ν•˜λŠ” GCλ₯Ό Major GC

참고 자료