πŸ€” JVM μ΄λž€?

κΉ€μ„±κΈΈΒ·2023λ…„ 3μ›” 27일
1

Java Virtual Machine, μžλ°” 가상 λ¨Έμ‹ μ˜ μ€„μž„λ§μœΌλ‘œ, OS에 κ·œμ•½ 받지 μ•Šκ³  Java μ½”λ“œλ₯Ό 컴퓨터가 μ•Œμ•„ 먹을 수 μžˆλ„λ‘ 컴파일 ν•΄μ£ΌλŠ” 역할을 ν•œλ‹€.
JVM이 μžˆκΈ°μ— μš°λ¦¬λŠ” λ¦¬λˆ…μŠ€, μœˆλ„μš°, λ§₯ λ‹€μ–‘ν•œ OS ν™˜κ²½μ—μ„œ javaμ½”λ“œλ₯Ό μ‹€ν–‰ μ‹œν‚¬ 수 μžˆλŠ” 것이닀.

JVM 덕뢄에 Write Once, Run Anywhere 을 κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.

Compile

1) κ°œλ°œμžκ°€ μžλ°” μ†ŒμŠ€ 파일(.java)λ₯Ό μž‘μ„±ν•œλ‹€.
2) μžλ°” 컴파일러λ₯Ό μ΄μš©ν•˜μ—¬ μžλ°” μ†ŒμŠ€ νŒŒμΌμ„ 컴파일 ν•œλ‹€. μ΄λ•Œ λ‚˜μ˜€λŠ” νŒŒμΌμ€ λ°”μ΄νŠΈ μ½”λ“œλ‘œ, 아직 JVM이 이해할 수 μ—†λ‹€. java μ½”λ“œμ™€ 이진 μ½”λ“œμ˜ 쀑간 지점이라 μƒκ°ν•˜λ©΄ λœλ‹€.

Runtime

1) λ°”μ΄νŠΈ μ½”λ“œλ₯Ό 클래슀 λ‘œλ”μ—κ²Œ μ „λ‹¬ν•œλ‹€.
2) 클래슀 λ‘œλ”λŠ” 동적 λ‘œλ”©μ„ 톡해 ν•„μš”ν•œ ν΄λž˜μŠ€λ“€μ„ λ‘œλ”© 및 체크 ν•˜μ—¬ λŸ°νƒ€μž„ 데이터 μ˜μ—­(Runtime-DateAreas), 즉 JVM의 λ©”λͺ¨λ¦¬μ— μ˜¬λ¦°λ‹€.
3) μ‹€ν–‰ 엔진(Excution Engine)은 JVM λ©”λͺ¨λ¦¬μ— 올라온 λ°”μ΄νŠΈ μ½”λ“œλ“€μ„ JVM λ‚΄λΆ€μ—μ„œ μ‹€ν–‰ ν•  수 μžˆλ„λ‘ μ–Έμ–΄λ₯Ό λ³€κ²½ν•œλ‹€. λ³€κ²½ν•˜λŠ” 방법은 두가지가 μžˆλ‹€.

  • 인터프리터(Java Interpreter): μžλ°” λ°”μ΄νŠΈ μ½”λ“œλ“€μ„ ν•œμ€„μ”© μ½μ–΄μ„œ κΈ°κ³„μ–΄λ‘œ λ°”κΏ”μ€€λ‹€. ν•œμ€„μ”© κΈ°κ³„μ–΄λ‘œ λ°”κΎΈλŠ”κ±΄ λΉ λ₯΄μ§€λ§Œ 전체적인 μ‹€ν–‰ μ†λ„λŠ” λŠλ¦¬λ‹€λŠ” 단점이 μžˆλ‹€.

  • JIT 컴파일러(Just-In-Time Compiler): μΈν„°ν”„λ¦¬ν„°μ˜ 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄μ„œ λ„μž…λœ λ°©μ‹μœΌλ‘œ λ°”μ΄νŠΈ μ½”λ“œ 전체λ₯Ό κΈ°κ³„μ–΄λ‘œ λ°”κΎΈλŠ” 방식이닀. κ·Έλž˜μ„œ λΉŒλ“œ μ‹œμ— 컴파일러 μ†λ„λŠ” 더 λŠλ¦¬λ‹€. ν•˜μ§€λ§Œ κ·Έ μ΄ν›„μ—λŠ” 더 이상 μΈν„°ν”„λ¦¬νŒ… ν•˜μ§€ μ•Šκ³  캐싱해 κΈ°κ³„μ–΄λ‘œ λ³€κ²½ν•œλ‹€. 즉 ν•˜λ‚˜μ”© μΈν„°ν”„λ¦¬νŒ… ν•˜λŠ”κ²ƒμ΄ μ•„λ‹ˆλΌ λ§Œλ“€μ–΄ λ‘” μ‹€ν–‰ νŒŒμΌμ„ 읽기 λ•Œλ¬Έμ— μ‹€ν–‰ μ†λ„λŠ” 더 λΉ λ₯΄λ‹€.

