์์์ ์์, ์ด ๊ธ์ ์ฑ , ๊ฐ์, ๊ตฌ๊ธ๋ง๋ฑ์ ํตํด ๊ฐ์ธ์ ์ผ๋ก ํ์ต ๋ฐ ์ค์ตํ ๊ฐ๋ ์ ์ ๋ฆฌํ ๊ธ์ด๋ฉฐ, ์ ํํ์ง ์์ ๋ด์ฉ์ด ์์ ์ ์์ต๋๋ค. ๊พธ์คํ ๊ณต๋ถํด๊ฐ๋ฉฐ ์์ ํ๊ฒ ์ต๋๋ค. ๋ํ, ์ค๋ฅ ์ง์ ์ ์ธ์ ๋ ํ์์ ๋๋ค.
์ผ๋จ ์ธ๋ถ์ ์ธ ๊ตฌ๋์๋ฆฌ๋ ์ ์ณ๋๊ณ , ๊ฐ๋ต์ ์ผ๋ก ํ์์ ์ธ ์ฌํญ๋ง ์ดํด๋ด์ผ๋ก์จ Java ์คํ ๋ชจ๋ธ์ ๋ํ ๊ฐ์ ์ก์๋ณด์.
์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋จ์ ์ด์์ฒด์ ์์์ ์คํ๋๋ค. ๊ทธ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค.
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 11 JVM ์คํ์ ๊ธฐ์ค์ผ๋ก Java Source Code๊ฐ ์ด๋ค ๊ณผ์ ์ ๊ฑฐ์ณ ์คํ๋๋์ง ์์๋ณด์. ์ฌ์ค ๊น๊ฒ ํ๋ ค๋ฉด ๋ ๊น๊ฒ ํ ์๋ ์๊ณ , ์๊ทธ๋๋ ๋ด์ฉ์ด ์๋ ๋ง์์ ์ด๋๊น์ง ํฌํจํ์ฌ ์ ๋ฆฌํ ์ง ๋ง์ด ๊ณ ๋ฏผํ๋ค. ํต์ฌ ํ๋ฆ์ ์ค์ฌ์ผ๋ก ์ ๋ฆฌํ๊ณ , ๋๋ฌด ์ง์ฝ์ ์ธ ๋ด์ฉ์ ์ ์ธํ๋ค. ๋ฑ ํ๋ฆ์ ์ ํํ๊ฒ ์ดํดํ๊ธฐ ์ํด ํ์ํ ์์ค์ ๊ธฐ์ค์ผ๋ก ์ ๋ฆฌํ๋ค.
์ด๋ฒ์๋ ๊ฐ๋ต์ ์ธ ๋ชจ๋ธ์ ๋จผ์ ์ดํด๋ณด์. ์ด๋ ๋ค์์ ๊ฐ๋ค.
์์ ๊ทธ๋ฆผ์์ ์ ์ ์๋ฏ์ด Java Source Code๊ฐ ์คํ๋๊ธฐ๊น์ง์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌํ ์ ์๋ค.
์์ฝํ์๋ฉด, ์๋์ ๊ฐ๋ค.
๋งค์ฐ ๊ฐ๋จํ๋ค. ํ์ง๋ง ์ด๋๋ก ๋๋ด๊ธฐ ์์ฌ์ฐ๋, ์ด ๋ ๊ฐ์ง๋ฅผ ์กฐ๊ธ๋ง ๋ ์์ธํ ์์๋ณด์.
Java์์์ Compile์ ์ ํต์ ์ธ Compile๊ณผ๋ ์กฐ๊ธ ๋ค๋ฅด๋ค. ๋จผ์ , ์ ํต์ ์ธ Compile์ ์ธ๊ฐ์ด ์ดํดํ๊ธฐ ์ฌ์ด ๊ณ ์์ค ์ธ์ด(C, C++, C# ๋ฑ)๋ก ์์ฑ๋ Source Code๋ฅผ ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋ ๊ธฐ๊ณ์ด, ์ฆ Native Code๋ก ๋ณํํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ํ์ง๋ง, ํํ Java์์์ Compile์ด๋ผ๊ณ ํ๋ฉด Java๋ก ์์ฑ๋ Source Code๋ฅผ JVM์ด ์คํํ ์ ์๋ Bytecode๋ก ๋ณํํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ฆ, 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 ์์์ ์คํ๊ฐ๋ฅํจ์ ์๋ฏธํ๊ธฐ๋ ํ๋ค.
์์ ์ธ๊ธํ์๋ฏ์ด java.exe(java
command)๋ฅผ ์ฌ์ฉํด Java application์ ์คํํ๋ค. Java application ์คํ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค(์์ ์ ์ํ ์คํ ๊ณผ์ ์ ๊ฐ๋ต์ ์ธ ๋ชจ๋ธ ์ฐธ๊ณ ).
java
command์ ์ํด JVM์ด ์คํ๋๋ค.load
ํ๋ค. ์ด๋, load
๋ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ด๋ค.Oracle Tools Reference์์๋ java
command๋ฅผ ๋ค์์ ๊ฐ์ด ์ค๋ช
ํ๊ณ ์๋ค.
java
command๋ Java application์ ์์ํ๋ค.java
command์ ์ธ์๋ก ์ง์ ๋ class(initial class)๋ฅผ ๋ก๋ฉํ๊ณ , ๊ทธ class์ main()
method๋ฅผ ํธ์ถํจ์ผ๋ก์จ ์ํํ๋ค. ์ด๋, ์ด method์ ์ ์ธ์ ๋ค์์ ํ์์ ๋ฐ๋ฅธ๋ค : public static void main(String[] args)
์์ ๋ ๊ฐ์ง ์ค๋ช
์ ์ฐธ๊ณ ํ์ฌ ์ ๋ฆฌํด๋ณด์. java
command๋ ๋ค์๊ณผ ๊ฐ์ด Java application์ ์์ํ๋ค.
load
ํ๋ค.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"
๋จผ์ , ํ๋ฆ์ ์์ํ๊ธฐ ์ ์ ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ ๋ํด ๊ฐ๋ตํ๊ฒ ์์๋ณด์. (์ด๊ฑธ ์์์ผ ์์์ด ๋๋ค...) ๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ JVM์ด OS์๊ฒ ํ ๋น๋ฐ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๋ค. (Main Memory์ ํจ์จ์ ์ธ ์ฌ์ฉ์ ์ํด์ OS๊ฐ Memory๋ฅผ ๊ด๋ฆฌํ๋๋ฐ, ์ด๋ OS๊ฐ ํ๋ก๊ทธ๋จ์๊ฒ Memory๋ฅผ ํ ๋นํ๋ค๋ ์๋ฏธ์ด๋ค. ์์ ์ ์ํ ๊ทธ๋ฆผ์ ๋ณด๋ฉด OS ์
์ฅ์์๋ JVM์ OS ์์์ ์คํ๋๋ ์๋ง์ ํ๋ก๊ทธ๋จ ์ค ํ๋์ผ ๋ฟ์ด๋ค.)
๋ฐํ์ ๋ฐ์ดํฐ ์์ญ์ 6๊ฐ ์์ญ์ผ๋ก ๋๋ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ์ด๋ค.
์ฌ๊ธฐ์ per-Class
, per-Thread
๋ฑ์ ๋จ์๋ ์๋ช
์ฃผ๊ธฐ์ ์์ฑ ๋จ์๋ฅผ ์๋ฏธํ๋ค. ์ฆ, per-x
์ ์ํ๋ ๋ฐ์ดํฐ ์์ญ์ ๊ฒฝ์ฐ, x
๊ฐ ์์ฑ & ์๋ฉธ๋ ๋ ํจ๊ป ์์ฑ & ์๋ฉธ๋๋ฉฐ, ๋น์ฐํ x
์ ํด๋น ๋ฐ์ดํฐ ์์ญ์ 1๋1 ๋์๋๋ค. ์ด ์ ๋๋ง ์์๋๊ณ ์ด์ 1๋ฒ ๊ณผ์ ๋ถํฐ ์ค๋ช
์ ์์ํด๋ณด์. ๊ฐ ์์ญ์ ๋ํ ๋ํ
์ผํ ์ค๋ช
์ ์์ฐ์ค๋ฌ์ด ํ๋ฆ์ ๋ฐ๋ผ ๋ค๋ฃฐ ๊ฒ์ด๋ค.
1. JVM์ ์คํํ๋ค. ์ ๊ณผ์ ์ด๋ค. JVM์ด ์คํ๋๋ฉด per-JVM
๋จ์์ ์ํ๋ Heap๊ณผ Method Area๊ฐ ํจ๊ป ์์ฑ๋๋ค.
์ธ์คํด์ค ๋๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ์์ญ์ผ๋ก GC ๋์์ด๋ค. Heap์ ์ ์ฅ๋ ๊ฐ์ฒด์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ ๋ช
์์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ ๋ ํ์ํ ์ ์์ผ๋ฉฐ(๊ถ์ฅ๋์ง ์์ง๋ง, System
์ gc()
method๋ฅผ ํตํด GC ์ํ์ ์์ฒญํ ์๋ ์๋ค.), ์ค์ง GC์ ์ํด์๋ง ํ์๋ ์ ์๋ค. JVM ์ฑ๋ฅ ๋ฑ์ ์ด์์์ ๊ฐ์ฅ ๋ง์ด ์ธ๊ธ๋๋ฉฐ, ๋ชจ๋ JVM ์ค๋ ๋์ ๊ณต์ ๋๋ค.
JVM์ด ๋ง ์คํ๋ ์ด ์์ ์์ ๋น์ฐํ Heap์ ๋น ์ํ์ด๋ค.
๋ ์์ธํ Heap ์์ญ์ ๊ตฌ์กฐ์ GC ์๊ณ ๋ฆฌ์ฆ์ด ๊ถ๊ธํ๋ค๋ฉด, https://d2.naver.com/helloworld/1329 ์ฐธ๊ณ .
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 ๋ํ ๋น ์ํ์ด๋ค.
load
(1)์์ ์์ initial class๋ Aloah
์ด๋ฏ๋ก, ์ด ์์ ์์ Class Loader๋ Aloah
๋ฅผ load
ํ๋ค. ์ฌ๊ธฐ์ class load
ํ๋ค๋ ๊ฒ์ ์๋ฏธ์ Runtime Constant Pool์ ๋ํด ์ ํํ ์์๋ณธ ๋ค, ๋ค์ ํ๋ฆ์ ์งํํ๋๋ก ํ์.
load
Java๋ ๋์ load
, ์ฆ Runtime์ Class๋ฅผ ์ฒ์์ผ๋ก ์ฐธ์กฐํ ๋ ์ด๋ฅผ ๋ก๋ํ๋ ํน์ง์ด ์๋ค. ์ด๋ฅผ ์ํํ๋ ๋ถ๋ถ์ด JVM์ Class Loader์ด๋ค. ์์ธํ ๋ด์ฉ์ Java ํด๋์ค๋ก๋ ํ์ด๋ณด๊ธฐ๋ฅผ ์ฐธ๊ณ ํ์. ์ด ๊ธ์์๋ Class Loader์ ์ํด ์ํ๋๋ Class load
์ ๊ฐ๋
์ ๋ํด์๋ง ๋ค๋ฃจ๊ฒ ๋ค. Class Loader๊ฐ ์์ง load
๋์ง ์์ Class๋ฅผ ์ฐพ์ผ๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์ณ load
ํ๋ค. ์์๋๋ก ์ดํด๋ณด์.
<clinit>
์ผ๋ก ํ๊ธฐ๋ class(or interface) initialization method(JVM Specification ์ฐธ๊ณ )๋ฅผ ์คํํ๋ ๊ฒ. ์ฆ, static initializer block๋ค์ ์คํํ์ฌ, static ํ๋๋ฅผ ์ ์ ํ ๊ฐ์ผ๋ก ์ด๊ธฐํํ๋ ๊ฒ.์ด๋ per-class
๋จ์์ ์ํ๋ฏ๋ก class ์์ฑ์ ์์ฑ๋๋ฉฐ, Bytecode์์ constant_pool ํ
์ด๋ธ์ ํด๋นํ๋ ์์ญ์ด๋ค. ์ด๋ ์ปดํ์ผํ์์ ์ด๋ฏธ ์ ์ ์๋ ๋ฆฌํฐ๋ด ๊ฐ๋ฟ๋ง ์๋๋ผ, ๋ฐํ์์ resolving๋๋ method์ ํ๋์ ๋ํ ๋ชจ๋ reference๋ฅผ ๋ด๊ณ ์๋ ํ
์ด๋ธ์ด๋ค. ์ฆ, ํน์ method ํน์ ํ๋๋ฅผ ์ฐธ์กฐํ ๋ JVM์ Runtime Constant Pool์ ํตํด ์ค์ Memory์ ์ฃผ์๋ฅผ ์ฐพ์ ์ฐธ์กฐํ๋ค.
load
(2)๋ค์ Class Loader๊ฐ initial class์ธ Aloah
๋ฅผ load
ํ๋ ์์ ์ผ๋ก ๋์์, ์์ ๋ฅผ ์ดํด๋ณด์.
Aloah
์ Bytecode๊ฐ Method Area์ ์ ์ฅ๋๊ณ , ์ด์ ๋ฐ๋ผ Runtime Constant Pool๋ ํจ๊ป ์์ฑ๋๋ค.Aloah
์ superclass์ธ Object
๊ฐ ๋ก๋ฉ๋๋ค.#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๋ก ๋ณ๊ฒฝํ๋ค.์ด๋ ๊ฒ class load
์ ๋ง์ณค๋ค. ๋ค์์ main()
์ ํธ์ถํ ๋จ๊ณ๋ค.
main()
Method ํธ์ถ (1)์ด์ main()
method๋ฅผ ํธ์ถํ์ฌ, ์ค์ง์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์คํ(excute)ํ๋ค. ์ด๋ Excution Engine์ ์ํด ์ํ๋๋ค. ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ค๋ฉด ํ๋ก๊ทธ๋จ ํ๋ฆ์ ์ต์ ๋จ์์ธ thread๊ฐ ์์ด์ผ ํ๋ค. ๋ฐ๋ผ์, JVM์ main()
method ํธ์ถ์ ์ํ main thread๋ฅผ ์์ฑํ๋ค. ์ฌ๊ธฐ์ Excution Engine๊ณผ per-Thread
๋จ์์ ์ํ๋ ๋ฐ์ดํฐ ์์ญ๋ค์ ๋ํด ์ ํํ ์์๋ณธ ๋ค, ๋ค์ ํ๋ฆ์ ์งํํ๋๋ก ํ์.
์ฉ์ด์์ ์ ์ ์๋ฏ์ด ์ค์ง์ ์ผ๋ก Bytecode๋ฅผ ๋ช ๋ น์ด ๋จ์๋ก ์ฝ์ด ์คํํ๋ค. Bytecode์ ๋ช ๋ น์ด๋ 1byte์ OpCode์ ์ถ๊ฐ Operand๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์์ ์ธ๊ธํ์๋ฏ์ด Bytecode๋ Native Code๊ฐ ์๋๊ธฐ ๋๋ฌธ์ Excution Engine์ Bytecode๋ฅผ ๊ธฐ๊ณ๊ฐ ์คํํ ์ ์๋ ํํ๋ก ๋ณ๊ฒฝํ๋ฉฐ, ๊ทธ ๋ฐฉ๋ฒ์ ๋ค์ํ๋ค. ๋ํ์ ์ผ๋ก ์คํ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
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๋ก ๊ตฌ์ฑ๋๋ค. ๊ทธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
this
reference๊ฐ 0๋ฒ index์ ์ ์ฅ๋๊ณ , 1๋ฒ index๋ถํฐ ํ๋ฆฌ๋ฏธํฐ๋ค์ด ์ฐจ๋ก๋๋ก ์ ์ฅ๋๋ค.push
ํ๊ฑฐ๋ pop
ํ๋ค. ๋๋ต์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋๊ฒจ์ฃผ๋ ๊ฑฐ์ ๋ชจ๋ ๊ณผ์ ์ด Operand Stack์ ํตํด ์ด๋ฃจ์ด์ง๋ค๊ณ ๋ณด๋ฉด ๋๋ค.์ด๋, 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์๋ ํ์ฌ ์คํ ์ค์ธ Method๊ฐ
์ด๋ 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ํด์ ๊ธ๋ก ์์ฑํ๊ณ , ์ค์๋๊ฐ ๋ฎ์ ๋ถ๋ถ์ ๋งํฌ๋ก ์ฒ๋ฆฌํด์ผ๊ฒ ๋ค..