μžλ°”λŠ” OS에 독립적인 νŠΉμ§•μ„ 가지고 μžˆλ‹€.
JVM이 OS와 ν”„λ‘œκ·Έλž¨μ˜ μ‚¬μ΄μ—μ„œ κΈ°κ³„μ–΄λ‘œ ν–‰μ„μ•»μ£ΌλŠ” 역할을 ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

JVM JAVA Virtual Machine

컴파일된 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό 기계가 이해할 수 μžˆλŠ” κΈ°κ³„μ–΄λ‘œ λ³€ν™˜

μŠ€νƒκΈ°λ°˜μ˜ 가상 λ¨Έμ‹  

λ©”λͺ¨λ¦¬ 관리와 GCλ₯Ό μˆ˜ν–‰

 

μžλ°” μ½”λ“œμ˜ μ‹€ν–‰ κ³Όμ •

1. κ°œλ°œμžκ°€ μžλ°”μ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€. 

2. ( .java ) 인 νŒŒμΌμ„ μžλ°” 컴파일러λ₯Ό 톡해 μžλ°” λ°”μ΄νŠΈ μ½”λ“œλ‘œ μ»΄νŒŒμΌν•œλ‹€.

3. 컴파일 된 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό JVM의 Class Loader에 μ „λ‹¬ν•œλ‹€. 

4. Class LoaderλŠ” 동적 λ‘œλ”©μ„ 톡해 ν•„μš” ν΄λž˜μŠ€λ“€μ„ λ‘œλ”© 및 λ§ν¬ν•˜μ—¬ Runtime Data Area에 μ˜¬λ¦°λ‹€. (JVM의 λ©”λͺ¨λ¦¬)

5. μ‹€ν–‰ 엔진은 JVMλ©”λͺ¨λ¦¬μ— 올라온 λ°”μ΄νŠΈ μ½”λ“œλ“€μ„ λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ ν•˜λ‚˜μ”© κ°€μ Έμ™€μ„œ μ‹€ν–‰ν•œλ‹€.

 

 

 

 

 

JVM
Class Loader + Runtime Data Areas + Execution Engine

 

 

 

 

Class Loader νŠΉμ§•

1. 계측 ꡬ쑰 

클래슀 λ‘œλ”λŠ” μ—¬λŸ¬ 클래슀 λ‘œλ”λΌλ¦¬ λΆ€λͺ¨-μžμ‹ 관계λ₯Ό 이루어 계측적인 ꡬ쑰둜 λ˜μ–΄ μžˆλ‹€.

 

  • λΆ€νŠΈμŠ€νŠΈλž© 클래슀 λ‘œλ” Bootstrap Class Loader
    • μ΅œμƒμœ„ ν΄λž˜μŠ€λ‘œλ”, μœ μΌν•˜κ²Œ JAVAκ°€ μ•„λ‹Œ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ κ΅¬ν˜„
    • JVM이 싀행될 λ•Œ 같이 λ©”λͺ¨λ¦¬μ— 올라감
    • Object 클래슀λ₯Ό λΉ„λ‘―ν•˜μ—¬ JAVA API듀을 λ‘œλ“œν•¨

 

  • μ΅μŠ€ν…μ…˜ 클래슀 λ‘œλ” Extension Class Loader
    • κΈ°λ³Έ JAVA APIλ₯Ό μ œμ™Έν•œ ν™•μž₯ ν΄λž˜μŠ€λ“€μ„ λ‘œλ“œν•¨ - λ‹€μ–‘ν•œ λ³΄μ•ˆ ν™•μž₯ κΈ°λŠ₯ λ‘œλ“œ

 

  • μ‹œμŠ€ν…œ 클래슀 λ‘œλ” System Class Loader
    • (λΆ€νŠΈ 슀트랩과 μ΅μŠ€ν…μ…˜ ν΄λž˜μŠ€λ‘œλ”κ°€ JVM 자체의 ꡬ성 μš”μ†Œλ“€μ„ λ‘œλ“œν•œλ‹€) μ‹œμŠ€ν…œ 클래슀 λ‘œλ”λŠ” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ν΄λž˜μŠ€λ“€μ„ λ‘œλ“œν•¨
    • μ‚¬μš©μžκ°€ μ§€μ •ν•œ $CLASSPATH λ‚΄μ˜ ν΄λž˜μŠ€λ“€μ„ λ‘œλ“œν•¨

 

  • μ‚¬μš©μž μ •μ˜ 클래슀 λ‘œλ” User-Defined Class Loader
    • μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ‚¬μš©μžκ°€ 직접 μ½”λ“œ μƒμ—μ„œ μƒμ„±ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 클래슀 λ‘œλ”
    • WAS와 같은 ν”„λ ˆμž„μ›Œν¬λŠ” μ„œλ‘œ λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄μ„œ 이λ₯Ό μœ„ν•΄ μ‚¬μš©μž μ •μ˜ 클래슀 λ‘œλ”λ“€μ„ μ‚¬μš©ν•˜μ—¬ 클래슀 λ‘œλ”μ˜ μœ„μž„ λͺ¨λΈμ„ 톡해 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 독립성을 보μž₯함

 

