λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Java/μžλ°”μ˜ 정석

1μ£Όμ°¨: JVM은 무엇이며 μžλ°” μ½”λ“œλŠ” μ–΄λ–»κ²Œ μ‹€ν–‰ν•˜λŠ” 것인가.

by oliviarla 2022. 8. 23.

Table of Contents

     

    μžλ°”μ˜ 정석을 μ •λ…ν•˜λ €λŠ”λ° λ­”κ°€ 손이 μ•ˆκ°€μ„œ λ°±κΈ°μ„ λ‹˜ μŠ€ν„°λ”” 방식을 λ”°λΌκ°€λ³΄κ³ μž ν•œλ‹€. 1주일에 ν•œλ²ˆμ”©μ΄λΌ 큰 뢀담없이 곡뢀해볼 수 μžˆμ„ 것 κ°™λ‹Ή!😢 μžλ°”μ˜ μ •μ„μ—μ„œ 짚고 λ„˜μ–΄κ°€μ•Όκ² λ‹€ μ‹ΆμœΌλ©΄ λ‚΄μš©μ„ μΆ”κ°€ν•˜λ©΄μ„œ 곡뢀할 μ˜ˆμ •μ΄λŒœ !

    https://github.com/whiteship/live-study

     

    GitHub - whiteship/live-study: 온라인 μŠ€ν„°λ””

    온라인 μŠ€ν„°λ””. Contribute to whiteship/live-study development by creating an account on GitHub.

    github.com

    μžλ°” μ–Έμ–΄μ˜ νŠΉμ§•

    1. μš΄μ˜μ²΄μ œμ— 독립적

        μžλ°” μ‘μš©ν”„λ‘œκ·Έλž¨μ€ μš΄μ˜μ²΄μ œλ‚˜ ν•˜λ“œμ›¨μ–΄κ°€ μ•„λ‹Œ JVMν•˜κ³ λ§Œ ν†΅μ‹ ν•˜λ―€λ‘œ ν•œ 번 μž‘μ„±ν•˜λ©΄ μ–΄λ””μ„œλ‚˜ μ‹€ν–‰λœλ‹€.

    2. 객체지ν–₯ μ–Έμ–΄

        μƒμ†, μΊ‘μŠν™”, λ‹€ν˜•μ„±μ΄ 잘 적용된 μ–Έμ–΄.

    3. μžλ™ λ©”λͺ¨λ¦¬ 관리

        Garbage Collection이 μžλ™μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό 관리해쀀닀.

    4. λ„€νŠΈμ›Œν¬μ™€ λΆ„μ‚° 처리 지원

        λ‹€μ–‘ν•œ λ„€νŠΈμ›Œν¬ ν”„λ‘œκ·Έλž˜λ° 라이브러리 제곡

    5. λ©€ν‹°μŠ€λ ˆλ“œ 지원

        μ‹œμŠ€ν…œκ³Ό 관계없이 λ©€ν‹°μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž¨ κ΅¬ν˜„ κ°€λŠ₯, μ—¬λŸ¬ μŠ€λ ˆλ“œμ— λŒ€ν•œ μŠ€μΌ€μ€„λ§μ„ μžλ°” 인터프리터가 λ‹΄λ‹Ή

    6. 동적 λ‘œλ”© 지원

        μ‹€ν–‰ μ‹œ λͺ¨λ“  ν΄λž˜μŠ€κ°€ λ‘œλ”©λ˜λŠ” λŒ€μ‹ μ—, ν•„μš”ν•œ μ‹œμ μ— 클래슀λ₯Ό λ‘œλ”©ν•΄ μ‚¬μš©, 일뢀 ν΄λž˜μŠ€κ°€ λ³€κ²½λ˜μ–΄λ„ μ»΄νŒŒμΌμ„ λ‹€μ‹œ ν•˜μ§€ μ•Šμ•„λ„ 됨

    JVMμ΄λž€ 무엇인가

    Java Virtual Machine

    - JVM이 OSμ—μ„œ μ‹€ν–‰λ˜λ©΄, Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ JVMν•˜κ³ λ§Œ μƒν˜Έμž‘μš© -> OS에 μ’…μ†λ˜μ§€ μ•ŠμŒ

    - μžλ°”λ‘œ μž‘μ„±ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν•΄λ‹Ή μš΄μ˜μ²΄μ œκ°€ 이해할 수 μžˆλ„λ‘ λ³€ν™˜ν•˜μ—¬ μ „λ‹¬ν•œλ‹€.

    - λŒ€μ‹ , JVM은 OS에 쒅속적이닀.

    컴파일 ν•˜λŠ” 방법

    1. κ°œλ°œμžκ°€ μžλ°” μ†ŒμŠ€μ½”λ“œ(.java)λ₯Ό μž‘μ„±ν•œλ‹€.

    2. μžλ°” 컴파일러(Java Compiler)κ°€ μžλ°” μ†ŒμŠ€νŒŒμΌμ„ μ»΄νŒŒμΌν•˜μ—¬ μžλ°” λ°”μ΄νŠΈ μ½”λ“œ 생성

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

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

    클래슀 λ‘œλ” μ„ΈλΆ€ λ™μž‘
    a. λ‘œλ“œ : 클래슀 νŒŒμΌμ„ κ°€μ Έμ™€μ„œ JVM의 λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•œλ‹€.
    b. 검증 : μžλ°” μ–Έμ–΄ λͺ…μ„Έ(Java Language Specification) 및 JVM λͺ…세에 λͺ…μ‹œλœ λŒ€λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλŠ”μ§€ κ²€μ‚¬ν•œλ‹€.
    c. μ€€λΉ„ : ν΄λž˜μŠ€κ°€ ν•„μš”λ‘œ ν•˜λŠ” λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ή(ν•„λ“œ, λ©”μ„œλ“œ, μΈν„°νŽ˜μ΄μŠ€ λ“±λ“±)
    d. 뢄석 : 클래슀의 μƒμˆ˜ ν’€ λ‚΄ λͺ¨λ“  심볼릭 레퍼런슀λ₯Ό λ‹€μ΄λ ‰νŠΈ 레퍼런슀둜 λ³€κ²½ν•œλ‹€.
    e. μ΄ˆκΈ°ν™” : 클래슀 λ³€μˆ˜λ“€μ€ μ μ ˆν•œ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•œλ‹€.(static ν•„λ“œ)

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

     

    μ‹€ν–‰ν•˜λŠ” 방법

    - JDK μ„€μΉ˜

    - μ„€μΉ˜λœ λ””λ ‰ν† λ¦¬μ˜ bin 디렉토리λ₯Ό path에 μΆ”κ°€

    - μžλ°” 컴파일러λ₯Ό μ‚¬μš©ν•΄ μ†ŒμŠ€μ½”λ“œλ‘œλΆ€ν„° 클래슀 νŒŒμΌμ„ 생성

    - μžλ°” μΈν„°ν”„λ¦¬ν„°λ‘œ 클래슀 파일 μ‹€ν–‰

    λ°”μ΄νŠΈμ½”λ“œλž€ 무엇인가

    JVM이 이해할 수 μžˆλŠ” 기계어

    λ°”μ΄νŠΈ μ½”λ“œμ˜ 각 λͺ…λ Ήμ–΄λŠ” 1λ°”μ΄νŠΈ 크기의 Opcode와 μΆ”κ°€ ν”Όμ—°μ‚°μžλ‘œ 이루어져 μžˆλ‹€.

    JIT μ»΄νŒŒμΌλŸ¬λž€ 무엇이며 μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€

    - λ°”μ΄νŠΈμ½”λ“œ(컴파일된 μžλ°” μ½”λ“œ)λ₯Ό ν•˜λ“œμ›¨μ–΄μ˜ κΈ°κ³„μ–΄λ‘œ λ°”λ‘œ λ³€ν™˜ν•΄μ€Œ

    - 인터프리터 λ°©μ‹μœΌλ‘œ μ‹€ν–‰ν•˜λ‹€κ°€ μ μ ˆν•œ μ‹œμ μ— λ°”μ΄νŠΈμ½”λ“œ 전체λ₯Ό μ»΄νŒŒμΌν•˜μ—¬ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ λ³€κ²½ν•˜κ³ , μ΄ν›„μ—λŠ” ν•΄λ‹Ή λ©”μ„œλ“œλ₯Ό 더 이상 μΈν„°ν”„λ¦¬νŒ…ν•˜μ§€ μ•Šκ³  λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ 직접 μ‹€ν–‰ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ™μž‘ν•¨

    - ν•˜λ‚˜μ”© μΈν„°ν”„λ¦¬νŒ…ν•˜μ—¬ μ‹€ν–‰ν•˜λŠ” 것이 μ•„λ‹ˆλΌ λ°”μ΄νŠΈ μ½”λ“œ 전체가 컴파일된 λ°”μ΄λ„ˆλ¦¬ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 것이기 λ•Œλ¬Έμ— 전체적인 μ‹€ν–‰μ†λ„λŠ” μΈν„°ν”„λ¦¬νŒ… 방식보닀 λΉ λ₯΄λ‹€.

    JVM ꡬ성 μš”μ†Œ

    1. μžλ°” 인터프리터(interpreter)

        μžλ°” μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ λ³€ν™˜λœ μžλ°” λ°”μ΄νŠΈ μ½”λ“œλ₯Ό 읽고 해석함

    2. 클래슀 λ‘œλ”(class loader)

        ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰ 쀑인 λŸ°νƒ€μž„μ—μ„œ λͺ¨λ“  μ½”λ“œκ°€ JVMκ³Ό 연결될 λ•Œ, λ™μ μœΌλ‘œ 클래슀λ₯Ό λ‘œλ”©ν•¨

    3. JIT 컴파일러(Just-In-Time compiler)

        μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ μƒμ„±ν•œ μžλ°” λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λŸ°νƒ€μž„μ— λ°”λ‘œ κΈ°κ³„μ–΄λ‘œ λ³€ν™˜

    4. 가비지 컬렉터(garbage collector)

        더이상 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”λͺ¨λ¦¬ ν•΄μ œ

    JDK와 JRE의 차이

    JDK

    - Java Development Kit

    - JVMκ³Ό μžλ°”ν΄λž˜μŠ€ 라이브러리 μ™Έ μžλ°” κ°œλ°œμ— ν•„μš”ν•œ ν”„λ‘œκ·Έλž¨λ“€ μ„€μΉ˜

    - JRE + κ°œλ°œμ— ν•„μš”ν•œ μ‹€ν–‰νŒŒμΌ (javac.exe, java.exe, javap.exe λ“±)

    JRE

    - Java Runtime Environment

    - μžλ°”λ‘œ μž‘μ„±λœ μ‘μš©ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜κΈ° μœ„ν•œ μ΅œμ†Œ ν™˜κ²½

    - JVM + 클래슀라이브러리(Java API)

     

    좜처

    μžλ°”μ˜ 정석 3판

    http://www.tcpschool.com/java/java_intro_programming

    https://catch-me-java.tistory.com/11

    https://github.com/gyoogle/tech-interview-for-developer/blob/master/Language/%5Bjava%5D%20%EC%9E%90%EB%B0%94%20%EC%BB%B4%ED%8C%8C%EC%9D%BC%20%EA%B3%BC%EC%A0%95.md

     

    λŒ“κΈ€