λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

λͺ©λ‘μ΄ μ—†μŠ΅λ‹ˆλ‹€.

[JAVA] JVM λ™μž‘μ›λ¦¬ 및 κΈ°λ³Έκ°œλ…

πŸ—£ Language/JAVA

    μžλ°”(JAVA)
    μžλ°”(JAVA)

     

     

     

    JAVAλΌλŠ” μ–Έμ–΄λ₯Ό 톡해 코딩을 ν•˜κ³  μžˆλŠ” μ‚¬λžŒμœΌλ‘œμ„œ JAVA의 κ°„λ‹¨ν•œ 탄생배경 κ·Έλ¦¬κ³ 

    JAVA의 μ‹œμž‘κ³Ό 끝이라고 ν•  수 μžˆλŠ” JVM을 ν•œ 번 μ§šκ³ λ„˜μ–΄κ°€λ €κ³  ν•΄μš”

    μš°μ„  JAVA의 탄생배경을 μ’€ μ•Œκ³ κ°€λ©΄ μ΄ν•΄ν•˜κΈ° 더 쒋을 λ“― μ‹Άμ–΄μ„œ λ¨Όμ € 정리해 λ΄…λ‹ˆλ‹€

     

    λͺ©μ°¨λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€

     

    1. JAVA 탄생 λ°°κ²½
    2. μžλ°” μ½”λ“œ(JAVA Code) μ‹€ν–‰ κ³Όμ •
    3. JVM λ™μž‘μ›λ¦¬ 및 κΈ°λ³Έκ°œλ…
        3-1. 클래슀 λ‘œλ” (Class Loader)
        3-2. λŸ°νƒ€μž„ 데이터 μ˜μ—­(Runtime Data Area)
        3-3. μ‹€ν–‰ 엔진(Execution Engine)

     

    JAVA 탄생배경

     

    JAVAλŠ” 썬 λ§ˆμ΄ν¬λ‘œμ‹œμŠ€ν…œμ¦ˆμ˜ μ œμž„μŠ€ κ³ μŠ¬λ§μ΄λΌλŠ” μ‚¬λžŒκ³Ό λ‹€λ₯Έ 연ꡬ원듀이 κ°œλ°œν•œ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μš”

    1991λ…„ κ·Έλ¦° ν”„λ‘œμ νŠΈ(Green Project)λΌλŠ” μ΄λ¦„μœΌλ‘œ μ‹œμž‘ν•΄ 1995년에 λ°œν‘œκ°€ λ¬λŠ”λ°μš”

     

    μ²˜μŒμ—λŠ” κ°€μ „μ œν’ˆ 내에 νƒ‘μž¬ν•΄ λ™μž‘ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μœ„ν•΄ κ°œλ°œν–ˆλŠ”λ° μ•„μ΄λŸ¬λ‹ˆν•˜κ²Œλ„ ν˜„μž¬λŠ” μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ— κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ” μ–Έμ–΄ 쀑에 ν•˜λ‚˜κ°€ λ˜μ–΄μžˆμ£  (λ¬Όλ‘  λͺ¨λ°”일 기기용 μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ—λ„ 널리 μ‚¬μš©λ˜κ³  μžˆκ΅¬μš”)

     

    μ†Œλ¬Έμ— μ˜ν•˜λ©΄ μ œμž„μŠ€κ³ μŠ¬λ§μ΄λΌλŠ” μ‚¬λžŒμ΄ κ°€μ „μ œν’ˆ 내에 νƒ‘μž¬ν•΄ λ™μž‘ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•˜λ €κ³  ν•˜λŠ”λ° κ·Έ λ‹Ήμ‹œμ—λŠ” μœ λ‹‰μŠ€ 기반의 배경을 가지고 μžˆμ—ˆκΈ° λ•Œλ¬Έμ— μ‚¬μš©ν•˜λ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ C/C++의 νŠΉμ„±μƒ μ—¬λŸ¬ ν•˜λ“œμ›¨μ–΄λ₯Ό μ»€λ²„ν•˜κΈ°μ—λŠ” κ°™μ€ κΈ°λŠ₯의 μ†ŒμŠ€λ₯Ό 각 ν•˜λ“œμ›¨μ–΄μ— 맞게 μž‘μ„±ν•΄μ•Όν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ΄ μžˆμ–΄μ„œ JAVAλ₯Ό κ°œλ°œν•˜κ²Œ λ˜μ—ˆλ‹€κ³ ν•΄μš”

     

    JAVA의 κ°€μž₯ 큰 νŠΉμ§• 쀑 ν•˜λ‚˜κ°€ λ°”λ‘œ μ–΄λŠ ν”Œλž«νΌ, κ·ΈλŸ¬λ‹ˆκΉŒ μ–΄λŠ ν•˜λ“œμ›¨μ–΄(CPU)던, μ–΄λŠ 운영체제(OS)이던 상관없이 μ»΄νŒŒμΌλœ μ½”λ“œ(λ°”μ΄νŠΈμ½”λ“œ)κ°€ ν”Œλž«νΌ λ…λ¦½μ μ΄λΌλŠ” μ μ΄μ—μš”. 

     

    λ‹€μ‹œ λ§ν•΄μ„œ μ–΄λŠ ν”Œλž«νΌμ΄λ“  μž‘μ„±ν•œ μ†ŒμŠ€λ₯Ό λ³€κ²½ν•  ν•„μš” 없이 λ‹€ μ‹€ν–‰μ‹œν‚¬ 수 μžˆλ‹€λŠ” 것이죠 κ·Έλ¦¬κ³  λ°”λ‘œ 이 점이 μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ νŠΉμ„±κ³Ό λ§žμ•„ λ–¨μ–΄μ Έ 폭발적인 인기와 ν•¨κ»˜ ν˜„μž¬ μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ— κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” μ–Έμ–΄ 쀑에 ν•˜λ‚˜κ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€

     

     

     

    μ΄λŸ¬ν•œ νŠΉμ§•μ„ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ°”λ‘œ 였늘의 주제인 JVM(JAVA Virtual Machine)이 ν•„μš”ν•©λ‹ˆλ‹€ JVM, μžλ°” 가상 머신은 λ‹¨μˆœν•˜κ²Œ λ§ν•˜λ©΄ 컴파일된 μ½”λ“œ(λ°”μ΄νŠΈμ½”λ“œ)λ₯Ό μ‹€ν–‰μ‹œμΌœμ£ΌλŠ” κ°€μƒμ˜ 컴퓨터라고 μƒκ°ν•˜μ‹œλ©΄ λ‹€μŒ 글을 μ΄ν•΄ν•˜κΈ° μ‰¬μšΈκ±°μ—μš”

    (참고둜 JVM은 H/W와 OS μœ„μ—μ„œ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— JVM μžμ²΄λŠ” ν”Œλž«νΌμ— 쒅속적 즉, ν”Œλž«νΌμ— 따라 ν˜Έν™˜λ˜λŠ” JVM을 μ‹€ν–‰μ‹œμΌœμ€˜μ•Όν•¨)

     

    μžλ°” μ½”λ“œ(JAVA Code) μ‹€ν–‰ κ³Όμ •

    JVM의 속을 λ“€μ—¬λ‹€ 보기 전에 JVMμ—κ²Œ μ½”λ“œκ°€ μ „λ‹¬λ˜κΈ° κΉŒμ§€μ˜ 과정을 κ°„λ‹¨ν•˜κ²Œ μ‚΄νŽ΄λ³΄λ €κ³  ν•΄μš”

     

     

    μžλ°” μ½”λ“œ(JAVA Code) μ‹€ν–‰κ³Όμ •
    μžλ°” μ½”λ“œ(JAVA Code) μ‹€ν–‰κ³Όμ •

     

     

     

    μœ„μ˜ 그림을 보면 μ–΄λ–€μ‹μœΌλ‘œ λŒμ•„κ°€λŠ”μ§€ ν•œ λˆˆμ— μ•Œ 수 μžˆλŠ”λ°μš” λ‹¨κ³„λ³„λ‘œ μ§šμ–΄λ³Όκ²Œμš”

     

    1) μž‘μ„±ν•œ μžλ°”μ†ŒμŠ€(JAVA Source), 즉 ν™•μž₯μžκ°€ .java인 νŒŒμΌμ„ μžλ°” 컴파일러(JAVA Compiler)λ₯Ό 톡해 μžλ°” λ°”μ΄νŠΈμ½”λ“œ(JAVA Byte Code)둜 μ»΄νŒŒμΌν•œλ‹€.

     

    2) 컴파일된 λ°”μ΄νŠΈμ½”λ“œλ₯Ό JVM의 ν΄λž˜μŠ€λ‘œλ”(Class Loader)μ—κ²Œ μ „λ‹¬ν•œλ‹€.

     

    3) ν΄λž˜μŠ€λ‘œλ”λŠ” λ™μ λ‘œλ”©(Dynamic Loading)을 톡해 ν•„μš”ν•œ ν΄λž˜μŠ€λ“€μ„ λ‘œλ”© 및 λ§ν¬ν•˜μ—¬ λŸ°νƒ€μž„ 데이터 μ˜μ—­(Runtime Data area), 즉 JVM의 λ©”λͺ¨λ¦¬μ— μ˜¬λ¦°λ‹€.

     

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

     

     

    이제 μž‘μ„±ν•œ μžλ°” μ†ŒμŠ€κ°€ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ” 건지 νŒŒμ•…ν–ˆμœΌλ‹ˆ 본격적으둜 JVM의 속을 λ“€μ—¬λ‹€ λ³Όκ²Œμš”

     

    JRE μ•ˆμ— μžˆλŠ” JVM
    JRE μ•ˆμ— μžˆλŠ” JVM

     

     

    JVM λ™μž‘μ›λ¦¬ 및 κΈ°λ³Έκ°œλ…

    JVM은 JAVA의 처음이자 끝이기 λ•Œλ¬Έμ— 였늘 μ •λ¦¬ν•œ λ‚΄μš©λ§ŒμœΌλ‘œ λ‹€ μ •λ¦¬ν–ˆλ‹€λŠ” 생각은 μ ˆλŒ€ ν•˜μ§€ μ•Šκ³  μ°¨μΈ° μ°¨μΈ° 더 μžμ„Ένžˆ 그리고 μ™„λ²½νžˆ 정리할 μ˜ˆμ •μ΄μ—μš” μ˜€λŠ˜μ€ λ§›λ³΄κΈ°λ‘œ μ–΄λ–»κ²Œ κ΅¬μ„±λ˜μ–΄ 있으며 각 ꡬ성원듀이 μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€μ— λŒ€ν•΄μ„œ μ •λ¦¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€

     

    μˆœμ„œλŠ” λ‹€μŒκ³Ό 같이

     

    1) 클래슀 λ‘œλ” ( Class Loader )

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

    3) μ‹€ν–‰ 엔진 ( Execution Engine )

     

     

    클래슀 λ‘œλ” (Class loader)

    클래슀 λ‘œλ”μ˜ νŠΉμ§•μ€ 크게 보면 5κ°€μ§€λ‘œ λ‚˜λˆŒ 수 μžˆμ–΄μš”

     

    1 - 계측ꡬ쑰

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

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

    4 - μ–Έλ‘œλ“œ(Unload) λΆˆκ°€

    5 - 이름곡간(Name Space)

     

    λ™μ λ‘œλ”©λ„ λͺ¨λ₯΄λ˜ λ‚˜μ—κ²Œ ν΄λž˜μŠ€λ‘œλ”λ„ μƒμ†Œν–ˆμ§€λ§Œ 각 νŠΉμ§•λ“€μ„ μ°¨λ‘€λŒ€λ‘œ μ •λ¦¬ν•΄λ³Όκ²Œμš”

     

     

    1 - 계측ꡬ쑰

    클래슀 λ‘œλ”(Class Loader) 계측ꡬ쑰
    클래슀 λ‘œλ”(Class Loader) 계측ꡬ쑰

     

    클래슀 λ‘œλ”λŠ” λ‹¨μˆœν•˜κ²Œ ν•˜λ‚˜λ‘œ 이루어져 μžˆμ§€ μ•Šμ•„μš” μœ„μ˜ 그림처럼 μ—¬λŸ¬ 클래슀 λ‘œλ”λΌλ¦¬ λΆ€λͺ¨-μžμ‹ 관계λ₯Ό 이루고 μžˆμ–΄μ„œ 계측적인 ꡬ쑰둜 λ˜μ–΄ μžˆλŠ”λ°μš” κ° ν΄λž˜μŠ€λ‘œλ”λ“€μ„ μ •λ¦¬ν•˜μžλ©΄ λ‹€μŒκ³Ό κ°™μ•„μš”

     

    · λΆ€νŠΈμŠ€νŠΈλž© 클래슀 λ‘œλ”(Bootstrap Class Loader)

    - μ΅œμƒμœ„ ν΄λž˜μŠ€λ‘œλ”λ‘œ μœ μΌν•˜κ²Œ JAVAκ°€ μ•„λ‹ˆλΌ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ κ΅¬ν˜„μ΄ λ˜μ–΄μžˆλ‹€.

    - JVM이 싀행될 λ•Œ 같이 λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°„λ‹€

    - Object 클래슀λ₯Ό λΉ„λ‘―ν•˜μ—¬ JAVA API듀을 λ‘œλ“œν•œλ‹€.

     

    · μ΅μŠ€ν…μ…˜ 클래슀 λ‘œλ”(Extension Class Loader)

    - κΈ°λ³Έ JAVA APIλ₯Ό μ œμ™Έν•œ ν™•μž₯ ν΄λž˜μŠ€λ“€μ„ λ‘œλ“œν•œλ‹€. (λ‹€μ–‘ν•œ λ³΄μ•ˆ ν™•μž₯κΈ°λŠ₯ λ‘œλ“œ)

     

    · μ‹œμŠ€ν…œ 클래슀 λ‘œλ”(System Class Loader)

    - λΆ€νŠΈμŠ€νŠΈλž©κ³Ό μ΅μŠ€ν…μ…˜ ν΄λž˜μŠ€λ‘œλ”κ°€ JVM 자체의 κ΅¬μ„±μš”μ†Œλ“€μ„ λ‘œλ“œν•œλ‹€λ©΄, μ‹œμŠ€ν…œ 클래슀 λ‘œλ”λŠ” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ν΄λž˜μŠ€λ“€μ„ λ‘œλ“œν•œλ‹€.

    - μ‚¬μš©μžκ°€ μ§€μ •ν•œ $CLASSPATH λ‚΄μ˜ ν΄λž˜μŠ€λ“€μ„ λ‘œλ“œν•œλ‹€.

     

    · μ‚¬μš©μž μ •μ˜ ν΄λž˜μŠ€ λ‘œλ”(User-Defined Class Loader)

    - μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ‚¬μš©μžκ°€ 직접 μ½”λ“œμƒμ—μ„œ μƒμ„±ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” ν΄λž˜μŠ€λ‘œλ”.

     

    μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„(Web Application Server : WAS)와 같은 ν”„λ ˆμž„ μ›Œν¬λŠ” μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜, μ—”ν„°ν”„λΌμ΄μ¦ˆ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ„œλ‘œ λ…λ¦­μ ‘μœΌλ‘œ λ™μž‘ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄μ„œ μ‚¬μš©μž μ •μ˜ 클래슀 λ‘œλ”λ“€μ„ μ‚¬μš©ν•˜μ—¬ ν΄λž˜μŠ€ λ‘œλ”μ˜ μœ„μž„ λͺ¨λΈμ„ 톡해 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 독립성을 보μž₯ν•œλ‹€κ³  ν•΄μš”

     

    λ”°λΌμ„œ WAS의 클래슀 λ‘œλ” κ΅¬μ‘°λŠ” WASλ²€λ”λ§ˆλ‹€ μ‘°κΈˆμ”© λ‹€λ₯Έ ν˜•νƒœμ˜ 계측 ꡬ쑰λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€κ³  ν•©λ‹ˆλ‹€

     

     

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

    클래슀 λ‘œλ”(Class Loader) μœ„μž„λͺ¨λΈ
    클래슀 λ‘œλ”(Class Loader) μœ„μž„λͺ¨λΈ

     

     

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

     

    1 - 클래슀 λ‘œλ” μΊμ‹œ

    2 - μƒμœ„ 클래슀 λ‘œλ”

    3 - 자기 μžμ‹ 

     

    이전에 λ‘œλ“œλœ ν΄λž˜μŠ€μΈμ§€ 클래슀 λ‘œλ” μΊμ‹œλ₯Ό ν™•μΈν•˜κ³ , μ—†μœΌλ©΄ μƒμœ„ 클래슀 λ‘œλ”λ₯Ό ν•˜λ‚˜μ”© 거슬러 μ˜¬λΌκ°€λ©° ν™•μΈν•˜λŠ”λ° 이 λ•Œ μ€‘μš”ν•œ 점은 μ˜¬λΌκ°€λŠ” 도쀑에 클래슀λ₯Ό λ°œκ²¬ν•˜λ”λΌλ„ λΆ€νŠΈμŠ€νŠΈλž© 클래슀 λ‘œλ”κΉŒμ§€ 확인을 ν•΄μ„œ λΆ€νŠΈμŠ€νŠΈλž© 클래슀 λ‘œλ”μ—λ„ ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•˜λ©΄ λΆ€νŠΈμŠ€νŠΈλž© 클래슀 λ‘œλ”μ— μžˆλŠ” 클래슀λ₯Ό λ‘œλ“œν•œλ‹€λŠ” μ μ΄μ—μš”

     

    예λ₯Όλ“€μ–΄, μš”μ²­ 받은 ν΄λž˜μŠ€κ°€ μ‹œμŠ€ν…œ 클래슀 λ‘œλ”μ— μ‘΄μž¬ν•˜μ—¬λ„ λΆ€νŠΈμŠ€νŠΈλž© 클래슀 λ‘œλ”κΉŒμ§€ 확인을 ν•˜κ³  λΆ€νŠΈμŠ€νŠΈλž©μ—λ„ ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ μ‘΄μž¬ν•˜λ©΄ λΆ€νŠΈμŠ€νŠΈλž©μ— μžˆλŠ” 클래슀λ₯Ό λ‘œλ“œν•˜κ²Œ λ˜λŠ”κ±°μ£ 

     

    μ΄λŸ¬ν•œ νŠΉμ„±μœΌλ‘œ μΈν•΄μ„œ μ•„ν‚€ν…μ²˜λ₯Ό κ΅¬μ„±ν•˜λŠ” μˆ˜μ€€μ˜ 개발자라면 JVM에 λŒ€ν•œ 지식이 κΌ­ ν•„μš”ν•œ κ±°κ² μ£ 

    (참고둜 IBMμ—μ„œ λ§Œλ“  μ–΄λ–€ WASλŠ” μ˜΅μ…˜μ„ ν†΅ν•΄μ„œ 쀑간에 클래슀λ₯Ό λ°œκ²¬ν•˜λ©΄ λΆ€νŠΈμŠ€νŠΈλž© 클래슀 λ‘œλ”κΉŒμ§€ μ˜¬λΌκ°€μ§€ μ•Šλ„λ‘ ν•  수 μžˆλ„λ‘ ν–ˆλ‹€κ³  ν•΄μš”)

     

    λ§ˆμ§€λ§‰μœΌλ‘œ λΆ€νŠΈμŠ€νŠΈλž© 클래슀 λ‘œλ”μ—λ„ ν•΄λ‹Ή ν΄λž˜μŠ€κ°€ μ—†μœΌλ©΄ λ‘œλ“œλ₯Ό μš”μ²­λ°›μ€ 클래슀 λ‘œλ”κ°€ νŒŒμΌ μ‹œμŠ€ν…œμ—μ„œ ν•΄λ‹Ή 클래슀λ₯Ό μ°ΎλŠ”κ²ƒμœΌλ‘œ 마무리 λ©λ‹ˆλ‹€

    (파일 μ‹œμŠ€ν…œμ—μ„œλ„ 찾지 λͺ»ν•˜λ©΄ 클래슀λ₯Ό 찾지 λͺ»ν–ˆλ‹€λŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•˜κ² μ£ ?)

     

     

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

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

     

    μ΄λŸ¬ν•œ νŠΉμ„± λ˜ν•œ JVM을 κ³΅λΆ€ν•΄μ•Όν•˜λŠ” μ΄μœ κ°€ 되겠죠

     

    4 - μ–Έλ‘œλ“œ(Unload) λΆˆκ°€

    μ–Έλ‘œλ“œ λΆˆκ°€ μ—­μ‹œ κ°„λ‹¨ν•œ κ°œλ…μœΌλ‘œ 말 κ·ΈλŒ€λ‘œ 클래슀λ₯Ό λ‘œλ“œν•˜λŠ” 것은 κ°€λŠ₯ν•˜μ§€λ§Œ λ°˜λŒ€λ‘œ μ–Έλ‘œλ“œ(Unload)ν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” νŠΉμ„±μž…λ‹ˆλ‹€

     

     

    5 - 이름곡간(Name space)

    λ„€μž„μŠ€νŽ˜μ΄μŠ€λž€ 각 클래슀 λ‘œλ”λ“€μ΄ 가지고 μžˆλŠ” κ³΅κ°„μœΌλ‘œμ¨ λ‘œλ“œλœ 클래슀λ₯Ό λ³΄κ΄€ν•˜λŠ” κ³΅κ°„μ΄μ—μš” ν΄λž˜μŠ€λ₯Ό λ‘œλ“œν•  λ•Œ μœ„μž„ λͺ¨λΈμ„ ν†΅ν•΄μ„œ μƒμœ„ 클래슀 λ‘œλ”λ“€μ„ ν™•μΈν•˜λŠ”λ° κ·Έ λ•Œ ν™•μΈν•˜λŠ” 곡간이 λ°”λ‘œ λ„€μž„μŠ€νŽ˜μ΄μŠ€μž…λ‹ˆλ‹€ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— λ³΄κ΄€λ˜λŠ” 기쀀은 FQCN(Fully Qualified Class Name)을 κΈ°μ€€μœΌλ‘œ λ³΄κ΄€λ˜λŠ”λ° FQCNμ΄λž€ νŒ¨ν‚€μ§€λͺ…κΉŒμ§€ ν¬ν•¨λ˜μ–΄μžˆλŠ” μ‹λ³„μžλ₯Ό λœ»ν•΄μš”

     

    각각의 클래슀 λ‘œλ”κ°€ 각자 λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 가지고 있기 λ•Œλ¬Έμ— νŒ¨ν‚€μ§€λͺ…κΉŒμ§€ 같은 즉, FQCN이 같은 ν΄λž˜μŠ€λΌλ„ λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ λ‹€λ₯΄λ©΄(λ‹€λ₯Έ 클래슀 λ‘œλ”κ°€ λ‘œλ“œν•œ 클래슀이면) λ‹€λ₯Έ 클래슀둜 κ°„μ£Όν•˜λŠ”κ²ƒμ΄μ£ 

    (이 νŠΉμ„±μ„ μ΄μš©ν•˜λ©΄ μ–Έλ‘œλ“œλ₯Ό λŒ€μ‹ ν•΄μ„œ λ‘œλ“œν•œ 클래슀 λ‘œλ”λ₯Ό μ œκ±°ν•˜λ©΄ 마치 μ–Έλ‘œλ“œν•œ 것과 같은 효과λ₯Ό 쀄 수 μžˆμŠ΅λ‹ˆλ‹€)

     

     

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

    클래슀 λ‘œλ”κ°€ 아직 λ‘œλ“œλ˜μ§€ μ•Šμ€ 클래슀λ₯Ό λ‘œλ“œν•˜λŠ” 과정을 κ°„λ‹¨ν•˜κ²Œ μ‚΄νŽ΄λ³΄λ©΄

     

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

     

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

     

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

     

    3 - μ€€λΉ„ : ν΄λž˜μŠ€κ°€ ν•„μš”λ‘œ ν•˜λŠ” λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•œλ‹€. ν•„μš”ν•œ λ©”λͺ¨λ¦¬λž€ ν΄λž˜μŠ€μ—μ„œ μ •μ˜λœ ν•„λ“œ, λ©”μ„œλ“œ, μΈν„°νŽ˜μ΄μŠ€λ“€μ„ λ‚˜νƒ€λ‚΄λŠ” 데이터 ꡬ쑰듀 등등을 λ§ν•œλ‹€.

     

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

     

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

     

     

    (μ—¬κΈ°μ„œ 뢄석 κ³Όμ •μ—μ„œ 심볼릭 레퍼런슀λ₯Ό λ‹€μ΄λ ‰νŠΈ 레퍼런슀둜 λ³€κ²½ν•œλ‹€λŠ”λ° 이게 무슨 μ˜λ―ΈμΈμ§€.. μ•„μ‹œλŠ” λΆ„ λŒ“κΈ€λ‘œ λ‚¨κ²¨μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€γ…œγ…œ)

     

     

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

    JVM이 OSμœ„μ—μ„œ μ‹€ν–‰λ˜λ©΄μ„œ ν• λ‹Ήλ°›λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­μ΄ λ°”λ‘œ λŸ°νƒ€μž„ 데이터 μ˜μ—­(Runtime Data Area)μ΄μ—μš” μ΄ μ˜μ—­μ€ 크게 5가지 쑰금 μ„ΈλΆ„ν™”ν•˜λ©΄ 6가지 μ˜μ—­μœΌλ‘œ λ‚˜λˆŒ 수 μžˆλŠ”λ°μš”

     

     

    이 쀑 PC λ ˆμ§€μŠ€ν„°(PC Register), JVM μŠ€νƒ(JVM Stack), λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ μŠ€νƒ(Native Method Stack)은 μŠ€λ ˆλ“œ(Thread)λ§ˆλ‹€ ν•˜λ‚˜μ”© μƒμ„±λ˜κ³  νž™(Heap), λ©”μ„œλ“œμ˜μ—­(Method Area)은 λͺ¨λ“  μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•΄μ„œ μ‚¬μš©λ˜μš”

     

    각 μ˜μ—­μ„ 정리해보면

     

    · PC λ ˆμ§€μŠ€ν„°(PC Register) : PC(Program Counter) λ ˆμ§€μŠ€ν„°λŠ” ν˜„μž¬ μˆ˜ν–‰ 쀑인 λͺ…λ Ήμ˜ μ£Όμ†Œλ₯Ό 가지며 μŠ€λ ˆλ“œκ°€ μ‹œμž‘λ  λ•Œ μƒμ„±λ˜λ©° 각 μŠ€λ ˆλ“œλ§ˆλ‹€ ν•˜λ‚˜μ”© μ‘΄μž¬ν•œλ‹€.

     

    · JVM μŠ€νƒ(JVM Stack) : μŠ€νƒ ν”„λ ˆμž„(Stack Frame)μ΄λΌλŠ” ꡬ쑰체λ₯Ό μ €μž₯ν•˜λŠ” μŠ€νƒμ΄λ‹€. μ˜ˆμ™Έ λ°œμƒ μ‹œ printStackTrace() λ©”μ„œλ“œλ‘œ λ³΄μ—¬μ£ΌλŠ” Stack Trace의 각 라인 ν•˜λ‚˜κ°€ μŠ€νƒ ν”„λ ˆμž„μ„ ν‘œν˜„ν•œλ‹€. JVM μŠ€νƒ μ—­μ‹œ PC λ ˆμ§€μŠ€ν„°μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μŠ€λ ˆλ“œκ°€ μ‹œμž‘λ  λ•Œ μƒμ„±λ˜λ©° 각 μŠ€λ ˆλ“œλ§ˆλ‹€ ν•˜λ‚˜μ”© μ‘΄μž¬ν•œλ‹€.

     

    · λ„€μ΄ν‹°λΈŒ λ©”μ„œλ“œ μŠ€νƒ(Native Method Stack) : JAVA μ™Έμ˜ μ–Έμ–΄λ‘œ μž‘μ„±λœ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό μœ„ν•œ μŠ€νƒμ΄λ‹€. JNI(JAVA Native Interface)λ₯Ό 톡해 ν˜ΈμΆœν•˜λŠ” C/C++ λ“±μ˜ μ½”λ“œλ₯Ό μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ μŠ€νƒμœΌλ‘œ, 언어에 맞게 μŠ€νƒμ΄ μƒμ„±λœλ‹€. (Cλ©΄ CμŠ€νƒ, C++이면 C++μŠ€νƒ 생성)

     

    · νž™ : μΈμŠ€ν„΄μŠ€ λ˜λŠ” 객체λ₯Ό μ €μž₯ν•˜λŠ” κ³΅κ°„μœΌλ‘œ 가비지 μ»¬λ ‰μ…˜(Garbage Collection) λŒ€μƒμ΄λ‹€. JVM μ„±λŠ₯ λ“±μ˜ μ΄μŠˆμ—μ„œ κ°€μž₯ 많이 μ–ΈκΈ‰λ˜λŠ” 곡간이닀. νž™ ꡬ성 λ°©μ‹μ΄λ‚˜ 가비지 μ»¬λ ‰μ…˜ 방법 등은 JVM λ²€λ”λ“€μ˜ μž¬λŸ‰μ΄λ‹€.

     

    · λ©”μ„œλ“œ μ˜μ—­(Method Area) : λͺ¨λ“  μŠ€λ ˆλ“œκ°€ κ³΅μœ ν•˜λŠ” μ˜μ—­μœΌλ‘œ JVM이 μ‹œμž‘λ  λ•Œ μƒμ„±λœλ‹€. JVM이 읽어 듀인 각각의 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•œ λŸ°νƒ€μž„ μƒμˆ˜ ν’€, ν•„λ“œμ™€ λ©”μ„œλ“œμ— λŒ€ν•œ 정보, Static λ³€μˆ˜, λ©”μ„œλ“œμ˜ λ°”μ΄νŠΈ μ½”λ“œ 등을 λ³΄κ΄€ν•œλ‹€.

     

    * λ©”μ„œλ“œ μ˜μ—­μ€ JVMλ²€λ”λ§ˆλ‹€ λ‹€μ–‘ν•œ ν˜•νƒœλ‘œ κ΅¬ν˜„ν•  수 있으며, 였라클 ν•«μŠ€νŒŸ JVM(HotSpot JVM)μ—μ„œλŠ” ν”νžˆ Permanent Area, ν˜Ήμ€ Permanent Generation(PermGen) 이라고 λΆˆλ¦°λ‹€. λ©”μ„œλ“œ μ˜μ—­μ— λŒ€ν•œ 가비지 μ»¬λ ‰μ…˜μ€ JVM λ²€λ”μ˜ 선택 사항이닀.

     

    · λŸ°νƒ€μž„ μƒμˆ˜ ν’€(Runtime Constant Pool) : JVM λ™μž‘μ—μ„œ κ°€μž₯ 핡심적인 역할을 μˆ˜ν–‰ν•˜λŠ” 곳으둜 JVM λͺ…μ„Έμ—μ„œλ„ λ”°λ‘œ μ€‘μš”ν•˜κ²Œ κΈ°μˆ ν•œλ‹€. 각 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ μƒμˆ˜ 뿐만 μ•„λ‹ˆλΌ, λ©”μ„œλ“œμ™€ ν•„λ“œμ— λŒ€ν•œ λͺ¨λ“  λ ˆνΌλŸ°μŠ€κΉŒμ§€ λ‹΄κ³  μžˆλŠ” ν…Œμ΄λΈ”λ‘œ μ–΄λ–€ λ©”μ„œλ“œλ‚˜ ν•„λ“œλ₯Ό μ°Έμ‘°ν•  λ•Œ JVM은 λŸ°νƒ€μž„ μƒμˆ˜ 풀을 톡해 ν•΄λ‹Ή λ©”μ„œλ“œλ‚˜ ν•„λ“œμ˜ μ‹€μ œ λ©”λͺ¨λ¦¬μƒ μ£Όμ†Œλ₯Ό μ°Ύμ•„μ„œ μ°Έμ‘°ν•œλ‹€.

     

     

    μ‹€ν–‰ 엔진(Execution Engine)

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

    (CPUκ°€ 기계 λͺ…λ Ήμ–΄λ₯Ό ν•˜λ‚˜μ”© μ‹€ν–‰ν•˜λ“―μ΄)

     

    λ°”μ΄νŠΈ μ½”λ“œμ˜ 각 λͺ…λ Ήμ–΄λŠ” 1λ°”μ΄νŠΈ 크기의 OpCode(Operation Code)와 μΆ”κ°€ ν”Όμ—°μ‚°μžλ‘œ 이루어져 μžˆμ–΄μš” μ‹€ν–‰ 엔진은 ν•˜λ‚˜μ˜ OpCodeλ₯Ό κ°€μ Έμ™€μ„œ ν”Όμ—°μ‚°μžμ™€ μž‘μ—…μ„ μˆ˜ν–‰ν•œ λ‹€μŒ, κ·Έ λ‹€μŒ OpCodeλ₯Ό μˆ˜ν–‰ν•˜λŠ” μ‹μœΌλ‘œ λ™μž‘ν•΄μš”

     

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

     

    · 인터프리터 : λ°”μ΄νŠΈ μ½”λ“œ λͺ…λ Ήμ–΄λ₯Ό ν•˜λ‚˜μ”© μ½μ–΄μ„œ ν•΄μ„ν•˜κ³  μ‹€ν–‰ν•œλ‹€. ν•˜λ‚˜ν•˜λ‚˜μ˜ 해석은 λΉ λ₯΄μ§€λ§Œ 전체적인 μ‹€ν–‰ μ†λ„λŠ” λŠλ¦¬λ‹€λŠ” 단점을 가진닀. JVMμ•ˆμ—μ„œ λ°”μ΄νŠΈμ½”λ“œλŠ” 기본적으둜 인터프리터 λ°©μ‹μœΌλ‘œ λ™μž‘ν•œλ‹€. 

     

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

     

    μžλ°” 컴파일러(JAVA Compiler) / JIT 컴파일러(JIT Compiler)
    μžλ°” 컴파일러(JAVA Compiler) / JIT 컴파일러(JIT Compiler)

     

    λ„€μ΄ν‹°λΈŒ μ½”λ“œλŠ” μΊμ‹œμ— λ³΄κ΄€ν•˜κΈ° λ•Œλ¬Έμ— ν•œ 번 컴파일된 μ½”λ“œλŠ” μΊμ‹œμ—μ„œ λ°”λ‘œ κΊΌλ‚΄μ–΄ μ‹€ν–‰ν•˜κΈ° λ•Œλ¬Έμ— λΉ λ₯΄κ²Œ μˆ˜ν–‰λœλ‹€. ν•˜μ§€λ§Œ JIT μ»΄νŒŒμΌλŸ¬κ°€ μ»΄νŒŒμΌν•˜λŠ” 과정은 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό ν•˜λ‚˜μ”© μΈν„°ν”„λ¦¬νŒ… ν•˜λŠ” 것보닀 훨씬 였래 걸리기 λ•Œλ¬Έμ— JIT 컴파일러λ₯Ό μ‚¬μš©ν•˜λŠ” JVM은 λ‚΄λΆ€μ μœΌλ‘œ ν•΄λ‹Ή λ©”μ„œλ“œκ°€ μ–Όλ§ˆλ‚˜ 자주 호좜되고 μ‹€ν–‰λ˜λŠ”μ§€ μ²΄ν¬ν•˜κ³ , 일정 기쀀을 λ„˜μ—ˆμ„ λ•Œμ—λ§Œ JIT 컴파일러λ₯Ό 톡해 μ»΄νŒŒμΌν•˜μ—¬ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό μƒμ„±ν•œλ‹€.

     

     

    JIT 컴파일러λ₯Ό ν†΅ν•œ 컴파일 과정은 λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λ°”λ‘œ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ λ§Œλ“œλŠ” 것이 μ•„λ‹ˆλΌ μ•ˆμ—μ„œ IR(Intermediate Representation)둜 λ³€ν™˜ν•˜μ—¬ μ΅œμ ν™”λ₯Ό μˆ˜ν–‰ν•˜κ³  κ·Έ λ‹€μŒμ— λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ λ³€ν™˜λŠ” 과정을 κ±°μ³μš”

     

    였라클 ν•«μŠ€νŒŸ VM은 ν•«μŠ€νŒŸ 컴파일러라고 λΆˆλ¦¬λŠ” JIT 컴파일러λ₯Ό μ‚¬μš©ν•˜λŠ”λ° λ‚΄λΆ€μ μœΌλ‘œ ν”„λ‘œνŒŒμΌλ§(Profiling)을 톡해 κ°€μž₯ 컴파일이 ν•„μš”ν•œ λΆ€λΆ„, 즉 'ν•«μŠ€νŒŸ'을 μ°Ύμ•„λ‚Έ λ‹€μŒ, 이 ν•«μŠ€νŒŸμ„ μ»΄νŒŒμΌν•˜κΈ° λ•Œλ¬Έμ— ν•«μŠ€νŒŸμ΄λΌ λΆ€λ₯Έλ‹€κ³ ν•΄μš” ν•«μŠ€νŒŸ VM은 ν•œ 번 컴파일된 λ°”μ΄νŠΈμ½”λ“œλΌλ„ ν•΄λ‹Ή λ©”μ„œλ“œκ°€ 더 이상 자주 λΆˆλ¦¬μ§€ μ•ŠλŠ”λ‹€λ©΄, μΊμ‹œμ—μ„œ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό λœμ–΄λ‚΄κ³  λ‹€μ‹œ 인터프리터 λͺ¨λ“œλ‘œ λ™μž‘ν•΄μš”

     

    ν•«μŠ€νŒŸ VM은 μ„œλ²„ VMκ³Ό ν΄λΌμ΄μ–ΈνŠΈ VM으둜 λ‚˜λ‰˜μ–΄ 있고, 각각 λ‹€λ₯Έ JIT 컴파일러λ₯Ό μ‚¬μš©ν•΄μš” κ°κ°μ€ λ™μΌν•œ λŸ°νƒ€μž„μ„ μ‚¬μš©ν•˜μ§€λ§Œ, λ‹€λ₯Έ JIT 컴파일러λ₯Ό μ‚¬μš©ν•΄μš” μ„œλ²„ VMμ—μ„œ μ‚¬μš©λ˜λŠ” μ»΄νŒŒμΌλŸ¬κ°€ 더 λ³΅μž‘ν•˜κ³  λ‹€μ–‘ν•œ μ„±λŠ₯ μ΅œμ ν™” 기법을 μ‚¬μš©ν•˜κ³  μžˆμ–΄μš”

     

    이상 글을 마치며,, μ΄λ ‡κ²Œ κΈ΄ 글을 μ¨λ³΄λŠ”κ±΄ 처음인데 생각보닀 였래 κ±Έλ¦¬λ„€μš”

     

    λΆ€μ‘±ν•œ κΈ€ λκΉŒμ§€ λ΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

     


    이 글은 넀이버 D2 JVM Internal을 μ°Έμ‘°ν•˜μ—¬ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.