Vibe.ai
article thumbnail
λ°˜μ‘ν˜•

 

πŸ‘€Today...


μ‹œμž‘ν•˜κΈ°μ „μ— 웃고 μ‹Άμ–΄μ„œ 웃긴지 μ°Ύλ‹€κ°€ κ°€μ Έμ™”λŠ”λ° μ•„μ§„μ§œ μΉ΄νŽ˜μ—μ„œ μ†Œλ¦¬λ‚΄μ„œ μ›ƒμ—ˆλ‹€γ…‹γ…‹γ…‹ μ·¨ν–₯저격 개그

 

β˜•μ˜€λŠ˜μ˜ TIL(Today I Learn)


JVM

JVM은 μžλ°” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚€λŠ” 도ꡬ이닀. .java μ½”λ“œλ₯Ό 컴파일 ν•˜μ—¬ .class λ°”μ΄νŠΈ μ½”λ“œλ‘œ λ§Œλ“€λ©΄ μ΄μ½”λ“œκ°€ JVMν™˜κ²½μ—μ„œ μ‹€ν–‰λœλ‹€. JVM은 JRE(Java Runtime Environment)에 ν¬ν•¨λ˜μ–΄μžˆλ‹€.  즉, μžλ°”λ‘œ μž‘μ„±ν•œ μ†ŒμŠ€μ½”λ“œλ₯Ό ν•΄μ„ν•˜μ—¬ μ‹€ν–‰ν•˜λŠ” λ³„λ„μ˜ ν”„λ‘œκ·Έλž¨μ΄λ‹€. 

μžλ°”λŠ” "운영체제둜 λΆ€ν„° 독립적"이라고 λ§ν•˜λŠ”λ° 이것이 JVM을 톡해 κ΅¬ν˜„λ˜λŠ”κ²ƒμ΄λ‹€. ν•˜λ‚˜μ˜ λ°”μ΄νŠΈμ½”λ“œλ‘œ λͺ¨λ“  ν”Œλž«νΌμ—μ„œ λ™μž‘μ΄ κ°€λŠ₯ν•΄μ§„λ‹€. 즉, μœ„ κ·Έλ¦Όμ—μ„œ λ³Όμˆ˜μžˆλ“―μ΄ μžλ°”λŠ” ν”Œλž«νΌμ—λŠ” 쒅속적이지 μ•Šμ§€λ§Œ, JVM은 ν”Œλž«νΌμ— 쒅속적이닀. λ¦¬λˆ…μŠ€μ˜ JVMκ³Ό μœˆλ„μš°μ˜ JVM은 λ‹€λ₯΄κ³  μžλ°”λ₯Ό μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ°˜λ“œμ‹œ JVM이 μ„€μΉ˜λ˜μ–΄μžˆμ–΄μ•Ό ν•œλ‹€.

더보기

λ°”μ΄νŠΈ μ½”λ“œ : μΈκ°„μΉœν™”μ  JAVAμ½”λ“œ => 컴퓨터가 ν•΄μ„ν•˜λŠ” κΈ°κ³„μ–΄μ˜ 쀑간 단계

 

 

JVM의 ꡬ쑰

μ§€κΈˆκΉŒμ§€ λ²„νŠΌλ§Œ λˆ„λ₯΄λ©΄ μžλ™μœΌλ‘œ μ§„ν–‰λ˜λ˜ μžλ°”μ½”λ“œμ˜ μ‹€ν–‰μˆœμ„œλ₯Ό κ°„λ‹¨ν•˜κ²Œ μ•Œμ•„λ³΄μž!

1. μžλ°” μ†ŒμŠ€μ½”λ“œ μž‘μ„±(.java) 후에 μ‹€ν–‰

2. μ»΄νŒŒμΌλŸ¬κ°€ μ‹€ν–‰λ˜μ–΄ μ»΄νŒŒμΌμ„ μ§„ν–‰

3. 컴파일의 결과둜 μžλ°”μ½”λ“œ(.java) => λ°”μ΄νŠΈμ½”λ“œ(.class) 파일둜 λ³€ν™˜

4. JVM이 운영체제둜 λΆ€ν„° μ†ŒμŠ€μ½”λ“œ 싀행에 ν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήλ°›μŒ(Runtime Data Area)

5. ν΄λž˜μŠ€λ‘œλ”κ°€ λ°”μ΄νŠΈ μ½”λ“œνŒŒμΌμ„ JVM의 Runtime Data Area에 적재(μ†ŒμŠ€μ½”λ“œλ₯Ό λ©”λͺ¨λ¦¬μ— λ‘œλ“œ)

