โ˜•๐ŸŒฑ ์Šคํ„ฐ๋”” 1์ฃผ์ฐจ ์ •๋ฆฌ Java์˜ ์‹คํ–‰ ๋ชจ๋ธ: Java์˜ Compile and Run!

ํ•˜๋ž‘ยท2021๋…„ 2์›” 18์ผ
1

Study OOP / Java / Spring

๋ชฉ๋ก ๋ณด๊ธฐ
2/2
post-thumbnail

Java์˜ ์‹คํ–‰๋ชจ๋ธ

์‹œ์ž‘์— ์•ž์„œ, ์ด ๊ธ€์€ ์ฑ…, ๊ฐ•์˜, ๊ตฌ๊ธ€๋ง๋“ฑ์„ ํ†ตํ•ด ๊ฐœ์ธ์ ์œผ๋กœ ํ•™์Šต ๋ฐ ์‹ค์Šตํ•œ ๊ฐœ๋…์„ ์ •๋ฆฌํ•œ ๊ธ€์ด๋ฉฐ, ์ •ํ™•ํ•˜์ง€ ์•Š์€ ๋‚ด์šฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊พธ์ค€ํžˆ ๊ณต๋ถ€ํ•ด๊ฐ€๋ฉฐ ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์˜ค๋ฅ˜ ์ง€์ ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค.

Java ์‹คํ–‰ ๋ชจ๋ธ์˜ ํฐ ๊ทธ๋ฆผ

์ผ๋‹จ ์„ธ๋ถ€์ ์ธ ๊ตฌ๋™์›๋ฆฌ๋Š” ์ œ์ณ๋‘๊ณ , ๊ฐœ๋žต์ ์œผ๋กœ ํ•„์ˆ˜์ ์ธ ์‚ฌํ•ญ๋งŒ ์‚ดํŽด๋ด„์œผ๋กœ์จ Java ์‹คํ–‰ ๋ชจ๋ธ์— ๋Œ€ํ•œ ๊ฐ์„ ์žก์•„๋ณด์ž.

Java Program์˜ ์‹คํ–‰ ๊ตฌ์กฐ์™€ JVM

์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋žจ์€ ์šด์˜์ฒด์ œ ์œ„์—์„œ ์‹คํ–‰๋œ๋‹ค. ๊ทธ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

HW๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ OS๊ฐ€ ๋™์ž‘ํ•˜๊ณ , ๊ทธ ์œ„์—์„œ Program์ด ์‹คํ–‰๋˜๋Š” ๊ตฌ์กฐ๋‹ค. ์ฆ‰, HW ์œ„์—์„œ ์‹คํ–‰๋˜๋Š” OS๊ฐ€ Program์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ตฌ์กฐ์ด๋‹ค. ํ•˜์ง€๋งŒ, Java Program์˜ ์‹คํ–‰ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

JVM์€ OS ์œ„์—์„œ ์‹คํ–‰๋˜๊ณ , Java Program(์ •ํ™•ํžˆ๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ / *.class)์€ JVM(์ •ํ™•ํžˆ๋Š” JRE. ํ•ต์‹ฌ ์š”์†Œ๊ฐ€ JVM.) ์ƒ์—์„œ ์‹คํ–‰๋œ๋‹ค. ์™œ Java Program์€ OS ์œ„์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ JVM ์ƒ์—์„œ ์‹คํ–‰ํ•˜๋„๋ก ์„ค๊ณ„ํ•œ ๊ฒƒ์ผ๊นŒ? ์ด๋Š” Java Program์„ OS์— ์ƒ๊ด€์—†์ด ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•จ์ด๋‹ค. ์ผ๋ฐ˜ Program์˜ ๊ฒฝ์šฐ, ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” Program์ด๋ผ๋„ OS์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. But, Java Program์˜ ๊ฒฝ์šฐ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ๋‹ค์–‘ํ•œ OS ์ƒ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค.

์—ฌ๊ธฐ์„œ ์ฃผ๋ชฉํ•  ์ ์€ Windows ์œ„์—์„œ ์‹คํ–‰๋˜๋Š” JVM๊ณผ Linux ์œ„์—์„œ ์‹คํ–‰๋˜๋Š” JVM์ด ๋‹ค๋ฅด๋‹ค๋Š” ์ ์ด๋‹ค. ๋”ฐ๋ผ์„œ, ๊ฐ OS์— ๋งž๋Š” JVM์„ ์„ค์น˜ํ•ด์•ผ OS์— ์ƒ๊ด€์—†์ด Java Program์„ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿผ Java๋Š” cross-platform์ธ๊ฐ€? ์•ž์„œ ๋‚ด์šฉ์„ ์‚ดํŽด๋ดค๋‹ค๋ฉด ์‰ฝ๊ฒŒ ๋‹ต์„ ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ํ‘œํ˜„์— ๋”ฐ๋ผ ๋‹ต์ด ๊ต‰์žฅํžˆ ์• ๋งคํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, Yes or No๋กœ ๋‹ตํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ์ด์— ๋Œ€ํ•œ ํŒฉํŠธ๋ฅผ ์ •ํ™•ํžˆ ์•Œ๊ณ  ์žˆ๋Š๋ƒ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

Java๋Š” ์ •๋ง cross-platform?

ํŒฉํŠธ๋งŒ ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ๋‹ค.

  1. JVM์€ Java Bytecode๋ฅผ ์‹คํ–‰ํ•จ. ์ฆ‰, Java Bytecode๋Š” ํ”Œ๋žซํผ ์˜์กด์ ์ธ ์ฝ”๋“œ๊ฐ€ ์—†์Œ.
  2. ๋”ฐ๋ผ์„œ, Java Program์˜ ์‹คํ–‰์€ OS๋‚˜ Device์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Œ.
  3. ํ—ˆ๋‚˜, OS๋‚˜ Device์— ๋งž๋Š” JVM์ด ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด Java Program ์‹คํ–‰ ๋ถˆ๊ฐ€๋Šฅ.

Java Program์˜ ์‹คํ–‰ ๊ณผ์ •