2. μœ„μž„λͺ¨λΈ 

처음 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λ„˜κ²¨λ°›μ€ ν΄λž˜μŠ€λ‘œλ”.

ν•„μš”ν•œ 클래슀λ₯Ό λ‘œλ“œν•  λ•Œ ν˜Ήμ€ μ‹€ν–‰ μ—”μ§„μ—μ„œ λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ‹€κ°€ 처음으둜 μ°Έμ‘°ν•˜λŠ” ν΄λž˜μŠ€μ— λŒ€ν•΄ 클래슀 λ‘œλ”μ—κ²Œ λ‘œλ“œλ₯Ό μš”μ²­ν•  λ•Œ.

λ‘œλ“œλ₯Ό μš”μ²­λ°›μ€ 클래슀 λ‘œλ”λŠ” λ‹€μŒ μˆœμ„œλŒ€λ‘œ μš”μ²­λ°›μ€ ν΄λž˜μŠ€κ°€ μžˆλŠ”μ§€ 확인함

  1. 클래슀 λ‘œλ” μΊμ‹œ
  2. μƒμœ„ 클래슀 λ‘œλ”
  3. 자기 μžμ‹ 

이전에 λ‘œλ“œλœ ν΄λž˜μŠ€μΈμ§€ 클래슀 λ‘œλ” μΊμ‹œλ₯Ό ν™•μΈν•œλ‹€.

μ—†λ‹€λ©΄ μƒμœ„ 클래슀 λ‘œλ”λ₯Ό ν•˜λ‚˜μ”© 거슬러 μ˜¬λΌκ°€λ©° ν™•μΈν•˜λŠ”λ°, 이 λ•Œ μ˜¬λΌκ°€λŠ” 도쀑에 클래슀λ₯Ό λ°œκ²¬ν•˜λ”λΌλ„ λΆ€νŠΈ 슀트랩 클래슀 λ‘œλ”(μ΅œμƒλ‹¨ λ‘œλ”)κΉŒμ§€ 확인을 ν•΄μ„œ λΆ€νŠΈ 슀트랩 클래슀 λ‘œλ”μ—λ„ ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•œλ‹€λ©΄ κ·Έ 클래슀λ₯Ό λ‘œλ“œν•˜κ²Œ λœλ‹€.

 

 

3. κ°€μ‹œμ„± μ œν•œ

클래슀 λ‘œλ”κ°€ 클래슀 λ‘œλ“œλ₯Ό μš”μ²­λ°›μ•˜μ„ λ•Œ μœ„μž„ λͺ¨λΈμ— μ˜ν•΄μ„œ 클래슀 λ‘œλ” μΊμ‹œλ₯Ό ν™•μΈν•˜κ³  μ—†μœΌλ©΄ μƒμœ„ 클래슀 λ‘œλ”λ₯Ό ν™•μΈν•œλ‹€. μ΄λ•Œ ν•˜μœ„ ν΄λž˜μŠ€λŠ” 확인이 λΆˆκ°€λŠ₯ν•œ νŠΉμ„±μ΄ λ°”λ‘œ κ°€μ‹œμ„± μ œν•œμ΄λ‹€.

 

 

4. μ–Έλ‘œλ“œ λΆˆκ°€

클래슀λ₯Ό λ‘œλ“œν•˜λŠ” 것은 κ°€λŠ₯ν•˜μ§€λ§Œ κ·Έ λ°˜λŒ€λ‘œ unloadν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•˜λ‹€.

 

5. 이름 곡간

λ„€μž„ μŠ€νŽ˜μ΄μŠ€λŠ” 각 클래슀 λ‘œλ”λ“€μ΄ 가지고 μžˆλŠ” κ³΅κ°„μœΌλ‘œ λ‘œλ“œλœ 클래슀λ₯Ό λ³΄κ΄€ν•˜λŠ” 곡간

