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

Java

JVM

ν•΄λ‹Ή ν¬μŠ€νŒ…μ€ λ°±κΈ°μ„ λ‹˜μ˜ μΈν”„λŸ° κ°•μ˜(더 μžλ°”, μ½”λ“œλ₯Ό μ‘°μž‘ν•˜λŠ” λ‹€μ–‘ν•œ 방법)λ₯Ό λ“£κ³  μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.

Java, JVM, JDK, JRE

JDK vs JRE vs JVM (좜처: https://howtodoinjava.com/java/basics/jdk-jre-jvm/)

JVM (Java Virtual Machine)

  • μžλ°” λ°”μ΄νŠΈ μ½”λ“œ(.class 파일)λ₯Ό OS에 νŠΉν™”λœ μ½”λ“œλ‘œ λ³€ν™˜(인터프리터와 JIT 컴파일러)ν•˜μ—¬ μ‹€ν–‰ν•œλ‹€.
  • λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” ν‘œμ€€μ΄μž κ΅¬ν˜„μ²΄μ΄λ‹€.
    • JVM μžμ²΄λŠ” ν‘œμ€€, κ΅¬ν˜„μ²΄λŠ” νŠΉμ • 밴더듀이 κ΅¬ν˜„
    • JVM 밴더: 였라클, μ•„λ§ˆμ‘΄, Azul, ... 
  • νŠΉμ • ν”Œλž«νΌμ— 쒅속적이닀.
    • λ°”μ΄νŠΈ μ½”λ“œλ₯Ό λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ λ°”κΏ”μ„œ μ‹€ν–‰ν•΄μ•Όν•˜λŠ”λ°, μ΄λ•Œ λ„€μ΄ν‹°λΈŒ μ½”λ“œκ°€ OS에 쒅속적이기 λ•Œλ¬Έ.

Hello.java와 Hello.class

JRE (Java Runtime Environment)

  • μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  수 μžˆλ„λ‘ ꡬ성 (JVM + 라이브러리)
  • JVMκ³Ό 핡심 라이브러리 및 μžλ°” λŸ°νƒ€μž„ ν™˜κ²½μ—μ„œ μ‚¬μš©ν•˜λŠ” ν”„λ‘œνΌν‹° μ„ΈνŒ…μ΄λ‚˜ λ¦¬μ†ŒμŠ€ νŒŒμΌμ„ 가지고 μžˆλ‹€.

JDK (Java Development Kit)

  • JRE + 개발 툴
  • μ†ŒμŠ€ μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ μ‚¬μš©ν•˜λŠ” μžλ°” μ–Έμ–΄λŠ” ν”Œλž«νΌμ— 독립적이닀.
    • λ°”μ΄νŠΈ μ½”λ“œ(.class 파일)만 μžˆλ‹€λ©΄ JVM μœ„μ—μ„œ λŒμ•„κ°.
    • JVM μ–Έμ–΄: ν΄λ‘œμ €, 그루비, JRuby, Jython, Kotlin, Scala, ...
  • μ˜€λΌν΄μ€ μžλ°” 11λΆ€ν„°λŠ” JDK만 μ œκ³΅ν•˜κ³ , JREλ₯Ό λ”°λ‘œ μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€.

Java

  • ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄
  • JDK에 λ“€μ–΄μžˆλŠ” μžλ°” 컴파일러(javac)λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°”μ΄νŠΈ μ½”λ“œλ‘œ 컴파일 ν•  수 μžˆλ‹€.
  • μžλ°” μœ λ£Œν™”
    • μ˜€λΌν΄μ—μ„œ λ§Œλ“  Oracle JDK 11 버전뢀터 μƒμš©μœΌλ‘œ μ‚¬μš©ν•  λ•Œ 유료
    • μžλ°” μ–Έμ–΄ μžμ²΄κ°€ μœ λ£Œν™”λ˜λŠ”κ²Œ μ•„λ‹˜
    • Open JDK 등은 무료둜 μ‚¬μš©κ°€λŠ₯

JVM ꡬ쑰

JVM ꡬ쑰 (좜처: https://javatutorial.net/jvm-explained)

클래슀 λ‘œλ” μ‹œμŠ€ν…œ

  • .class νŒŒμΌμ—μ„œ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό 읽고 λ©”λͺ¨λ¦¬μ— μ €μž₯
  • λ‘œλ”©: 클래슀 μ½μ–΄μ˜€λŠ” κ³Όμ •
  • 링크: 레퍼런슀λ₯Ό μ—°κ²°ν•˜λŠ” κ³Όμ •
  • μ΄ˆκΈ°ν™”: static κ°’λ“€ μ΄ˆκΈ°ν™” 및 λ³€μˆ˜μ— ν• λ‹Ή

λ©”λͺ¨λ¦¬

  • λ©”μ†Œλ“œ μ˜μ—­
    • 클래슀 μˆ˜μ€€μ˜ 정보(클래슀λͺ…, λΆ€λͺ¨ 클래슀λͺ…, λ©”μ†Œλ“œ, λ³€μˆ˜)λ₯Ό μ €μž₯ν•œλ‹€.
    • 곡유 μžμ› (λ‹€λ₯Έ μ˜μ—­μ—μ„œ μ°Έμ‘° κ°€λŠ₯)
  • νž™ μ˜μ—­
    • 객체λ₯Ό μ €μž₯ν•œλ‹€.
    • 곡유 μžμ› (λ‹€λ₯Έ μ˜μ—­μ—μ„œ μ°Έμ‘° κ°€λŠ₯)
  • μŠ€νƒ μ˜μ—­
    • μ“°λ ˆλ“œ λ§ˆλ‹€ λŸ°νƒ€μž„ μŠ€νƒμ„ λ§Œλ“€κ³ , λ©”μ†Œλ“œ ν˜ΈμΆœμ„ μŠ€νƒ ν”„λ ˆμž„μ΄λΌ λΆ€λ₯΄λŠ” λΈ”λŸ­μœΌλ‘œ μŒ“λŠ”λ‹€.
  • PC(Program Counter) λ ˆμ§€μŠ€ν„°
    • μ“°λ ˆλ“œ λ§ˆλ‹€ μ“°λ ˆλ“œ λ‚΄ ν˜„μž¬ μ‹€ν–‰ν•  λͺ…λ Ήμ˜ μœ„μΉ˜λ₯Ό κ°€λ₯΄ν‚€λŠ” 포인터가 μƒμ„±λœλ‹€.
  • λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œ μŠ€νƒ
    • λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œλž€ Cλ‚˜ C++, μ–΄μ…ˆλΈ”λ¦¬λ‘œ μž‘μ„±λœ λ©”μ†Œλ“œλ‘œ, JNIλ₯Ό 톡해 호좜 κ°€λŠ₯ν•˜λ‹€.
    • λ„€μ΄ν‹°λΈŒ λ©”μ†Œλ“œμ—λŠ” native ν‚€μ›Œλ“œκ°€ λΆ™μ–΄μžˆλ‹€.

 

μ‹€ν–‰ 엔진

  • 인터프리터
    • λ°”μ΄νŠΈ μ½”λ“œλ₯Ό 기계가 이해 ν•  수 μžˆλ„λ‘ ν•œ 쀄 μ”© λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ λ°”κΏ”μ„œ μ‹€ν–‰ν•œλ‹€.
  • JIT 컴파일러
    • 인터프리터 νš¨μœ¨μ„ 높이기 μœ„ν•΄, 인터프리터가 λ°˜λ³΅λ˜λŠ” μ½”λ“œλ₯Ό λ°œκ²¬ν•˜λ©΄ JIT 컴파일러둜 λ°˜λ³΅λ˜λŠ” μ½”λ“œλ₯Ό λͺ¨λ‘ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ λ°”κΏ”λ‘”λ‹€.
  • GC(Garbage Collector)
    • 더 이상 μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” 객체λ₯Ό λͺ¨μ•„μ„œ μ •λ¦¬ν•œλ‹€.

클래슀 λ‘œλ”

클래슀 λ‘œλ” (좜처: https://javatutorial.net/jvm-explained)

 

λ‘œλ”©, 링크, μ΄ˆκΈ°ν™” 순으둜 μ§„ν–‰λœλ‹€.

λ‘œλ”©

  • 클래슀 λ‘œλ”κ°€ λ°”μ΄νŠΈ νŒŒμΌμ„ 읽고 λ‚΄μš©μ— 따라 μ μ ˆν•œ λ°”μ΄λ„ˆλ¦¬ 데이터λ₯Ό λ§Œλ“€κ³  "λ©”μ†Œλ“œ" μ˜μ—­μ— μ €μž₯ν•œλ‹€.
  • λ©”μ†Œλ“œ μ˜μ—­μ— μ €μž₯ν•˜λŠ” 데이터
    • FQCN(Fully Qualified Class Name): νŒ¨ν‚€μ§€ 이름 + 클래슀 이름 (+ 클래슀 λ‘œλ”)
    • 클래슀, μΈν„°νŽ˜μ΄μŠ€, μ΄λ„˜
    • λ©”μ†Œλ“œ, λ³€μˆ˜
  • λ‘œλ”©μ΄ λλ‚˜λ©΄ ν•΄λ‹Ή 클래슀 νƒ€μž…μ˜ Class 객체λ₯Ό μƒμ„±ν•˜μ—¬ "νž™" μ˜μ—­μ— μ €μž₯ν•œλ‹€.
    • Class<Hello>

링크

  • Verify, Prepare, Resolve(optional) μ„Έ λ‹¨κ³„λ‘œ λ‚˜λˆ μ Έ μžˆλ‹€.
    • Verify: .class 파일 ν˜•μ‹ μœ νš¨μ„± 체크
    • Prepare: 클래슀 λ³€μˆ˜(static λ³€μˆ˜)와 기본값에 ν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό μ€€λΉ„
    • Resolve(optional): 심볼릭 λ©”λͺ¨λ¦¬ 레퍼런슀λ₯Ό λ©”μ†Œλ“œ μ˜μ—­μ— μžˆλŠ” μ‹€μ œ 레퍼런슀둜 ꡐ체
      • 심볼릭 λ ˆνΌλŸ°μŠ€λŠ” μ°Έμ‘°ν•˜λŠ” λŒ€μƒμ˜ μ΄λ¦„λ§Œμ„ μ§€μΉ­ν•œ 것이닀.

 

μ΄ˆκΈ°ν™”

  • static λ³€μˆ˜μ˜ 값을 ν• λ‹Ήν•œλ‹€.
  • static 블둝을 μ‹€ν–‰ν•œλ‹€.

클래슀 λ‘œλ”λŠ” 계측 ꡬ쑰둜 이루어져 μžˆλ‹€.

λΆ€νŠΈ 슀트랩 클래슀 λ‘œλ”

  • JAVA_HOME\lib에 μžˆλŠ” μ½”μ–΄ μžλ°” APIλ₯Ό μ œκ³΅ν•œλ‹€.
  • μ΅œμƒμœ„ μš°μ„ μˆœμœ„λ₯Ό 가진 클래슀 λ‘œλ”

ν”Œλž«νΌ 클래슀 λ‘œλ”

  • JAVA_HOME\lib\ext 폴더 λ˜λŠ” java.ext.dirs μ‹œμŠ€ν…œ λ³€μˆ˜μ— ν•΄λ‹Ήν•˜λŠ” μœ„μΉ˜μ— μžˆλŠ” 클래슀λ₯Ό μ½λŠ”λ‹€.

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 클래슀 λ‘œλ”

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν΄λž˜μŠ€νŒ¨μŠ€μ—μ„œ 클래슀λ₯Ό μ½λŠ”λ‹€.
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 클래슀패슀: μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ν•  λ•Œ μ£ΌλŠ” -classpath μ˜΅μ…˜ λ˜λŠ” java.class.path ν™˜κ²½ λ³€μˆ˜μ˜ 값에 ν•΄λ‹Ήν•˜λŠ” μœ„μΉ˜