Java 11 JVM ์ŠคํŽ™์„ ๊ธฐ์ค€์œผ๋กœ Java Source Code๊ฐ€ ์–ด๋–ค ๊ณผ์ •์„ ๊ฑฐ์ณ ์‹คํ–‰๋˜๋Š”์ง€ ์•Œ์•„๋ณด์ž. ์‚ฌ์‹ค ๊นŠ๊ฒŒ ํŒ”๋ ค๋ฉด ๋” ๊นŠ๊ฒŒ ํŒ” ์ˆ˜๋„ ์žˆ๊ณ , ์•ˆ๊ทธ๋ž˜๋„ ๋‚ด์šฉ์ด ์›Œ๋‚™ ๋งŽ์•„์„œ ์–ด๋””๊นŒ์ง€ ํฌํ•จํ•˜์—ฌ ์ •๋ฆฌํ•  ์ง€ ๋งŽ์ด ๊ณ ๋ฏผํ–ˆ๋‹ค. ํ•ต์‹ฌ ํ๋ฆ„์„ ์ค‘์‹ฌ์œผ๋กœ ์ •๋ฆฌํ–ˆ๊ณ , ๋„ˆ๋ฌด ์ง€์—ฝ์ ์ธ ๋‚ด์šฉ์€ ์ œ์™ธํ–ˆ๋‹ค. ๋”ฑ ํ๋ฆ„์„ ์ •ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ˆ˜์ค€์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค.

์ด๋ฒˆ์—๋„ ๊ฐœ๋žต์ ์ธ ๋ชจ๋ธ์„ ๋จผ์ € ์‚ดํŽด๋ณด์ž. ์ด๋Š” ๋‹ค์Œ์™€ ๊ฐ™๋‹ค.

์œ„์˜ ๊ทธ๋ฆผ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด Java Source Code๊ฐ€ ์‹คํ–‰๋˜๊ธฐ๊นŒ์ง€์˜ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. Java Complier(javac.exe)๋ฅผ ์‚ฌ์šฉํ•ด Java Source Code(*.java)๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Java Bytecode(*.class)์„ ๋งŒ๋“ ๋‹ค(Compile!).
  2. JRE์˜ java.exe๋ฅผ ์‚ฌ์šฉํ•ด Java Bytecode๋ฅผ ์‹คํ–‰ํ•œ๋‹ค(Run!).
  3. JVM์ด ๋™์ž‘ํ•˜๋ฉฐ Java Bytecode๋ฅผ ์‹ค์งˆ์ ์œผ๋กœ ์‹คํ–‰(๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น, ์‹œ์Šคํ…œ ๋ช…๋ น ํ˜ธ์ถœ ๋“ฑ)ํ•œ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด, ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. Compile!
  2. Run!

๋งค์šฐ ๊ฐ„๋‹จํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Œ€๋กœ ๋๋‚ด๊ธฐ ์•„์‰ฌ์šฐ๋‹ˆ, ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ์กฐ๊ธˆ๋งŒ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

Compile!