μœ„μž„ λͺ¨λΈμ„ ν†΅ν•΄μ„œ μƒμœ„ 클래슀 λ‘œλ”λ“€μ„ 확인해야할 λ•Œ ν™•μΈν•˜λŠ” 곡간이 λ°”λ‘œ 이름 곡간

λ„€μž„ μŠ€νŽ˜μ΄μŠ€μ— λ³΄κ΄€λ˜λŠ” 기쀀은 FQCN Fully Qualified Class Name 으둜 νŒ¨ν‚€μ§€ λͺ…κΉŒμ§€ ν¬ν•¨λ˜μ–΄μžˆλŠ” μ‹λ³„μžλ₯Ό λœ»ν•œλ‹€.

 

각각의 클래슀 λ‘œλ”κ°€ 각자 λ„€μž„ 슀페이슀λ₯Ό 가지고 있기 λ•Œλ¬Έμ— FQCN이 같은 ν΄λž˜μŠ€λΌλ„ λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ λ‹€λ₯΄λ©΄ λ‹€λ₯Έ 클래슀둜 κ°–μ£Όν•œλ‹€. ( 이 κΈ°λŠ₯을 톡해 λ‘œλ“œν•œ 클래슀 λ‘œλ”λ₯Ό μ œκ±°ν•˜κ³  μ–Έλ‘œλ“œμ˜ 효과λ₯Ό 쀄 수 μžˆλ‹€. )

 

 

클래슀 λ‘œλ“œ κ³Όμ • 

 

1. λ‘œλ“œ - 클래슀 νŒŒμΌμ„ κ°€μ Έμ™€μ„œ JVM의 λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•œλ‹€.

2. 검증 - 클래슀 λ‘œλ“œ μ „ κ³Όμ • μ€‘μ—μ„œ κ°€μž₯ λ³΅μž‘ν•˜κ³  μ‹œκ°„μ΄ 많이 κ±Έλ¦¬λŠ” κ³Όμ •μœΌλ‘œ, 읽어듀인 ν΄λž˜μŠ€κ°€ μžλ°” μ–Έμ–΄ λͺ…μ„Έ 및 JVM λͺ…세에 λͺ…μ‹œλœ λŒ€λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλŠ”μ§€ κ²€μ‚¬ν•œλ‹€.

3. μ€€λΉ„ - ν΄λž˜μŠ€κ°€ ν•„μš”λ‘œ ν•˜λŠ” λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•œλ‹€. 

4. 뢄석 - 클래슀의 μƒμˆ˜ ν’€ λ‚΄ λͺ¨λ“  심볼릭 레퍼런슀λ₯Ό λ‹€μ΄λ ‰νŠΈ 레퍼런슀둜 λ³€κ²½ν•œλ‹€.

5. μ΄ˆκΈ°ν™” - 클래슀 λ³€μˆ˜λ“€μ„ μ μ ˆν•œ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•œλ‹€. (static ν•„λ“œλ“€μ€ μ„€μ •λœ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™” )

 

 

 

 

 

 

λŸ°νƒ€μž„ 데이터 μ˜μ—­ Runtime Data Area

JVM이 OS μœ„μ—μ„œ μ‹€ν–‰λ˜λ©΄μ„œ ν• λ‹Ήλ°›λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ΄ λ°”λ‘œ λŸ°νƒ€μž„ 데이터 μ˜μ—­μ΄λ‹€.

이 μ˜μ—­μ€ 크게 5가지, μ„ΈλΆ„ν™”μ‹œ 6κ°€μ§€λ‘œ λ‚˜λˆ  λ³Ό 수 μžˆλ‹€. 

PC λ ˆμ§€μŠ€ν„°, JVM μŠ€νƒ, λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ μŠ€νƒμ€ μŠ€λ ˆλ“œλ§ˆλ‹€ ν•˜λ‚˜μ”© μƒμ„±λ˜κ³  