6. λ‘œλ“œκ°€ μ™„λ£Œλ˜λ©΄ μ‹€ν–‰μ—”μ§„(Excution Engine)이 Runtime Data Area에 적재된 λ°”μ΄νŠΈμ½”λ“œλ₯Ό μ‹€ν–‰

7. 인터프리터λ₯Ό 톡해 μ½”λ“œλ₯Ό ν•œμ€„μ”© κΈ°κ³„μ–΄λ‘œ λ²ˆμ—­ν•˜μ—¬ μ‹€ν–‰μ‹œν‚΄

8. νŠΉμ • λ°”μ΄νŠΈμ½”λ“œκ°€ 자주 μ‹€ν–‰λ μ‹œμ— JIT Compiler(Just-In-Time)λ₯Ό 톡해 λ°”μ΄νŠΈμ½”λ“œ 전체λ₯Ό κΈ°κ³„μ–΄λ‘œ λ²ˆμ—­ν•˜κ³  μ‹€ν–‰

[ref. JVM]

 

# JIT 컴파일러

좜처 : μ½”λ”©νŒ©ν† λ¦¬

JIT μ»΄νŒŒμΌλŸ¬λŠ” 같은 μ½”λ“œλ₯Ό 맀번 ν•΄μ„ν•˜μ§€ μ•Šκ³ , μ‹€ν–‰ν•  λ•Œ μ»΄νŒŒμΌμ„ ν•˜λ©΄μ„œ ν•΄λ‹Ή μ½”λ“œλ₯Ό 캐싱해버린닀. 이후에 바뀐 λΆ€λΆ„λ§Œ μ»΄νŒŒμΌν•˜κ³ , λ‚˜λ¨Έμ§€λŠ” μΊμ‹±λœ μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ»΄νŒŒμΌν•œλ‹€. μ΄λ ‡κ²Œ JIT μ»΄νŒŒμΌλŸ¬λŠ” μš΄μ˜μ²΄μ œμ— 맞게 λ°”μ΄νŠΈ μ‹€ν–‰ μ½”λ“œλ‘œ ν•œ λ²ˆμ— λ³€ν™˜ν•˜μ—¬ μ‹€ν–‰ν•˜κΈ° λ•Œλ¬Έμ— 인터프리터 방식보닀 μ„±λŠ₯이 10λ°° ~ 20λ°° 정도 더 λ†’λ‹€.

 

 

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

# Stack Area / Heap Area

λ©”μ„œλ“œκ°€ 호좜되면 λ©”μ„œλ“œλ₯Ό μœ„ν•œ 곡간인 Method Frame이 μƒμ„±λœλ‹€, μ΄λ•Œ λ©”μ„œλ“œ 내뢀에 μ‚¬μš©λ˜λŠ” μ°Έμ‘°λ³€μˆ˜, λ§€κ°œλ³€μˆ˜, μ§€μ—­λ³€μˆ˜, 리턴값, μ—°μ‚°μ‹œ μΌμ–΄λ‚˜λŠ” 값듀이 μž„μ‹œλ‘œ μ €μž₯λœλ‹€. μ΄λŸ¬ν•œ Method Frame이 Stack에 ν˜ΈμΆœλ˜λŠ” μˆœμ„œλŒ€λ‘œ μŒ“μ΄κ³  λ™μž‘μ™„λ£Œμ‹œμ— μ—­μˆœμœΌλ‘œ μ œκ±°λœλ‹€. 

 

JVMμ•ˆμ—λŠ” 단 ν•˜λ‚˜μ˜ Heap areaκ°€ μ‘΄μž¬ν•œλ‹€. JVM이 λ™μž‘ν•˜λ©΄ μ΄μ˜μ—­μ€ μžλ™μ μœΌλ‘œ μƒμ„±λ˜λ©°, 객체, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜, λ°°μ—΄ 등을 μ €μž₯ν•œλ‹€. 예λ₯Όλ“€μ–΄

Fruit apple = new Fruit();