Java์—์„œ์˜ Compile์€ ์ „ํ†ต์ ์ธ Compile๊ณผ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค. ๋จผ์ €, ์ „ํ†ต์ ์ธ Compile์€ ์ธ๊ฐ„์ด ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๊ณ ์ˆ˜์ค€ ์–ธ์–ด(C, C++, C# ๋“ฑ)๋กœ ์ž‘์„ฑ๋œ Source Code๋ฅผ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๊ณ„์–ด, ์ฆ‰ Native Code๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ํ”ํžˆ Java์—์„œ์˜ Compile์ด๋ผ๊ณ  ํ•˜๋ฉด Java๋กœ ์ž‘์„ฑ๋œ Source Code๋ฅผ JVM์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” Bytecode๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

  • C Compile(์ „ํ†ต์ ์ธ Compile) : C Source Code(.c, .h) -> Machine Code(.exe, .out) ์‹คํ–‰ํŒŒ์ผ
  • Java Compile : Java Source Code(.java) -> Bytecode(.class)

์ฆ‰, C์˜ ๊ฒฝ์šฐ(์ „ํ†ต์ ์ธ Compile) Complie ์ดํ›„, ์‹คํ–‰ํŒŒ์ผ(.exe, .out)์„ ์–ป๋Š”๋‹ค(์ •ํ™•ํžˆ๋Š” ์ „์ฒ˜๋ฆฌ/์ปดํŒŒ์ผ/์–ด์…ˆ๋ธ”๋ฆฌ/๋งํฌ์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ ์ตœ์ข… ์‹คํ–‰ํŒŒ์ผ์ด ์ƒ์„ฑ๋จ. ํ”ํžˆ ์ปดํŒŒ์ผ์ด๋ผ ํ•˜๋ฉด ์ปดํŒŒ์ผ+์–ด์…ˆ๋ธ”๋ฆฌ์˜ ๊ณผ์ •์„ ์˜๋ฏธํ•จ. ์ฐธ๊ณ ). ์ด๋•Œ ์‹คํ–‰ํŒŒ์ผ์€ ๊ธฐ๊ณ„์–ด์ด๋ฉฐ, OS๊ฐ€ ๋ฐ”๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ์ด๋‹ค. ํ•˜์ง€๋งŒ, Java์˜ ๊ฒฝ์šฐ Compile ์ดํ›„, ์‹คํ–‰ ํŒŒ์ผ์ด ์•„๋‹Œ Bytecode(.class)๋ฅผ ์–ป๋Š”๋‹ค. Bytecode๋Š” ํŠน์ • OS/Device๊ฐ€ ์ดํ•ดํ•˜๋Š” ๊ธฐ๊ณ„์–ด๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ์‹คํ–‰ ๊ณผ์ •์—์„œ JVM์ด ์ ์ ˆํ•œ Native Code๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‹คํ–‰ํ•œ๋‹ค. ๋‹น์—ฐํžˆ OS๊ฐ€ ์ตœ์ข… ์‹คํ–‰ํŒŒ์ผ์„ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด JVM์ด Bytecode๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฅด๋‹ค. ์ด๋Š” ์‹คํ–‰ ๋ถ€๋ถ„์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃฐ ๊ฒƒ์ด๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด, Java์˜ Compile์€ Java Source Code๋ฅผ Java ์–ธ์–ด ์ŠคํŽ™์— ๋”ฐ๋ผ ๋ถ„์„ & ๊ฒ€์ฆํ•˜๊ณ , JVM ์ŠคํŽ™์— ๋งž๋Š” Bytecode๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๊ณผ์ •์ด๋‹ค.

์ฐธ๊ณ ๋กœ ์ด๋Š” JVM ์ŠคํŽ™์— ๋งž๋Š” Bytecode๋ฅผ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด, Java๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์–ธ์–ด(์˜ˆ๋ฅผ๋“ค์–ด Kotlin)๋„ JVM ์œ„์—์„œ ์‹คํ–‰๊ฐ€๋Šฅํ•จ์„ ์˜๋ฏธํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

Run!

์•ž์„œ ์–ธ๊ธ‰ํ•˜์˜€๋“ฏ์ด java.exe(java command)๋ฅผ ์‚ฌ์šฉํ•ด Java application์„ ์‹คํ–‰ํ•œ๋‹ค. Java application ์‹คํ–‰ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค(์•ž์„œ ์ œ์‹œํ•œ ์‹คํ–‰ ๊ณผ์ •์˜ ๊ฐœ๋žต์ ์ธ ๋ชจ๋ธ ์ฐธ๊ณ ).

  1. java command์— ์˜ํ•ด JVM์ด ์‹คํ–‰๋œ๋‹ค.
  2. Class Loader๊ฐ€ Bytecode๋ฅผ Runtime Data Areas์— loadํ•œ๋‹ค. ์ด๋•Œ, load๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์ด๋‹ค.
  3. Execution Engine์ด Bytecode๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

Oracle Tools Reference์—์„œ๋Š” java command๋ฅผ ๋‹ค์Œ์™€ ๊ฐ™์ด ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค.

  1. java command๋Š” Java application์„ ์‹œ์ž‘ํ•œ๋‹ค.
  2. 1๋ฒˆ ์ž‘์—…์€ JRE๋ฅผ ์‹œ์ž‘ํ•˜๊ณ , java command์˜ ์ธ์ž๋กœ ์ง€์ •๋œ class(initial class)๋ฅผ ๋กœ๋”ฉํ•˜๊ณ , ๊ทธ class์˜ main() method๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด๋•Œ, ์ด method์˜ ์„ ์–ธ์€ ๋‹ค์Œ์˜ ํ˜•์‹์„ ๋”ฐ๋ฅธ๋‹ค : public static void main(String[] args)

์œ„์˜ ๋‘ ๊ฐ€์ง€ ์„ค๋ช…์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ •๋ฆฌํ•ด๋ณด์ž. java command๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด Java application์„ ์‹œ์ž‘ํ•œ๋‹ค.

  1. JVM์„ ์‹คํ–‰ํ•œ๋‹ค.
  2. Class Loader๋ฅผ ์‚ฌ์šฉํ•ด initial class๋ฅผ loadํ•œ๋‹ค.
  3. main() method๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์œ„์˜ ๊ณผ์ •์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž. ํ๋ฆ„์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์•Œ์•„์•ผํ•  ํ•„์ˆ˜ ๊ฐœ๋…๋“ค์€ ํ๋ฆ„์„ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ๋‹ค๋ฃจ๊ฒ ๋‹ค.

ํ•ด๋‹น ๊ธ€์—์„œ ์“ฐ์ธ ๊ฐ ์šฉ์–ด์— ๋Œ€ํ•œ ์˜๋ฏธ๋Š” JVM Specification์˜ Chapter 5๋ฅผ ์ฐธ๊ณ .

์˜ˆ์ œ ์†Œ์Šค ์ฝ”๋“œ

์„ค๋ช…์ด ๊ตณ์ด ํ•„์š”์—†๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋‹ค. Aloha ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ธ์Šคํ„ด์Šค method๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ "Aloooha!"๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ฝ”๋“œ๋‹ค.

package staycozyboy.java.jvm;

public class Aloha {
    public static void main(String[] args) {
        final Aloha aloha = new Aloha();
        System.out.println(aloha.aloooha());
    }

    private String aloooha() {
        return "Aloooha!";
    }
}

์˜ˆ์ œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ

์•„๋ž˜์˜ Code๋Š” Source Code๋ฅผ Compileํ•˜์—ฌ ์–ป์€ Bytecode๋‹ค. ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์งš์–ด์„œ ๋‹ค๋ฃฐ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ๋ƒฅ ๋Œ€์ถฉ ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ๊ตฌ๋‚˜ ์ •๋„ ํ™•์ธํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋ฉด ๋œ๋‹ค. ์ฐธ๊ณ ๋กœ javap command๋กœ Bytecode๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” Binary ํŒŒ์ผ์ธ Class ํŒŒ์ผ์„ ํ…์ŠคํŠธ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ์—ญ์–ด์…ˆ๋ธ”๋Ÿฌ(disassembler)๋‹ค. ์ด๋ฅผ ์ด์šฉํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ํ”ํžˆ ์ž๋ฐ” ์–ด์…ˆ๋ธ”๋ฆฌ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ Orcale Tools Reference ์ฐธ๊ณ .

javap -v -l -p class\staycozyboy\java\jvm\Aloha.class

Classfile /C:/Users/PC/java_test/Hello/class/staycozyboy/java/jvm/Aloha.class
  Last modified 2020. 12. 24.; size 536 bytes
  SHA-256 checksum da4341273ecc0e3698bf715fe440ae48c45f57d8c0c4691b9b51dd8a7e5ce236
  Compiled from "Aloha.java"
public class staycozyboy.java.jvm.Aloha
  minor version: 0
  major version: 59
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #7                          // staycozyboy/java/jvm/Aloha
  super_class: #2                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 3, attributes: 1
Constant pool:
   #1 = Methodref          #2.#3          // java/lang/Object."<init>":()V
   #2 = Class              #4             // java/lang/Object
   #3 = NameAndType        #5:#6          // "<init>":()V
   #4 = Utf8               java/lang/Object
   #5 = Utf8               <init>
   #6 = Utf8               ()V
   #7 = Class              #8             // staycozyboy/java/jvm/Aloha
   #8 = Utf8               staycozyboy/java/jvm/Aloha
   #9 = Methodref          #7.#3          // staycozyboy/java/jvm/Aloha."<init>":()V
  #10 = Fieldref           #11.#12        // java/lang/System.out:Ljava/io/PrintStream;
  #11 = Class              #13            // java/lang/System
  #12 = NameAndType        #14:#15        // out:Ljava/io/PrintStream;
  #13 = Utf8               java/lang/System
  #14 = Utf8               out
  #15 = Utf8               Ljava/io/PrintStream;
  #16 = Methodref          #7.#17         // staycozyboy/java/jvm/Aloha.aloooha:()Ljava/lang/String;
  #17 = NameAndType        #18:#19        // aloooha:()Ljava/lang/String;
  #18 = Utf8               aloooha
  #19 = Utf8               ()Ljava/lang/String;
  #20 = Methodref          #21.#22        // java/io/PrintStream.println:(Ljava/lang/String;)V
  #21 = Class              #23            // java/io/PrintStream
  #22 = NameAndType        #24:#25        // println:(Ljava/lang/String;)V
  #23 = Utf8               java/io/PrintStream
  #24 = Utf8               println
  #25 = Utf8               (Ljava/lang/String;)V
  #26 = String             #27            // Aloooha!
  #27 = Utf8               Aloooha!
  #28 = Utf8               Code
  #29 = Utf8               LineNumberTable
  #30 = Utf8               main
  #31 = Utf8               ([Ljava/lang/String;)V
  #32 = Utf8               SourceFile
  #33 = Utf8               Aloha.java
{
  public staycozyboy.java.jvm.Aloha();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=1
         0: new           #7                  // class staycozyboy/java/jvm/Aloha
         3: dup
         4: invokespecial #9                  // Method "<init>":()V
         7: astore_1
         8: getstatic     #10                 // Field java/lang/System.out:Ljava/io/PrintStream;
        11: aload_1
        12: invokevirtual #16                 // Method aloooha:()Ljava/lang/String;
        15: invokevirtual #20                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        18: return
      LineNumberTable:
        line 5: 0
        line 6: 8
        line 7: 18

  private java.lang.String aloooha();
    descriptor: ()Ljava/lang/String;
    flags: (0x0002) ACC_PRIVATE
    Code:
      stack=1, locals=1, args_size=1
         0: ldc           #26                 // String Aloooha!
         2: areturn
      LineNumberTable:
        line 10: 0
}
SourceFile: "Aloha.java"

๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ(Runtime Data Areas)

๋จผ์ €, ํ๋ฆ„์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ๋Œ€ํ•ด ๊ฐ„๋žตํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž. (์ด๊ฑธ ์•Œ์•„์•ผ ์‹œ์ž‘์ด ๋œ๋‹ค...) ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์€ JVM์ด OS์—๊ฒŒ ํ• ๋‹น๋ฐ›๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‹ค. (Main Memory์˜ ํšจ์œจ์ ์ธ ์‚ฌ์šฉ์„ ์œ„ํ•ด์„œ OS๊ฐ€ Memory๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ, ์ด๋Š” OS๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ Memory๋ฅผ ํ• ๋‹นํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ์•ž์„œ ์ œ์‹œํ•œ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด OS ์ž…์žฅ์—์„œ๋Š” JVM์€ OS ์ƒ์—์„œ ์‹คํ–‰๋˜๋Š” ์ˆ˜๋งŽ์€ ํ”„๋กœ๊ทธ๋žจ ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ด๋‹ค.)

๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์€ 6๊ฐœ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ์ด๋‹ค.

  1. PC Register
  2. JVM Stack
  3. Native Method Stack
  4. Heap
  5. Method Area
  6. Runtime Constant Pool

์—ฌ๊ธฐ์„œ per-Class, per-Thread๋“ฑ์˜ ๋‹จ์œ„๋Š” ์ƒ๋ช… ์ฃผ๊ธฐ์™€ ์ƒ์„ฑ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, per-x์— ์†ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์˜์—ญ์˜ ๊ฒฝ์šฐ, x๊ฐ€ ์ƒ์„ฑ & ์†Œ๋ฉธ๋  ๋•Œ ํ•จ๊ป˜ ์ƒ์„ฑ & ์†Œ๋ฉธ๋˜๋ฉฐ, ๋‹น์—ฐํžˆ x์™€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ ์˜์—ญ์€ 1๋Œ€1 ๋Œ€์‘๋œ๋‹ค. ์ด ์ •๋„๋งŒ ์•Œ์•„๋‘๊ณ  ์ด์ œ 1๋ฒˆ ๊ณผ์ •๋ถ€ํ„ฐ ์„ค๋ช…์„ ์‹œ์ž‘ํ•ด๋ณด์ž. ๊ฐ ์˜์—ญ์— ๋Œ€ํ•œ ๋””ํ…Œ์ผํ•œ ์„ค๋ช…์€ ์ž์—ฐ์Šค๋Ÿฌ์šด ํ๋ฆ„์— ๋”ฐ๋ผ ๋‹ค๋ฃฐ ๊ฒƒ์ด๋‹ค.

JVM ์‹คํ–‰


1. JVM์„ ์‹คํ–‰ํ•œ๋‹ค. ์˜ ๊ณผ์ •์ด๋‹ค. JVM์ด ์‹คํ–‰๋˜๋ฉด per-JVM ๋‹จ์œ„์— ์†ํ•˜๋Š” Heap๊ณผ Method Area๊ฐ€ ํ•จ๊ป˜ ์ƒ์„ฑ๋œ๋‹ค.

ํž™ ์˜์—ญ(Heap)

์ธ์Šคํ„ด์Šค ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ์˜์—ญ์œผ๋กœ GC ๋Œ€์ƒ์ด๋‹ค. Heap์— ์ €์žฅ๋œ ๊ฐ์ฒด์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋ช…์‹œ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ ˆ๋Œ€ ํšŒ์ˆ˜ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ(๊ถŒ์žฅ๋˜์ง„ ์•Š์ง€๋งŒ, System์˜ gc() method๋ฅผ ํ†ตํ•ด GC ์ˆ˜ํ–‰์„ ์š”์ฒญํ•  ์ˆ˜๋Š” ์žˆ๋‹ค.), ์˜ค์ง GC์— ์˜ํ•ด์„œ๋งŒ ํšŒ์ˆ˜๋  ์ˆ˜ ์žˆ๋‹ค. JVM ์„ฑ๋Šฅ ๋“ฑ์˜ ์ด์Šˆ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์–ธ๊ธ‰๋˜๋ฉฐ, ๋ชจ๋“  JVM ์Šค๋ ˆ๋“œ์— ๊ณต์œ ๋œ๋‹ค.

JVM์ด ๋ง‰ ์‹คํ–‰๋œ ์ด ์‹œ์ ์—์„œ ๋‹น์—ฐํžˆ Heap์€ ๋นˆ ์ƒํƒœ์ด๋‹ค.

๋” ์ƒ์„ธํ•œ Heap ์˜์—ญ์˜ ๊ตฌ์กฐ์™€ GC ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด, https://d2.naver.com/helloworld/1329 ์ฐธ๊ณ .

๋ฉ”์†Œ๋“œ ์˜์—ญ(Method Area)

Method Area ์—ญ์‹œ ๋ชจ๋“  Thread๊ฐ€ ๊ณต์œ ํ•˜๋Š” ์˜์—ญ์œผ๋กœ, JVM์ด ์ฝ์–ด ๋“ค์ธ ๊ฐ๊ฐ์˜ Class์™€ Interface์— ๋Œ€ํ•œ Runtime Constant Pool, ํ•„๋“œ์™€ method ๋ฐ์ดํ„ฐ, static ๋ณ€์ˆ˜, method์˜ Bytecode๋ฅผ ์ €์žฅํ•œ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด, ๊ฑฐ์˜ ๋ชจ๋“  Bytecode๊ฐ€ Method Area์— ์ €์žฅ๋œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค(๊ฑฐ์˜๋ผ๊ณ  ์–ธ๊ธ‰ํ•œ ์ด์œ ๋Š” Bytecode์—๋Š” Constant Pool์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ, Method Area์—๋Š” ๊ทธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Runtime Constant Pool์„ ๋งŒ๋“ค์–ด ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.).

JVM์ด ๋ง‰ ์‹คํ–‰๋œ ์ด ์‹œ์ ์—์„œ ๋‹น์—ฐํžˆ Method Area ๋˜ํ•œ ๋นˆ ์ƒํƒœ์ด๋‹ค.

Initial Class load (1)

์˜ˆ์ œ์—์„œ initial class๋Š” Aloah ์ด๋ฏ€๋กœ, ์ด ์‹œ์ ์—์„œ Class Loader๋Š” Aloah๋ฅผ load ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ class loadํ•œ๋‹ค๋Š” ๊ฒƒ์˜ ์˜๋ฏธ์™€ Runtime Constant Pool์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ์•Œ์•„๋ณธ ๋’ค, ๋‹ค์‹œ ํ๋ฆ„์„ ์ง„ํ–‰ํ•˜๋„๋ก ํ•˜์ž.

Class load

Java๋Š” ๋™์  load, ์ฆ‰ Runtime์— Class๋ฅผ ์ฒ˜์Œ์œผ๋กœ ์ฐธ์กฐํ•  ๋•Œ ์ด๋ฅผ ๋กœ๋“œํ•˜๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ถ€๋ถ„์ด JVM์˜ Class Loader์ด๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Java ํด๋ž˜์Šค๋กœ๋” ํ›‘์–ด๋ณด๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•˜์ž. ์ด ๊ธ€์—์„œ๋Š” Class Loader์— ์˜ํ•ด ์ˆ˜ํ–‰๋˜๋Š” Class load์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ๋งŒ ๋‹ค๋ฃจ๊ฒ ๋‹ค. Class Loader๊ฐ€ ์•„์ง load๋˜์ง€ ์•Š์€ Class๋ฅผ ์ฐพ์œผ๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์ณ loadํ•œ๋‹ค. ์ˆœ์„œ๋Œ€๋กœ ์‚ดํŽด๋ณด์ž.

  1. Loading : class(or interface)์˜ binary ํ‘œํ˜„์„ ์ฐพ์•„ ์ด๋ฅผ ํ† ๋Œ€๋กœ class๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ. ์ด๋•Œ, ์ƒ์„ฑ์€ class์˜ Bytecode๋ฅผ ๋กœ๋”ฉํ•˜์—ฌ Method Area์— constructionํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค(๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น).
  • Linking : class์˜ ์ƒ์œ„ superclass, ๋˜๋Š” ๋ฐฐ์—ด์ผ ๊ฒฝ์šฐ ๋ฐฐ์—ด์˜ ์›์†Œ์ธ class๋ฅผ verifying / preparing / resolving ํ•˜๋Š” ๊ณผ์ •. ์ด๋•Œ class๋Š” ์™„์ „ํžˆ Loading๋œ ํ›„์— verifying & preparing์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, verifying & preparing์„ ์™„์ „ํžˆ ์ˆ˜ํ–‰ํ•œ ์ดํ›„ initializing์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. Resolving์€ JVM์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋™์ ์œผ๋กœ ์‹คํ–‰๋˜๊ธฐ์— initializing ์ดํ›„์— ์ˆ˜ํ–‰๋  ์ˆ˜๋„ ์žˆ๋‹ค.
  1. Verifying : ์ฝ์–ด ๋“ค์ธ class๊ฐ€ Java Language & JVM Specification์— ๋”ฐ๋ผ ๊ตฌ์กฐ์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ.
  2. Preparing : class์˜ static ํ•„๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋•Œ ๊ธฐ๋ณธ๊ฐ’์€ ์ž๋ฃŒํ˜•์— ๋”ฐ๋ผ JVM Specification์— ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹Œ ํŠน์ •๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ณผ์ •์€ Initializing ๋‹จ๊ณ„์—์„œ ์ˆ˜ํ–‰๋œ๋‹ค.
  3. Resolving : Runtime Constant Pool์˜ Symbolic Reference๋ฅผ ๋™์ ์œผ๋กœ Direct Reference๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  4. Initializing : Bytecode์—์„œ <clinit>์œผ๋กœ ํ‘œ๊ธฐ๋œ class(or interface) initialization method(JVM Specification ์ฐธ๊ณ )๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ. ์ฆ‰, static initializer block๋“ค์„ ์‹คํ–‰ํ•˜์—ฌ, static ํ•„๋“œ๋ฅผ ์ ์ ˆํ•œ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ.

๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€(Runtime Constant Pool)

์ด๋Š” per-class ๋‹จ์œ„์— ์†ํ•˜๋ฏ€๋กœ class ์ƒ์„ฑ์‹œ ์ƒ์„ฑ๋˜๋ฉฐ, Bytecode์—์„œ constant_pool ํ…Œ์ด๋ธ”์— ํ•ด๋‹นํ•˜๋Š” ์˜์—ญ์ด๋‹ค. ์ด๋Š” ์ปดํŒŒ์ผํƒ€์ž„์— ์ด๋ฏธ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฆฌํ„ฐ๋Ÿด ๊ฐ’๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋Ÿฐํƒ€์ž„์— resolving๋˜๋Š” method์™€ ํ•„๋“œ์— ๋Œ€ํ•œ ๋ชจ๋“  reference๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ํ…Œ์ด๋ธ”์ด๋‹ค. ์ฆ‰, ํŠน์ • method ํ˜น์€ ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ•  ๋•Œ JVM์€ Runtime Constant Pool์„ ํ†ตํ•ด ์‹ค์ œ Memory์ƒ ์ฃผ์†Œ๋ฅผ ์ฐพ์•„ ์ฐธ์กฐํ•œ๋‹ค.

Initial Class load (2)

๋‹ค์‹œ Class Loader๊ฐ€ initial class์ธ Aloah๋ฅผ loadํ•˜๋Š” ์‹œ์ ์œผ๋กœ ๋Œ์•„์™€, ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž.

  1. Loading ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•˜์—ฌ Aloah์˜ Bytecode๊ฐ€ Method Area์— ์ €์žฅ๋˜๊ณ , ์ด์— ๋”ฐ๋ผ Runtime Constant Pool๋„ ํ•จ๊ป˜ ์ƒ์„ฑ๋œ๋‹ค.
  2. Linking ๊ณผ์ • ์ค‘ Verifying์ด ์ˆ˜ํ–‰๋˜๋ฉฐ, Aloah.class๋Š” Java Compiler์— ์˜ํ•ด ์ •์ƒ์ ์œผ๋กœ Compile๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, Aloah์˜ superclass์ธ Object๊ฐ€ ๋กœ๋”ฉ๋œ๋‹ค.
  3. Linking ๊ณผ์ • ์ค‘ Preparing์ด ์ˆ˜ํ–‰๋˜๋ฉฐ, ์›๋ž˜๋Š” static ํ•„๋“œ์˜ ์ƒ์„ฑ์ด ์ด๋ฃจ์–ด์ง€์ง€๋งŒ, ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ static ํ•„๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
  4. Linking ๊ณผ์ • ์ค‘ Resolving์˜ ๊ฒฝ์šฐ, ์›๋ž˜๋Š” ๋™์ ์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ์„ค๋ช…์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด class์— ๋Œ€ํ•œ Verifying ์ˆ˜ํ–‰๋˜๊ณ  ๋‚œ ๋’ค, ์ฆ‰์‹œ ๊ทธ์˜ ๋ชจ๋“  Symbolic Reference์— ๋Œ€ํ•ด Resolving์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ด ๊ฐ€์ •ํ•˜์— Bytecode์˜ ์ผ๋ถ€๋ฅผ ์‚ดํŽด๋ด„์œผ๋กœ์จ Symbolic Reference๊ฐ€ Direct Reference๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๊ณผ์ •์„ ์‚ดํŽด๋ณด์ž.
    • #7 = Class #8 // staycozyboy/java/jvm/Aloha
      Aloah ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ํ•„์š”ํ•œ Aloah Class ์ •๋ณด๋Š” Method Area์— Loading๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, Method Area ๋‚ด์—์„œ Aloah Class์˜ ์œ„์น˜๋ฅผ Class staycozyboy/java/jvm/Aloha์˜ ๊ฐ’์œผ๋กœ Resolveํ•  ์ˆ˜ ์žˆ๋‹ค.
    • #10 = Fieldref #11.#12 // java/lang/System.out:Ljava/io/PrintStream;
      System class๋Š” ๋กœ๋”ฉ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋กœ๋”ฉํ•œ๋‹ค. ์ดํ›„ Verifying & Preparing ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, System์˜ static ํ•„๋“œ์ธ out์€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค. ๋˜, out์€ PrintStream class์˜ ์ธ์Šคํ„ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์—, PrintStream ํด๋ž˜์Šค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋กœ๋”ฉํ•œ๋‹ค. ์ด๋Ÿฐ Loading&Linking์„ ์—ฐ์‡„์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, Runtime Constant Pool ๋‚ด์˜ Symbolic Reference๋ฅผ Direct Reference๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
  5. Initializing์ด ์ˆ˜ํ–‰๋œ๋‹ค. ์›๋ž˜๋Š” static initialization์ด ์‹คํ–‰๋˜์ง€๋งŒ, ์˜ˆ์ œ ์ฝ”๋“œ์—์„  static ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค.

์ด๋ ‡๊ฒŒ class load์„ ๋งˆ์ณค๋‹ค. ๋‹ค์Œ์€ main()์„ ํ˜ธ์ถœํ•  ๋‹จ๊ณ„๋‹ค.

main() Method ํ˜ธ์ถœ (1)

์ด์ œ main() method๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ, ์‹ค์งˆ์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰(excute)ํ•œ๋‹ค. ์ด๋Š” Excution Engine์— ์˜ํ•ด ์ˆ˜ํ–‰๋œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋ ค๋ฉด ํ”„๋กœ๊ทธ๋žจ ํ๋ฆ„์˜ ์ตœ์†Œ ๋‹จ์œ„์ธ thread๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, JVM์€ main() method ํ˜ธ์ถœ์„ ์œ„ํ•œ main thread๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ Excution Engine๊ณผ per-Thread ๋‹จ์œ„์— ์†ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์˜์—ญ๋“ค์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ์•Œ์•„๋ณธ ๋’ค, ๋‹ค์‹œ ํ๋ฆ„์„ ์ง„ํ–‰ํ•˜๋„๋ก ํ•˜์ž.

์‹คํ–‰ ์—”์ง„(Execution Engine)

์šฉ์–ด์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์‹ค์งˆ์ ์œผ๋กœ Bytecode๋ฅผ ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ์ฝ์–ด ์‹คํ–‰ํ•œ๋‹ค. Bytecode์˜ ๋ช…๋ น์–ด๋Š” 1byte์˜ OpCode์™€ ์ถ”๊ฐ€ Operand๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์•ž์„œ ์–ธ๊ธ‰ํ•˜์˜€๋“ฏ์ด Bytecode๋Š” Native Code๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— Excution Engine์€ Bytecode๋ฅผ ๊ธฐ๊ณ„๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉฐ, ๊ทธ ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•˜๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ ์‹คํ–‰ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์ธํ„ฐํ”„๋ฆฌํ„ฐ(Interpreter) : Bytecode ๋ช…๋ น์–ด๋ฅผ ํ•œ ์ค„์”ฉ ์ฝ์–ด์„œ ํ•ด์„(Interpret)ํ•˜๊ณ  ๋ฐ”๋กœ ์‹คํ–‰ํ•œ๋‹ค. ํ•œ ์ค„์”ฉ ํ•ด์„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ์ค„์— ๋Œ€ํ•œ ํ•ด์„์€ ๋น ๋ฅธ ๋Œ€์‹  ์ „์ฒด ๊ฒฐ๊ณผ์˜ ์‹คํ–‰์€ ๋Š๋ฆฌ๋‹ค. Execution Engine์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Interpreter ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ดˆ๊ธฐ JVM ์—ญ์‹œ Interpreter ๋ฐฉ์‹์œผ๋กœ๋งŒ ๊ตฌํ˜„๋˜์—ˆ์œผ๋‚˜, ์‹คํ–‰ ํšจ์œจ์„ ๊ณ ๋ คํ•˜์—ฌ JIT Compiler ๋ฐฉ์‹์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
  • JIT(Just-In-Time) Compiler : Interpreter ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•˜๋‹ค๊ฐ€ ๋ณ„๋„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜(JIT/HotSpot VM ์ฐธ๊ณ )์— ๋”ฐ๋ผ Bytecode๋ฅผ Compileํ•˜์—ฌ Native Code๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , Native Code๋กœ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. Native Code๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด Interpreter ๋ฐฉ์‹๋ณด๋‹ค ๋น ๋ฅด๊ณ , ์ด๋Š” ์บ์‹œ์— ๋ณด๊ด€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ Compile๋œ Code๋Š” ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋œ๋‹ค. JIT Compiler๋ฅผ ์ ์ ˆํžˆ ์ถ”๊ฐ€ํ•˜์—ฌ Interpreter ๋ฐฉ์‹์˜ ๋น„ํšจ์œจ์„ฑ์„ ์ค„์˜€๋‹ค.

JVM Stack

JVM Stack์€ Frame์ด๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” Stack์ด๋‹ค. JVM์€ JVM Stack์— ๋Œ€ํ•ด push ํ˜น์€ pop ๋™์ž‘๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Frame์€ JVM Stack์— ์Œ“์ด๋Š” ์ •๋ณด์˜ ๋‹จ์œ„์ด๋ฉฐ, ์ด๋Š” ๋ฐ์ดํ„ฐ๋‚˜ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ์˜ ์ €์žฅ, ๊ฐ’ ๋ฐ˜ํ™˜, ๋™์  Link๋“ฑ์— ์‚ฌ์šฉ๋œ๋‹ค. Method๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ํ•˜๋‚˜์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์ด ์ƒ์„ฑ๋˜๊ณ  push๋˜๊ณ , method ์ข…๋ฃŒ ์‹œ pop ๋œ๋‹ค. ์ด๋Š” Local Variable Array, Operand Stack, ํ˜„์žฌ ์ˆ˜ํ–‰ ์ค‘์ธ method๊ฐ€ ์†ํ•œ class์˜ Runtime Constant Pool์— ๋Œ€ํ•œ Reference๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ๊ทธ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์ง€์—ญ ๋ณ€์ˆ˜ ๋ฐฐ์—ด(Local Variable Array)
    Method๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๊ทธ Method์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์€ Local Variable Array๋ฅผ ํ†ตํ•ด ๋„˜๊ฒจ์ง„๋‹ค(๋„˜๊ฒจ๋ฐ›๋Š”๋‹ค).
    • Instance Method์ผ ๊ฒฝ์šฐ, this reference๊ฐ€ 0๋ฒˆ index์— ์ €์žฅ๋˜๊ณ , 1๋ฒˆ index๋ถ€ํ„ฐ ํŒŒ๋ฆฌ๋ฏธํ„ฐ๋“ค์ด ์ฐจ๋ก€๋Œ€๋กœ ์ €์žฅ๋œ๋‹ค.
    • Class Method์ผ ๊ฒฝ์šฐ 0๋ฒˆ index๋ถ€ํ„ฐ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์ด ์ฐจ๋ก€๋Œ€๋กœ ์ €์žฅ๋œ๋‹ค.
      Parameter๊ฐ€ ์ฐจ๋ก€๋Œ€๋กœ ์ €์žฅ๋˜๊ณ  ๋‚œ ์ดํ›„์—๋Š”, method์˜ ์ง€์—ญ ๋ณ€์ˆ˜๋“ค์ด ์ €์žฅ๋œ๋‹ค.
  • Operand Stack
    ๊ฐ method๋Š” Operand Stack๊ณผ Local Variable Array ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•˜๊ณ , ๋‹ค๋ฅธ Method์˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ pushํ•˜๊ฑฐ๋‚˜ popํ•œ๋‹ค. ๋Œ€๋žต์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๋„˜๊ฒจ์ฃผ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ณผ์ •์ด Operand Stack์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.
  • Reference to Runtime Constant Pool
    ์ด๋Š” ์šฉ์–ด ๊ทธ๋Œ€๋กœ ์ž์‹ ์ด ์†ํ•œ Frame์— ๋Œ€์‘๋˜๋Š” Method๊ฐ€ ์†ํ•œ Class์˜ Runtime Constant Pool์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋œปํ•œ๋‹ค.

์ด๋•Œ, Local Variable Array์˜ Length์™€ Operand Stack์˜ ์ตœ๋Œ€ ๊นŠ์ด๋Š” Compile Time์— ๊ฒฐ์ •๋œ๋‹ค. ๋”ฐ๋ผ์„œ, ์ด๋Š” Byte Code์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜๋Š” ์˜ˆ์ œ ์ฝ”๋“œ์˜ main() method์˜ Byte Code ์ค‘ ์ผ๋ถ€์ด๋‹ค. stack์€ Operand Stack์˜ ์ตœ๋Œ€ ๊นŠ์ด, locals๋Š” Local Variable Array์˜ Length์ด๋‹ค.

 Code:
      stack=1, locals=1, args_size=1

PC Register

PC Register์—๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ Method๊ฐ€

  • Native Method๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ, ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ JVM command์˜ ์œ„์น˜๊ฐ€ ์ €์žฅ๋˜๊ณ ,
  • Native Method์ผ ๊ฒฝ์šฐ, PC Register์— ์ €์žฅ๋˜๋Š” ๊ฐ’์€ ์ •์˜๋˜์ง€ ์•Š๋Š”๋‹ค.

Native Method Stack

์ด๋Š” Java๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ Native Method๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์Šคํƒ์ด๋‹ค.

main() Method ํ˜ธ์ถœ (2)

๋‹ค์‹œ main() Method๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์‹œ์ ์œผ๋กœ ๋Œ์•„์™€, ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด์ž. ์‚ฌ์‹ค main() Method๋ฅผ ํ˜ธ์ถœํ•œ ์ดํ›„์—๋Š” Execution Engine์ด Byte Code๋ฅผ ํ•œ ์ค„์”ฉ ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •๋งŒ ๋‚จ์•˜๋‹ค. ๋ฌผ๋ก  ์ƒํ™ฉ์— ๋”ฐ๋ผ Class Loader, Runtime Data Areas์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉฐ ์‹คํ–‰๋œ๋‹ค. main() Method์˜ Bytecode๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

public static void main(java.lang.String[]);
  descriptor: ([Ljava/lang/String;)V
  flags: (0x0009) ACC_PUBLIC, ACC_STATIC
  Code:
    stack=2, locals=2, args_size=1
       0: new           #7                  // class staycozyboy/java/jvm/Aloha
       3: dup
       4: invokespecial #9                  // Method "<init>":()V
       7: astore_1
       8: getstatic     #10                 // Field java/lang/System.out:Ljava/io/PrintStream;
      11: aload_1
      12: invokevirtual #16                 // Method aloooha:()Ljava/lang/String;
      15: invokevirtual #20                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      18: return
    LineNumberTable:
      line 5: 0
      line 6: 8
      line 7: 18

์‚ฌ์‹ค Bytecode๋ฅผ ํ•œ ์ค„์”ฉ ์ฝ์–ด๊ฐ€๋ฉฐ ์„ธ๋ถ€์ ์ธ ์›๋ฆฌ๋ฅผ ์„ค๋ช…ํ•˜๋ ค ํ–ˆ์œผ๋‚˜, ์‹คํ–‰ ๊ณผ์ •์˜ ํ•ต์‹ฌ ํ๋ฆ„์€ ์ด์ „๊นŒ์ง€์˜ ๋‚ด์šฉ๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ์ž์„ธํžˆ ์ •๋ฆฌํ•œ ๊ฒƒ ๊ฐ™์•„ ๊ธ€์„ ๋งˆ๋ฌด๋ฆฌ ํ•˜๊ฒ ๋‹ค. (Opcode ์ฐธ๊ณ  + ์ดํ›„์˜ ๊ณผ์ •์„ Byte Code๋ฅผ ํ•œ ์ค„์”ฉ ์ฝ์–ด๊ฐ€๋ฉฐ ์„ธ๋ถ€์ ์ธ ์›๋ฆฌ๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ฐธ๊ณ )

๋งˆ๋ฌด๋ฆฌ

๋น„๋ก ํ•˜๋‚˜์˜ (๋ฐฉ๋Œ€ํ•œ) Topic์„ ๋‹ค๋ค˜๋‹ค์ง€๋งŒ, ํ”ผ์ƒ์ ์ด๊ณ  ํฐ ๋‚ด์šฉ๋ถ€ํ„ฐ, ๊นŠ๊ณ  ์„ธ๋ถ€์ ์ธ ๋‚ด์šฉ๊นŒ์ง€ ํ•œ๋ฒˆ์— ๋‹ค๋ฃจ๊ณ  ์‹ถ์€ ์š•์‹ฌ์— ์‘์ง‘์„ฑ์ด๋‚˜ ํ†ต์ผ์„ฑ์„ ๊ณ ๋ คํ•˜์ง€ ๋ชปํ•œ ๊ธ€์ด ๋˜์—ˆ๋‹ค. ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ๊ธ€์˜ ๋ชฉ์ ์— ๋”ฐ๋ผ ํ•ต์‹ฌ ๋‚ด์šฉ๋งŒ Scopingํ•ด์„œ ๊ธ€๋กœ ์ž‘์„ฑํ•˜๊ณ , ์ค‘์š”๋„๊ฐ€ ๋‚ฎ์€ ๋ถ€๋ถ„์€ ๋งํฌ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ๊ฒ ๋‹ค..

Reference

0๊ฐœ์˜ ๋Œ“๊ธ€