νž™, λ©”μ„œλ“œ μ˜μ—­μ€ λͺ¨λ“  μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•΄μ„œ μ‚¬μš©λœλ‹€.

 

 

  • PC λ ˆμ§€μŠ€ν„° 
    • Program Counter λ ˆμ§€μŠ€ν„°λŠ” ν˜„μž¬ μˆ˜ν–‰ 쀑인 λͺ…λ Ήμ˜ μ£Όμ†Œλ₯Ό 가지며 μŠ€λ ˆλ“œκ°€ μ‹œμž‘λ  λ•Œ μƒμ„±λ˜λ©°, 각 μŠ€λ ˆλ“œλ§ˆλ‹€ ν•˜λ‚˜μ”© μ‘΄μž¬ν•¨
  • JVM μŠ€νƒ 
    • μŠ€νƒ ν”„λ ˆμž„μ΄λΌλŠ” ꡬ쑰체λ₯Ό μ €μž₯ν•˜λŠ” μŠ€νƒ
    • μ˜ˆμ™Έ λ°œμƒ μ‹œ printStackTrace( ) λ©”μ„œλ“œλ‘œ λ³΄μ—¬μ£ΌλŠ” Stack Trace의 각 라인 ν•˜λ‚˜κ°€ μŠ€νƒ ν”„λ ˆμž„μ„ ν‘œν˜„ν•¨
    • μŠ€λ ˆλ“œκ°€ μ‹œμž‘λ  λ•Œ μƒμ„±λ˜λ©° 각 μŠ€λ ˆλ“œλ§ˆλ‹€ ν•˜λ‚˜μ”© μ‘΄μž¬ν•¨
  • λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ μŠ€νƒ
    • μžλ°” μ™Έμ˜ μ–Έμ–΄λ‘œ μž‘μ„±λœ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό μœ„ν•œ μŠ€νƒ
    • JAVA Native Interfaceλ₯Ό 톡해 ν˜ΈμΆœν•˜λŠ” C/C++ λ“±μ˜ μ½”λ“œλ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ μŠ€νƒμœΌλ‘œ, 언어에 맞게 μŠ€νƒ 생성
  • νž™
    • μΈμŠ€ν„΄μŠ€ λ˜λŠ” 객체λ₯Ό μ €μž₯ν•˜λŠ” 곡간
    • Garbage Collection의 λŒ€μƒ
    • JVM μ„±λŠ₯ λ“±μ˜ μ΄μŠˆμ—μ„œ κ°€μž₯ 많이 μ–ΈκΈ‰λ˜λŠ” 곡간
    • νž™ ꡬ성 λ°©μ‹μ΄λ‚˜ 가비지 μ»¬λ ‰μ…˜ 방법 등은 JVM λ²€λ”λ“€μ˜ μž¬λŸ‰
  • λ©”μ„œλ“œ μ˜μ—­ 
    • λͺ¨λ“  μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•˜λŠ” μ˜μ—­
    • JVM이 μ‹œμž‘λ  λ•Œ μƒμ„±λœλ‹€.
    • JVM이 읽어 듀인 각각의 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•œ λŸ°νƒ€μž„ μƒμˆ˜ ν’€, ν•„λ“œμ™€ λ©”μ„œλ“œμ— λŒ€ν•œ 정보, static λ³€μˆ˜, λ©”μ„œλ“œμ˜ λ°”μ΄νŠΈ μ½”λ“œλ“€μ„ 보관함
  • λŸ°νƒ€μž„ μƒμˆ˜ ν’€
    • JVM λ™μž‘μ—μ„œ κ°€μž₯ 핡심적인 역할을 μˆ˜ν–‰ν•˜λŠ” κ³³
    • 각 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ μƒμˆ˜ 뿐만 μ•„λ‹ˆλΌ, λ©”μ„œλ“œμ™€ ν•„λ“œμ— λŒ€ν•œ λͺ¨λ“  λ ˆνΌλŸ°μŠ€κΉŒμ§€ λ‹΄κ³  μžˆλŠ” ν…Œμ΄λΈ”
    • μ–΄λ–€ λ©”μ„œλ“œλ‚˜ ν•„λ“œλ₯Ό μ°Έμ‘°ν•  λ•Œ JVM은 λŸ°νƒ€μž„ μƒμˆ˜ 풀을 톡해 ν•΄λ‹Ή λ©”μ„œλ“œλ‚˜ ν•„λ“œμ˜ μ‹€μ œ λ©”λͺ¨λ¦¬μƒ μ£Όμ†Œλ₯Ό μ°Ύμ•„μ„œ μ°Έμ‘°ν•œλ‹€.

 

 

 

 

 

μ‹€ν–‰ 엔진 Execution Engine