new Fruit()κ°€ μ‹€ν–‰λ˜λ©΄ Heapμ˜μ—­μ— μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜κ³ , μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λœ μ£Όμ†Œκ°’μ„ apple에 ν• λ‹Ήν•΄μ€€λ‹€. μ΄λ•Œ apple이 Stack에 μ„ μ–Έλœ λ³€μˆ˜μ΄κ³ , 객체λ₯Ό μ ‘κ·Όν•˜λ©΄ Stack에 μ €μž₯된 μ°Έμ‘°λ³€μˆ˜λ₯Ό ν†΅ν•΄μ„œ Heapμ˜μ—­μ— μ‘΄μž¬ν•˜λŠ” 객체λ₯Ό λ‹€λ£¨λŠ” 것이닀. μ΄λŸ¬ν•œ Heapμ˜μ—­μ€ μ‹€μ œ 객체의 값이 μ €μž₯λ˜λŠ” 곡간이닀.

 

 

Garbage Collection

κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ€ GC라고 μ€„μ—¬μ„œλ„ λΆ€λ₯΄λ©°, JVM의 Heap μ˜μ—­μ—μ„œ λ™μ μœΌλ‘œ ν• λ‹Ήν–ˆλ˜ λ©”λͺ¨λ¦¬ μ˜μ—­μ€‘ ν•„μš” μ—†κ²Œλœ λ©”λͺ¨λ¦¬ μ˜μ—­(Unreachable) 을 주기적으둜 μ‚­μ œν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μ΄λ‹€. Cλ‚˜ C++의 κ²½μš°μ— κ°œλ°œμžκ°€ μˆ˜λ™μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  ν•΄μ œν•΄μ€˜μ•Ό ν•˜μ§€λ§Œ, μžλ°”μ—μ„œλŠ” λ©”λͺ¨λ¦¬ 관리λ₯Ό μžλ™μ μœΌλ‘œ ν•΄μ£ΌκΈ° λ•Œλ¬Έμ—, λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ“±μ˜ λ¬Έμ œμ— λŒ€ν•΄ 크게 κ΄€μ—¬ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

 

# GC의 단점

1. λ©”λͺ¨λ¦¬μ˜ ν•΄μ œ μ‹œμ (GC의 λ™μž‘ μ‹œμ )을 μ •ν™•ν•˜κ²Œ μ•Œμˆ˜μ—†λ‹€.

2. GCκ°€ λ™μž‘ν•˜λŠ” λ™μ•ˆ λ‹€λ₯Έ λ™μž‘μ„ λ©ˆμΆ”κΈ° λ•Œλ¬Έμ— μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•œλ‹€.

 

# GC의 λ™μž‘λ°©μ‹

GCλŠ” Heap에 ν• λ‹Ήν–ˆλ˜ λ©”λͺ¨λ¦¬λ₯Ό 주기적으둜 μ‚­μ œν•΄μ€€λ‹€κ³  ν–ˆλ‹€. Heap의 μ˜μ—­μ„ 객체가 μƒμ„±λ˜κ³  μ‚΄μ•„μžˆλŠ” 기간에 λ”°λΌμ„œ Youngκ³Ό Old μ˜μ—­μœΌλ‘œ λ‚˜λˆˆλ‹€.

λ¨Όμ €, Young μ˜μ—­μ—λŠ” μƒˆλ‘­κ²Œ μƒμ„±λœ 객체가 ν• λ‹Ήλ˜κ³ , 여기에 λ§Žμ€ 객체가 μƒμ„±λ˜κ³  μ‚¬λΌμ§€λŠ” 것을 λ°˜λ³΅ν•œλ‹€. μ΄κ³³μ—μ„œ ν™œλ™ν•˜λŠ” κ°€λΉ„μ§€ 컬렉터λ₯Ό Minor GC라고 λΆ€λ₯Έλ‹€.

그리고 Oldμ˜μ—­μ€ Youngμ˜μ—­μ—μ„œ μƒνƒœλ₯Ό μœ μ§€ν•˜κ³  살아남은 객체듀이 λ³΅μ‚¬λ˜λŠ” 곳이닀. 이곳은 Youngμ˜μ—­λ³΄λ‹€ 크게 ν• λ‹Ήλ˜κ³ , 크기가 큰 만큼 GCλŠ” 적게 λ°œμƒν•œλ‹€. μ΄κ³³μ—μ„œ ν™œλ™ν•˜λŠ” 가비지컬렉터λ₯Ό Major GC라고 λΆ€λ₯Έλ‹€. 

[ref. GC]


 

λ°˜μ‘ν˜•
profile

Vibe.ai

@hai02y

ν¬μŠ€νŒ…μ΄ μ’‹μ•˜λ‹€λ©΄ "μ’‹μ•„μš”β€οΈ" λ˜λŠ” "κ΅¬λ…πŸ‘πŸ»" ν•΄μ£Όμ„Έμš”!