JVM ꡬ성 μš”μ†Œ

1. class loder

μžλ°”λŠ” λ™μ μœΌλ‘œ μ½”λ“œλ“€μ„ μ½μœΌλ―€λ‘œ, JVM이 λ™μž‘ν•˜λ‹€κ°€ 클래슀 νŒŒμΌμ„ μ°Έμ‘°ν•˜λŠ” μˆœκ°„ λ™μ μœΌλ‘œ μ½μ–΄μ„œ JVM에 링크 λœλ‹€. μžλ°” 클래슀 λ‘œλ”λŠ” λ™μ μœΌλ‘œ λ©”λͺ¨λ¦¬μ— λ‘œλ”© μ‹œμΌœμ£ΌλŠ” 역할을 ν•œλ‹€.

2. Runtime DataAreas

JVM이 ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ μ‹œν‚€κΈ° μœ„ν•΄ OS둜 λΆ€ν„° λ³„λ„λ‘œ 할당받은 λ©”λͺ¨λ¦¬ 곡간이닀.
크게 5κ°€μ§€λ‘œ λ‚˜λ‰œλ‹€.

  • PC Register: μŠ€λ ˆλ“œκ°€ μ‹œμž‘λ λ•Œ μƒμ„±λ˜λ©° μŠ€λ ˆλ“œλ§ˆλ‹€ ν•˜λ‚˜μ”© μ‘΄μž¬ν•œλ‹€. μŠ€λ ˆλ“œκ°€ μ–΄λ–€ 뢀뢄을 μ–΄λ–€ λͺ…λ ΉμœΌλ‘œ 싀행해야할지에 λŒ€ν•œ 기둝을 ν•˜λŠ” λΆ€λΆ„μœΌλ‘œ ν˜„μž¬ μˆ˜ν–‰ 쀑인 JVM의 λͺ…λ Ήμ˜ μ£Όμ†Œλ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

  • JVM Stack: ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ κ³Όμ •μ—μ„œ μž„μ‹œλ‘œ ν• λ‹Ή λ˜μ—ˆλ‹€κ°€ λ©”μ„œλ“œλ₯Ό λΉ μ Έ λ‚˜κ°€λ©΄ λ°”λ‘œ μ†Œλ©Έλ˜λŠ” νŠΉμ„±μ˜ 데이터λ₯Ό 데이터λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ μ˜μ—­μ΄λ‹€. λ©”μ„œλ“œμ™€ λ©”μ„œλ“œ 정보(λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜, μ§€μ—­λ³€μˆ˜, μž„μ‹œλ³€μˆ˜, λ©”μ†Œλ“œ 호좜 μ£Όμ†Œ)λ₯Ό μŠ€νƒμ— μŒ“λŠ”λ‹€. λ©”μ„œλ“œλ₯Ό 호좜 ν•  λ•Œλ§ˆλ‹€ 각각의 μŠ€νƒ ν”„λ ˆμž„(λ©”μ„œλ“œλ₯Ό μœ„ν•œ 곡간)이 μƒμ„±λœλ‹€. λ©”μ„œλ“œκ°€ λλ‚˜λ©΄ ν”„λ ˆμž„ λ³„λ‘œ μ‚­μ œν•œλ‹€.

  • Native Method Stack: μžλ°” μ™Έμ˜ μ–Έμ–΄λ‘œ μž‘μ„±λœ native μ½”λ“œλ“€μ„ μœ„ν•œ stack이닀. 예둜 Java Native Interfaceλ₯Ό 톡해 ν˜ΈμΆœλ˜λŠ” c/c++ λ“±μ˜ μ½”λ“œλ₯Ό μˆ˜ν–‰ν•œλ‹€. Natice Methodλ₯Ό ν˜ΈμΆœν•˜κ²Œ 되면 Native Method Stack에 μƒˆλ‘œμš΄ μŠ€νƒ ν”„λ ˆμž„μ„ μƒμ„±ν•˜μ—¬ ν‘Έμ‹œ ν•œλ‹€. μ΄λŠ” JVM 내뢀에 영ν–₯을 주지 μ•ŠκΈ° μœ„ν•¨μ΄λ‹€.

  • Method Area: 클래슀 정보λ₯Ό 처음 λ©”λͺ¨λ¦¬ 곡간에 올릴 λ•Œ μ΄ˆκΈ°ν™” λ˜λŠ” λŒ€μƒμ„ μ €μž₯ν•˜κΈ° μœ„ν•œ λ©”λͺ¨λ¦¬ 곡간이닀. λͺ¨λ“  μ“°λ ˆλ“œκ°€ κ³΅μœ ν•˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ΄λ‹€. 클래슀, μΈν„°νŽ˜μ΄μŠ€, λ©”μ†Œλ“œ, ν•„λ“œ, static λ“±μ˜ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λ³΄κ΄€ν•œλ‹€.

  • Heap: ν”„λ‘œκ·Έλž¨ μƒμ—μ„œ λ™μ μœΌλ‘œ ν• λ‹Ήν•˜μ—¬ μ‚¬μš©ν•˜λŠ” μ˜μ—­μ΄λ‹€. 클래슀λ₯Ό μ΄μš©ν•΄ 객체λ₯Ό μƒμ„±ν•˜λ©΄ νž™μ— μ €μž₯λœλ‹€. 곡유 λ˜λŠ” μžμ›μ΄λ‹€.