μ‹€ν–‰ 엔진은 클래슀 λ‘œλ”λ₯Ό 톡해 λŸ°νƒ€μž„ 데이터 μ˜μ—­μ— 배치된 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λͺ…λ Ήμ–΄ λ‹¨μœ„λ‘œ μ½μ–΄μ„œ μ‹€ν–‰

 

λ°”μ΄νŠΈ μ½”λ“œμ™€ 각 λͺ…λ Ήμ–΄λŠ” 1λ°”μ΄νŠΈ 크기의 OpCode와 μΆ”κ°€ ν”Όμ—°μ‚°μžλ‘œ μ΄λ€„μ ΈμžˆμŒ

μ‹€ν–‰ 엔진은 ν•˜λ‚˜μ˜ OpCodeλ₯Ό κ°€μ Έμ™€μ„œ ν”Όμ—°μ‚°μžμ™€ μž‘μ—…μ„ μˆ˜ν–‰ν•œ λ‹€μŒ OpCodeλ₯Ό μˆ˜ν–‰ν•˜λŠ” μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€.

 

이 μˆ˜ν–‰ κ³Όμ •μ—μ„œ μ‹€ν–‰ 엔진은 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό 기계가 μ‹€ν–‰ν•  수 μžˆλŠ” ν˜•νƒœλ‘œ λ³€κ²½ν•œλŠ”λ° 두가지 방법을 μ‚¬μš©ν•œλ‹€.

  • 인터프리터 
    • λ°”μ΄νŠΈ μ½”λ“œ λͺ…λ Ήμ–΄λ₯Ό ν•˜λ‚˜μ”© μ½μ–΄μ„œ ν•΄μ„ν•˜κ³  μ‹€ν–‰ν•œλ‹€. ν•˜λ‚˜ν•˜λ‚˜μ˜ 해석은 λΉ λ₯΄μ§€λ§Œ 전체적인 μ‹€ν–‰ μ†λ„λŠ” λŠλ¦¬λ‹€λŠ” 단점을 가진닀. 
    • JVM μ•ˆμ—μ„œ λ°”μ΄νŠΈ μ½”λ“œλŠ” 기본적으둜 인터프리터 λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€.
  • JIT 컴파일러 Just-In-Time
    • μΈν„°ν”„λ¦¬ν„°μ˜ 단점을 λ³΄μ™„ν•˜κΈ° μœ„ν•΄ λ„μž…λœ 방식
    • λ°”μ΄νŠΈ μ½”λ“œ 전체λ₯Ό μ»΄νŒŒμΌν•˜μ—¬ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ λ³€κ²½ν•˜κ³ , μ΄ν›„μ—λŠ” ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό 더이상 μΈν„°ν”„λ¦¬νŒ… ν•˜μ§€ μ•Šκ³  λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ 직접 μ‹€ν–‰ν•˜λŠ” 방식
    • 전체적인 μ‹€ν–‰ μ†λ„λŠ” μΈν„°ν”„λ¦¬νŒ…λ°©μ‹λ³΄λ‹€ λΉ λ₯΄λ‹€ ( λ„€μ΄ν‹°λΈŒ μ½”λ“œλŠ” μΊμ‹œμ— λ³΄κ΄€ν•˜κΈ° λ•Œλ¬Έμ— ν•œ 번 컴파일된 μ½”λ“œλŠ” μΊμ‹œμ—μ„œ λ°”λ‘œ κΊΌλ‚΄μ–΄ μ‹€ν–‰ν•΄ λΉ λ₯΄κ²Œ μˆ˜ν–‰λœλ‹€ )
    • ν•˜μ§€λ§Œ JIT μ»΄νŒŒμΌλŸ¬κ°€ μ»΄νŒŒμΌν•˜λŠ” 과정은 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό ν•˜λ‚˜μ”© μΈν„°ν”„λ¦¬νŒ… ν•˜λŠ” 것보닀 훨씬 였래 걸리기 λ•Œλ¬Έμ— JVM은 ν•΄λ‹Ή λ©”μ„œλ“œκ°€ μ–Όλ§ˆλ‚˜ 자주 호좜되고 μ‹€ν–‰λ˜λŠ” 지λ₯Ό μ²΄ν¬ν•˜κ³ , 일정 기쀀을 λ„˜μ—ˆμ„ λ•Œλ§Œ JIT 컴파일러λ₯Ό 톡해 컴파일 ν•˜μ—¬ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό μƒμ„±ν•œλ‹€.

 

 

 


μ°Έμ‘°

+ Recent posts