[JVM] Class Loader
1. Class Loader๋ ?
Java๋ Runtime๋์ ํ์ํ ํด๋์ค ํ์ผ์ ๋์ ์ผ๋ก ์ฝ์ด์ค๋๋ฐ Class Loader๋ ์ฌ๊ธฐ์ Java ํด๋์ค๋ฅผ JVM์ ๋์ ์ผ๋ก ๋ก๋ํ๋ ์ญํ ์ ํ๋ค. JVM์ด ๋์ํ๋ค๊ฐ ํ์ํ ์๊ฐ(ํด๋์ค ํ์ผ์ ์ฐธ์กฐํ๋ ์๊ฐ)์ ํด๋์ค ํ์ผ์ ์ฝ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋์ ์ผ๋ก ๋ก๋ํ๋ค.
Class Loader ๋๋ถ์ JVM์ Java ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํ ์ ๋ณด๋ค์ ๋ชจ๋ ๊ฐ์ง๊ณ ์์ ํ์๊ฐ ์๋ค.
2. ๋ด์ฅ Class Loader์ ์ข ๋ฅ
2-1. Bootstrap Class Loader
๋ชจ๋ Java ํด๋์ค๋ Java.lang.ClassLoader์ ์ํด์ ๋ก๋๋๋ค. ํ์ง๋ง ClassLoader ์์ฒด๋ ํด๋์ค์ด๋ค.
ClassLoader ์์ฒด๋ ํด๋์ค๋ผ๋ฉด ClassLoader๋ ๋๊ฐ ๋ก๋ํ ๊น ? ์ด๋๊ฐ์์ ๋ก๋ํด์ ClassLoader๊ฐ ์๋์ ํ ํ
๋ ๋ง์ด๋ค.
์ด๋ฌํ ClassLoader๋ฅผ ๋ก๋ํ๋ ๊ฒ์ด Bootstrap Class Loader์ด๋ค.
- Bootstrap Class Loader๋ \($\)Java_HOME/jre/lib ์ ์๋ rt.jar ๋ฐ ๊ธฐํ ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ JDK ๋ด๋ถ์ ํด๋์ค๋ฅผ ๋ก๋ํ๋ ์ญํ ์ ํ๋ค.(Java 8 ๊ธฐ์ค)
- ๋ํ Bootstrap Class Loader๋ ๋ชจ๋ ClassLoader ์ธ์คํด์ค์ ๋ถ๋ชจ ์ญํ ์ด๋ค.
- Bootstrap Class Loader๋ Java๊ฐ ์๋ ๋ค์ดํฐ๋ธ ์ธ์ด(Native C)๋ก ์์ฑ๋์ด ์๋ค.
- ์ฐ๋ฆฌ๊ฐ ํํ ์ฌ์ฉํ๋ java.lang ํจํค์ง ์์ ์๋ ํด๋์ค๋ค์ ๋ก๋ํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. (ex. java.lang.Object, java.lang.Classloader)
2-2. Extension Class Loader (Java 8 ๊ธฐ์ค์ด๋ฆ)
- Extension Class Loader๋ Bootstrap Class Loader์ ์์์ด๋ค.
- ์ผ๋ฐ์ ์ผ๋ก \($\)JAVA_HOME/jre/lib/ext ํด๋๋ java.ext.dirs ํ๊ฒฝ ๋ณ์๋ก ์ง์ ๋ ํด๋์ ์๋ ํด๋์ค ํ์ผ์ ๋ก๋ฉํ๋ค.(Java 8 ๊ธฐ์ค)
- URLClassLoader๋ฅผ ์์ํ๊ณ ์๋ค.(Java 8 ๊ธฐ์ค)
- Bootstrap Class Loader์ ๋ค๋ฅด๊ฒ Java๋ก ๊ตฌํ๋์ด ์๋ค.
2-3. Application Class Loader (Java 8 ๊ธฐ์ค์ด๋ฆ)
- Extension Class Loader๋ฅผ ๋ถ๋ชจ๋ก ๋๋ค.
- ์ง์ ๋ class path์ ์๋ ํด๋์ค๋ค์ ๋ก๋ฉํ๋ค.
- sun.misc.Launcher ํด๋์ค ์์ staticํด๋์ค๋ก ๊ตฌํ๋์ด ์์ผ๋ฉฐ, URLClassLoader๋ฅผ ์์ํ๊ณ ์๋ค.(Java 8 ๊ธฐ์ค)
3. Java 9 ์ด์ ๋ฒ์ ์์์ ๋ด์ฅ Class Loader
์์ ๋ด์ฉ์์ Java 8 ๊ธฐ์ค์ด๋ผ๊ณ ์ ํ ๋ด์ฉ์ ๋ณผ ์ ์๋ค.
Java 9 ๋ฒ์ ์ด์๋ถํฐ๋ ๋ชจ๋ ์์คํ
์ ๋์
์ ๋ง์ถฐ ์ด๋ฆ๊ณผ ๋ฒ์ ๊ตฌํ ๋ด์ฉ ๋ฑ์ด ๋ฐ๋์๊ธฐ ๋๋ฌธ์ด๋ค.
3-1. rt.jar, tools.jar๊ฐ ์ ๊ฑฐ๋จ
rt.jar, tools.jar์ ๊ธฐํ ๋ค์ํ ๋ด๋ถ JARํ์ผ์ ์ ์ฅ๋ ํด๋์ค ๋ฐ ๋ฆฌ์์ค ํ์ผ์ ๋ณด๋ค ํจ์จ์ ์ธ ํ์์ผ๋ก libํด๋ ์์ ์ ์ฅ๋๋ค.
์ด์ ๋ฐ๋ผ rt.jar๋ด์ ํด๋์ค๋ฅผ ๋ก๋ฉํ๋ Bootstrap Class Loader๊ฐ ๋ก๋ฉํ ์ ์๋ ๋ฒ์๊ฐ ์ค์ด๋ค์๋ค.
3-2. jre/lib/ext, java.ext.dirs, lib/endorsed, java.endorsed.dirs๊ฐ ์ ๊ฑฐ๋จ
์์ ์ธ๊ธํ ๋ถ๋ถ์ด ์ ๊ฑฐ๋จ์ ๋ฐ๋ผ jre/lib/ext, lib/endorsed๊ฐ ํ์ผ ์์คํ ์ ์กด์ฌํ๊ฑฐ๋ java.ext.dirs, java.endorsed.dirs๊ฐ ํ๊ฒฝ๋ณ์๋ก ์ค์ ๋์ด ์๋ค๋ฉด javac๋ java๋ ์ข ๋ฃ๋๋ค.
3-3. ๋ณ๊ฒฝ๋ด์ฉ ์ ๋ฆฌ
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. Class Loader์ ์์น
ํด๋์ค ๋ก๋์ ์์น์ ํฌ๊ฒ 4๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
- ๊ฐ์์ฑ ์์น
- ์ ์ผ์ฑ ์์น
- ์์ ๊ณ์ธต
- ์ธ๋ก๋(Unload) ๋ถ๊ฐ
4-1. ๊ฐ์์ฑ ์์น
3๋ฒ ํญ๋ชฉ์์ ์ค๋ช ํ๋ฏ์ด ๊ฐ ํด๋์ค ๋ก๋๋ค์ ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ํ์ ํด๋์ค๋ ์์ ํด๋์ค๋ฅผ ์์ํ๋ค.
์ด๋ฌํ ๊ตฌ์กฐ์์ ํด๋์ค ๋ก๋๋ฅผ ์์ฒญ๋ฐ์ ํด๋์ค ๋ก๋ ์บ์๋ฅผ ํ์ธํ ๋, ์์ ํด๋์ค ๋ก๋๋ ๋ถ๋ชจ ํด๋์ค ๋ก๋๊ฐ ๋ก๋ํ ๊ฒ์ ๋ณผ ์ ์์ง๋ง ๋ถ๋ชจ ํด๋์ค ๋ก๋๋ ์์ ํด๋์ค ๋ก๋๊ฐ ๋ก๋ํ ํด๋์ค๋ฅผ ๋ณผ ์ ์๋ค๋ ์์น์ด๋ค.
4-2. ์ ์ผ์ฑ ์์น
๋ถ๋ชจ๊ฐ ๋ก๋ํ ํด๋์ค๋ฅผ ์์ ํด๋์ค ๋ก๋๊ฐ ๋ค์ ๋ก๋ํ์ง ์์์ผํ๋ฉฐ ์ด๋ฏธ ๋ก๋ํ ํด๋์ค๋ฅผ ๋ค์ ๋ก๋ํด์๋ ์๋๋ค๋ ์์น์ด๋ค.
์ด ์์น์ ํตํด ํด๋์ค๊ฐ ์ ํํ ํ ๋ฒ๋ง ๋ก๋ํ ์ ์๋ค.
4-3. ์์ ๊ณ์ธต
์์์ ์ค๋ช ํ ๊ฐ์์ฑ ์์น๊ณผ ์ ์ผ์ฑ ์์น์ ์ถฉ์กฑํ๊ธฐ ์ํด JVM์ ํด๋์ค ๋ก๋ฉ ์์ฒญ์ ์๋์ ๊ฐ์ ์์๋ก ์ฒ๋ฆฌํ๋ค.
- ํด๋์ค ๋ก๋ ์บ์
- ์์ ํด๋์ค ๋ก๋
- ์๊ธฐ ์์
- ์ด์ ์ ๋ก๋๋ ํด๋์ค์ธ์ง ํด๋์ค ๋ก๋ ์บ์๋ฅผ ํ์ธํ๊ณ ์๋ค๋ฉด ์์ ํด๋์ค ๋ก๋์๊ฒ ์์ฒญ์ ์์ํ๋ค.
Application Loader๋ Extension Loader์๊ฒ ์์ฒญ์ ์์ํ๊ณ Extension์ Bootstrap Loader์๊ฒ ์์ฒญ์ ์์ํ๋ค. - ์์ฒญ์ ์์๋ฐ์ Bootstrap Loader๋
Java ๋ฒ์ ์ ๋ง๊ฒโ
Java 8๋ฒ์ : rt.jar์ ๋ด๊ธด jdk ํด๋์ค ํ์ผ์ ๋ก๋ฉ
Java 9๋ฒ์ ์ดํ : ClassLoader ๋ด ์ต์์ ํด๋์ค๋ค๋ง ๋ก๋ฉ ์์ฒญํ ํด๋์ค๋ฅผ ์ฐพ๋๋ค.
๋ง์ฝ ํด๋์ค๊ฐ ์๋ค๋ฉด ํด๋์ค๋ฅผ ๋ฐํํ๊ณ ์๋๋ผ๋ฉด ๋ค์ Extension Loader์๊ฒ ์์ฒญ์ ์์ํ๋ค. - Extension Loader๋ ๋ง์ฐฌ๊ฐ์ง๋ก
Java ๋ฒ์ ์ ๋ง๊ฒโ
Java 8๋ฒ์ : jre/lib/ext, java.ext.dirs
Java 9๋ฒ์ ์ดํ : Java SE ๋ชจ๋ ํด๋์ค, JCP์ ์ํด ํ์คํ๋ ๋ชจ๋ ๋ด์ ํด๋์ค ํด๋์ค๋ฅผ ์ฐพ๊ณ ์๋ค๋ฉด ํด๋์ค๋ฅผ ๋ฐํ ์๋๋ผ๋ฉด ์์ฒญ์ Application Loader์๊ฒ ์์ํ๋ค. - Application Loader๋ ๋์์ ๋ง์ฐฌ๊ฐ์ง๋ก
Classpath๐ฌ
ํด๋์ค ํ์ผ์ ์ฐพ๋ ๋ฐ ๊ธฐ์ค์ด ๋๋ ํ์ผ ๊ฒฝ๋ก๋ฅผ ๋งํ๋ค.
์์คํ ์ ๋ชจ๋ ํด๋๋ฅผ JVM์ด ๊ฒ์ฌํ๋๋ก ํ๋ ๊ฒ์ ๋นํ์ค์ ์ด๋ฏ๋ก JVM์ ์ฐพ์๋ณผ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํด์ผ ํ๋ค. ์์ ์์ฒญํ ํด๋์ค๋ฅผ ์ฐพ์ ๋ค ์๋ค๋ฉด ๋ฐํ ์๋ค๋ฉด ClassNotFoundException์ด ๋ฐ์ํ๋ค.
4-4. ์ธ๋ก๋ ๋ถ๊ฐ
์ธ๋ก๋ ๋ถ๊ฐ ์์น์ ๋ง๊ทธ๋๋ก ์ด๋ฏธ ๋ก๋ํ ํด๋์ค๋ฅผ ์ธ๋ก๋(Unload)ํ ์ ์๋ค๋ ์์น์ด๋ค.
5. Class Loader์ ๋์ ์์
ํด๋์ค ๋ก๋ ์์คํ ์ ํฌ๊ฒ 3๊ฐ์ง์ ์์๋ก ์คํ๋๋ค.
- ๋ก๋ฉ
- ๋งํฌ
- ์ด๊ธฐํ
5-1. ๋ก๋ฉ
๋ก๋ฉ ๋จ๊ณ๋ .class ํ์ผ์ ์ฝ์ด์ ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ก ๋ง๋ค๊ณ ์ด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ฉ์๋ ์์ญ(Method Area)์ ์ ์ฅํ๋ ๊ณผ์ ์ ๋งํ๋ค.
JVM์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
- Class, Enum, Inteface๋ฅผ ๊ตฌ๋ถํด์ ์ ์ฅํ๋ค.
- ๋ก๋ฉ์ด ๋๋๋ฉด ํด๋น ํด๋์ค ํ์ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํด ๋ฉ๋ชจ๋ฆฌ์ Heap์์ญ์ ์ ์ฅํ๋ค.
- ๋์ ๋ก๋ฉ : ๋ณธ๋ฌธ์ ์ฒ์์ ์ธ๊ธํ๋ฏ์ด ๋ฐํ์ ์ค ํ์ํ ๋๋ง๋ค ๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํด์ ํจ์จ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค.
- ๋์ ์์๋ ์ด ๊ธ์ ์์ ๊ณ์ธต์์ ์ค๋ช ํ์ผ๋ฏ๋ก ๋ค์ ํ์ธํ์.
5-2. ๋งํฌ
๋งํฌ ๋จ๊ณ๋ ๋ก๋๋ Class, Interface ๋ฑ์ ๊ฒ์ฆ, ์ค๋น, ํด์ํ๋ ๊ณผ์ ์ ๋งํ๋ค.
- Verify(๊ฒ์ฆ) - Prepare(์ค๋น) - Resolve(ํด์) ์ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
- Verify
- .class ํ์ผ์ด ์๋ฐ ์ธ์ด ๋ช ์ธ์์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ์ ๋๋ก ์ ์์ฑํ๋์ง, JVM ๊ท๊ฒฉ์ ๋ฐ๋ผ ๊ฒ์ฆ๋ ์ปดํ์ผ๋ฌ์์ ํ์ผ์ด ์์ฑ๋๋์ง ๋ฑ์ ํ์ธํด ํ์ผ์ ์ ํ์ฑ์ ๋ณด์ฅํ๋ค.
- ๋ง์ฝ ๊ฒ์ฆ์ด ์คํจํ๋ค๋ฉด java.lang.VerifyError์ ๋ฐ์์์ผ ์ ํจํ์ง ์์ ํด๋์ค ํ์ผ์ ๋ณ๊ฒฝ์ ๋ฏธ์ฐ์ ๋ฐฉ์งํ ์ ์๋ค.
- Prepare
- ๋งค๋ชจ๋ฆฌ๋ฅผ ์ค๋นํ๋ ๋จ๊ณ
- Class ๋๋ Interface์ ํ์ํ ์ ์ ํ๋๋ฅผ ๋ง๋ค๊ณ ํด๋น ํ๋๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํ ํ๋ ์์
์ ์ํํ๋ค.
class ExampleClass { private static int a = 10; }
์์ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค๋ฉด intํ ์ ์ ๋ณ์์ธ a์ 4byte์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๊ณ ๊ธฐ๋ณธ๊ฐ์ธ 0์ผ๋ก ์ด๊ธฐํํ๋ค.
- ์์ ์์ ์ํ์ค ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ค๋ฉด java.lang.OutOfMemoryError์ด ๋ฐ์ํ๋ค.
- Resolve
- ํด์๋จ๊ณ๋ ๋ฐํ์ ์์ ํ(run-time constant pool)์ ์๋ ์ฌ๋ณผ๋ฆผ ์ฐธ์กฐ๋ฅผ ์ง์ ์ฐธ์กฐ๋ก ๋์ฒดํ๋ ๊ณผ์ ์ ๋งํ๋ค.
- JVM์ ๋ช
๋ น์ด(anewarray, checkcast, getfield, getstatic, instanceof, invokedynamic, invokeinterface
, invokespecial, invokestatic, invokevirtual, ldc, ldc_w, multianewarray, new, putfield ๋ฐ putstatic)๋ ์ฌ๋ณผ๋ฆญ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋๋ฐ
์ด๋ฌํ ๋ช
๋ น์ด๋ฅผ ํด์ํ๋ ค๋ฉด ์ฌ๋ณผ๋ฆญ ์ฐธ์กฐ๋ฅผ ํด์ํด์ผํ๋ค.
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
์์ ์์ํ์ ์ฌ๋ณผ๋ฆญ ์ฐธ์กฐ๋ฅผ ์ง์ ์ฐธ์กฐ๋ก ๋์ฒดํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
5-3. ์ด๊ธฐํ
์ด๊ธฐํ ๋จ๊ณ๋ ๋ก๋๋ ๊ฐ Class๋ Interface์ ์ด๊ธฐํ ๋ก์ง์ด ์คํ๋๋ ๊ณผ์ ์ ๋งํ๋ค.
- ์ ์ ๋ณ์๋ ์ฝ๋์ ๋ช ์๋ ์๋ ๊ฐ์ด ํ ๋น๋๋ค.
- ์ด๊ธฐํ ๋ธ๋ก (static { })์ด ์คํ๋๋ค.
- ํด๋์ค ๊ณ์ธต๊ตฌ์กฐ์์ ๋ถ๋ชจ์์ ์์๊น์ง ํ ์ค์ฉ ์คํ๋๋ค.