3. Garbage Collection

가비지 μ»¬λ ‰μ…˜μ€ μžλ°”μ˜ λ©”λͺ¨λ¦¬ 관리 방법 μ€‘μ˜ ν•˜λ‚˜λ‘œ JVM의 Heap μ˜μ—­μ—μ„œ λ™μ μœΌλ‘œ ν• λ‹Ήν–ˆλ˜ λ©”λͺ¨λ¦¬ μ˜μ—­ 쀑 ν•„μš” μ—†κ²Œ 된 λ©”λͺ¨λ¦¬ μ˜μ—­μ„ 주기적으둜 μ‚­μ œν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μ΄λ‹€.

JDK와 JRE

JRE

JREλŠ” μžλ°” μ‹€ν–‰ ν™˜κ²½(Java Runtime Environment)의 μ•½μžλ‘œ μžλ°”λ‘œ λ§Œλ“€μ–΄μ§„ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ μ‹œν‚€κΈ° μœ„ν•΄ ν•„μš”ν•œ λΌμ΄λΈŒλŸ¬λ¦¬λ“€κ³Ό 각쒅 API, JVM이 ν¬ν•¨λ˜μ–΄ μžˆλ‹€.

JDK

JDKλŠ” μžλ°” κ°œλ°œλ„κ΅¬(Java Development Kit)의 μ•½μžλ‘œ JRE + κ°œλ°œμ„ μœ„ν•΄ ν•„μš”ν•œ 도ꡬ (javac, javaλ“±)듀을 ν¬ν•¨ν•œλ‹€.

0개의 λŒ“κΈ€