Java๋ Runtime๋์ ํ์ํ ํด๋์ค ํ์ผ์ ๋์ ์ผ๋ก ์ฝ์ด์ค๋๋ฐ Class Loader๋ ์ฌ๊ธฐ์ Java ํด๋์ค๋ฅผ JVM์ ๋์ ์ผ๋ก ๋ก๋ํ๋ ์ญํ ์ ํ๋ค. JVM์ด ๋์ํ๋ค๊ฐ ํ์ํ ์๊ฐ(ํด๋์ค ํ์ผ์ ์ฐธ์กฐํ๋ ์๊ฐ)์ ํด๋์ค ํ์ผ์ ์ฝ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋์ ์ผ๋ก ๋ก๋ํ๋ค.
Class Loader ๋๋ถ์ JVM์ Java ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํ ์ ๋ณด๋ค์ ๋ชจ๋ ๊ฐ์ง๊ณ ์์ ํ์๊ฐ ์๋ค.
๋ชจ๋ Java ํด๋์ค๋ Java.lang.ClassLoader์ ์ํด์ ๋ก๋๋๋ค. ํ์ง๋ง ClassLoader ์์ฒด๋ ํด๋์ค์ด๋ค.
ClassLoader ์์ฒด๋ ํด๋์ค๋ผ๋ฉด ClassLoader๋ ๋๊ฐ ๋ก๋ํ ๊น ? ์ด๋๊ฐ์์ ๋ก๋ํด์ ClassLoader๊ฐ ์๋์ ํ ํ
๋ ๋ง์ด๋ค.
์ด๋ฌํ ClassLoader๋ฅผ ๋ก๋ํ๋ ๊ฒ์ด Bootstrap Class Loader์ด๋ค.
์์ ๋ด์ฉ์์ Java 8 ๊ธฐ์ค์ด๋ผ๊ณ ์ ํ ๋ด์ฉ์ ๋ณผ ์ ์๋ค.
Java 9 ๋ฒ์ ์ด์๋ถํฐ๋ ๋ชจ๋ ์์คํ
์ ๋์
์ ๋ง์ถฐ ์ด๋ฆ๊ณผ ๋ฒ์ ๊ตฌํ ๋ด์ฉ ๋ฑ์ด ๋ฐ๋์๊ธฐ ๋๋ฌธ์ด๋ค.
rt.jar, tools.jar์ ๊ธฐํ ๋ค์ํ ๋ด๋ถ JARํ์ผ์ ์ ์ฅ๋ ํด๋์ค ๋ฐ ๋ฆฌ์์ค ํ์ผ์ ๋ณด๋ค ํจ์จ์ ์ธ ํ์์ผ๋ก libํด๋ ์์ ์ ์ฅ๋๋ค.
์ด์ ๋ฐ๋ผ rt.jar๋ด์ ํด๋์ค๋ฅผ ๋ก๋ฉํ๋ Bootstrap Class Loader๊ฐ ๋ก๋ฉํ ์ ์๋ ๋ฒ์๊ฐ ์ค์ด๋ค์๋ค.
์์ ์ธ๊ธํ ๋ถ๋ถ์ด ์ ๊ฑฐ๋จ์ ๋ฐ๋ผ jre/lib/ext, lib/endorsed๊ฐ ํ์ผ ์์คํ ์ ์กด์ฌํ๊ฑฐ๋ java.ext.dirs, java.endorsed.dirs๊ฐ ํ๊ฒฝ๋ณ์๋ก ์ค์ ๋์ด ์๋ค๋ฉด javac๋ java๋ ์ข ๋ฃ๋๋ค.
Java 8 | Java 9 | ๋ณ๊ฒฝ ๋ด์ฉ |
---|---|---|
Bootstrap ClassLoader |
๋ณ๊ฒฝ ๋์ง ์์ | rt.jar ๋ฑ์ด ์์ด์ง์ ๋ฐ๋ผ ๋ก๋ฉํ ์ ์๋ ํด๋์ค์ ๋ฒ์๊ฐ ์ ๋ฐ์ ์ผ๋ก ์ถ์ |
Extension ClassLoader |
Platform ClassLoader |
1. jre/lib/ext, java.ext.dirs๋ฅผ ์ง์ํ์ง ์์ Java SE์ ๋ชจ๋ ํด๋์ค์ Java SE์๋ ์์ง๋ง JCP์ ์ํด ํ์คํ ๋ ๋ชจ๋ ๋ด์ ํด๋์ค๋ฅผ ๋ณผ ์ ์์ผ๋ฉฐ, Java 8์ ๋นํด ๋ณผ ์ ์๋ ๋ฒ์๊ฐ ํ์ฅ๋จ 2. URLClassLoader๊ฐ ์๋ BuiltinClassLoader๋ฅผ ์์๋ฐ์ ClassLoders ํด๋์ค์ ๋ด๋ถ static ํด๋์ค๋ก ๊ตฌํ๋จ |
Application ClassLoader |
System ClassLoader |
URLClassLoader๊ฐ ์๋ BuiltinClassLoader๋ฅผ ์์๋ฐ์ ClassLoders ํด๋์ค์ ๋ด๋ถ static ํด๋์ค๋ก ๊ตฌํ๋จ |
ํด๋์ค ๋ก๋์ ์์น์ ํฌ๊ฒ 4๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
3๋ฒ ํญ๋ชฉ์์ ์ค๋ช ํ๋ฏ์ด ๊ฐ ํด๋์ค ๋ก๋๋ค์ ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ํ์ ํด๋์ค๋ ์์ ํด๋์ค๋ฅผ ์์ํ๋ค.
์ด๋ฌํ ๊ตฌ์กฐ์์ ํด๋์ค ๋ก๋๋ฅผ ์์ฒญ๋ฐ์ ํด๋์ค ๋ก๋ ์บ์๋ฅผ ํ์ธํ ๋, ์์ ํด๋์ค ๋ก๋๋ ๋ถ๋ชจ ํด๋์ค ๋ก๋๊ฐ ๋ก๋ํ ๊ฒ์ ๋ณผ ์ ์์ง๋ง ๋ถ๋ชจ ํด๋์ค ๋ก๋๋ ์์ ํด๋์ค ๋ก๋๊ฐ ๋ก๋ํ ํด๋์ค๋ฅผ ๋ณผ ์ ์๋ค๋ ์์น์ด๋ค.
๋ถ๋ชจ๊ฐ ๋ก๋ํ ํด๋์ค๋ฅผ ์์ ํด๋์ค ๋ก๋๊ฐ ๋ค์ ๋ก๋ํ์ง ์์์ผํ๋ฉฐ ์ด๋ฏธ ๋ก๋ํ ํด๋์ค๋ฅผ ๋ค์ ๋ก๋ํด์๋ ์๋๋ค๋ ์์น์ด๋ค.
์ด ์์น์ ํตํด ํด๋์ค๊ฐ ์ ํํ ํ ๋ฒ๋ง ๋ก๋ํ ์ ์๋ค.
์์์ ์ค๋ช ํ ๊ฐ์์ฑ ์์น๊ณผ ์ ์ผ์ฑ ์์น์ ์ถฉ์กฑํ๊ธฐ ์ํด JVM์ ํด๋์ค ๋ก๋ฉ ์์ฒญ์ ์๋์ ๊ฐ์ ์์๋ก ์ฒ๋ฆฌํ๋ค.
์ธ๋ก๋ ๋ถ๊ฐ ์์น์ ๋ง๊ทธ๋๋ก ์ด๋ฏธ ๋ก๋ํ ํด๋์ค๋ฅผ ์ธ๋ก๋(Unload)ํ ์ ์๋ค๋ ์์น์ด๋ค.
ํด๋์ค ๋ก๋ ์์คํ ์ ํฌ๊ฒ 3๊ฐ์ง์ ์์๋ก ์คํ๋๋ค.
๋ก๋ฉ ๋จ๊ณ๋ .class ํ์ผ์ ์ฝ์ด์ ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ก ๋ง๋ค๊ณ ์ด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ฉ์๋ ์์ญ(Method Area)์ ์ ์ฅํ๋ ๊ณผ์ ์ ๋งํ๋ค.
JVM์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
๋งํฌ ๋จ๊ณ๋ ๋ก๋๋ Class, Interface ๋ฑ์ ๊ฒ์ฆ, ์ค๋น, ํด์ํ๋ ๊ณผ์ ์ ๋งํ๋ค.
class ExampleClass {
private static int a = 10;
}
์์ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค๋ฉด intํ ์ ์ ๋ณ์์ธ a์ 4byte์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๊ณ ๊ธฐ๋ณธ๊ฐ์ธ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
class ConstantPoolExample{
public void example(){
System.out.println("constant pool");
}
}
์ด ์ฝ๋๋ฅผ ๋์ด์
๋ธ๋ฌ ๋ช
๋ น์ด์ธ javap -v ์ด๋ฆ.class ๋ฅผ ํตํด ๋ฐ์ดํธ์ฝ๋๋ก ๋ถ์ํ๋ฉด ์๋์ ๊ฐ๋ค.
#n์ ์์ํ์ n๋ฒ ์ธ๋ฑ์ค๋ก ์ ๊ทผํ๋ ๋ฐ์ดํธ์ฝ๋์ด๋ค.
#1 = Methodref #6.#14 // java/lang/Object."<init>":()V
#2 = Fieldref #15.#16 // java/lang/System.out:Ljava/io/PrintStream;
#3 = String #17 // constant pool
#4 = Methodref #18.#19 // java/io/PrintStream.println:(Ljava/lang/String;)V
#5 = Class #20 // ConstantPoolExample
#6 = Class #21 // java/lang/Object
#7 = Utf8 <init>
#8 = Utf8 ()V
#9 = Utf8 Code
#10 = Utf8 LineNumberTable
#11 = Utf8 example
#12 = Utf8 SourceFile
#13 = Utf8 constant.java
#14 = NameAndType #7:#8 // "<init>":()V
#15 = Class #22 // java/lang/System
#16 = NameAndType #23:#24 // out:Ljava/io/PrintStream;
#17 = Utf8 constant pool
#18 = Class #25 // java/io/PrintStream
#19 = NameAndType #26:#27 // println:(Ljava/lang/String;)V
#20 = Utf8 ConstantPoolExample
#21 = Utf8 java/lang/Object
#22 = Utf8 java/lang/System
#23 = Utf8 out
#24 = Utf8 Ljava/io/PrintStream;
#25 = Utf8 java/io/PrintStream
#26 = Utf8 println
#27 = Utf8 (Ljava/lang/String;)V
์์ ์์ํ์ ์ฌ๋ณผ๋ฆญ ์ฐธ์กฐ๋ฅผ ์ง์ ์ฐธ์กฐ๋ก ๋์ฒดํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
์ด๊ธฐํ ๋จ๊ณ๋ ๋ก๋๋ ๊ฐ Class๋ Interface์ ์ด๊ธฐํ ๋ก์ง์ด ์คํ๋๋ ๊ณผ์ ์ ๋งํ๋ค.