# Javaì ë©ëª¨ë¦¬ 구조 ## JVMì´ ì¤íëë ê³¼ì  1. ìë° ìì¤ì½ëì¸ .java íì¼ì ì»´íì¼ë¬ê° ìë° ë°ì´í¸ ì½ëì¸ .classë¡ ë³íí©ëë¤. 2. .class ì½ë를 JVMì í´ëì¤ ë¡ëìê² ë³´ë ëë¤. 3. í´ëì¤ ë¡ëë JVM Runtime Data Areaì¼ë¡ ë¡ë©íì¬ JVMì ë©ëª¨ë¦¬ì ì¬ë¦½ëë¤. 4. Runtime Data Areaì ë¡ë©ë .classë¤ì Execution Engineì íµí´ í´ìí©ëë¤. 5. í´ìë ë°ì´í¸ ì½ëë Runtime Data Areaì ê° ììì ë°°ì¹ëì´ ìííë©° ì´ ê³¼ì ìì Execution Engineì ìí´ GCì ìëê³¼ ì¤ë ë ë기íê° ì´ë£¨ì´ì§ëë¤. ## ë°íì ë°ì´í° ìì ë°íì ë°ì´í° ììì JVMì ë©ëª¨ë¦¬ ììì¼ë¡ ìë° ì í리ì¼ì´ì ì ì¤íí ë ì¬ì©ëë ë°ì´í°ë¥¼ ì ì¬íë ììì´ë¤. * **모ë ì¤ë ëê° ê³µì í´ì ì¬ì©(GCì ëì)** * í ìì(Heap Area) * ë©ìë ìì(Method ìì) * **ì¤ë ëë§ë¤ íëì© ìì±** * ì¤í ìì(Stack Area) * PC ë ì§ì¤í°(PC Register) * ë¤ì´í°ë¸ ë©ìë ì¤í(Native Method Stack) ### ë©ìë ìì(Method ìì) * JVMì´ ì¤íëë©´ì ì기ë ê³µê°. * Class ì ë³´, ì ìë³ì ì ë³´, Static ë³ì ì ë³´ê° ì ì¥ëë ê³µê° * Runtime Constant Pollìë ë§ ê·¸ëë¡ ìì ì ë³´ê° ì ì¥ëë¤. * 모ë ì¤ë ëìì ì ë³´ê° ê³µì ëë¤. ### í ìì (Heap Area)  * **new** í¤ìëë¡ ìì±ë ê°ì²´ì ë°°ì´ì´ ìì±ëë ìì * 주기ì ì¼ë¡ GCê° ì ê±°íë ìì í ììì ë ìì¸íê²ë GC를 ìí´ í¬ê² 3ê°ì§ ììì¼ë¡ ëëë¤. Young Generationì ìë° ê°ì²´ê° ìì±ëìë§ì ì ì¥ëê³ , ìê¸´ì§ ì¼ë§ ìë ê°ì²´ê° ì ì¥ëë ê³µê°. Heap ììì ê°ì²´ê° ìì±ëë©´ ìµì´ë¡ Eden ììì í ë¹ëë¤. ì´ ìììì ë°ì´í°ê° ìì´ê² ëë©´ Survivor 0 ëë 1ë¡ ì´ëíê² ëê±°ë minor GCì ìí´ íìëë¤. Young generationìì ì¼ì Age bitì ëì ê°ì²´ë¤ì Old generationì¼ë¡ ì´ëëê±°ë íìëë¤. Old generationììë ë©ëª¨ë¦¬ê° ê°ëì°¨ê² ëë©´ major GC를 ì¤ííì¬ ë©ëª¨ë¦¬ë¥¼ íìíë¤. ### ì¤í ìì (Stack Area) ì§ìë³ì, íë¼ë¯¸í°, ë¦¬í´ ê°, ì°ì°ì ì¬ì©ëë ìì ê°, ë©ìë í¸ì¶ ë± ììì ì¸ ë°ì´í°ë¤ì´ ìì±ëë ììì´ë©° Primitive Type ìë£íì ìì±í ë ì ì¥íë ê³µê°ì´ë¤. ì ì ë©ëª¨ë¦¬ í ë¹ì´ ì´ë£¨ì´ì§ë ì¥ìë¡ Heap ììì ëì í ë¹ë ê°ì ëí 참조를 ì»ì ì ìë¤. ex) Person p = new Person(); ìì Person pë Stack ìì, new Person();ì Heap ììì í ë¹ëë¤. ### PC ë ì§ì¤í° (PC Register) ì°ë ëê° ìì±ë ëë§ë¤ ìì±ëë ììì¼ë¡ **ì°ë ëë§ë¤ íëì©** ì¡´ì¬íë¤. íì¬ ì°ë ëê° ì¤íëë ë¶ë¶ì 주ìì ëª ë ¹ì ì ì¥íê³ ìë ììì´ë¤. ì´ê²ì ì´ì©íì¬ ì°ë ë를 ëìê°ë©´ì ìíí ì ìëë¡ íë¤. ### ë¤ì´í°ë¸ ë©ìë ì¤í (Native Method Stack) ìë° ìì¸ì ì¸ì´(C, C++, ì´ì ë¸ë¦¬ ë±)ë¡ ìì±ë ë¤ì´í°ë¸ ì½ë를 ì¤íí ë ì¬ì©ëë ë©ëª¨ë¦¬ ììì¼ë¡ ì¼ë°ì ì¸ C ì¤íì ì¬ì© ì¼ë°ì ì¸ ë©ìë를 ì¤ííë ê²½ì° JVM ì¤íì ìì´ë¤ê° í´ë¹ ë©ìë ë´ë¶ì ë¤ì´í°ë¸ ë°©ìì ì¬ì©íë ë©ìë(ì를 ë¤ë©´ Cì¸ì´ë¡ ìì±ë ë©ìë)ê° ìë¤ë©´ í´ë¹ ë©ìëë ë¤ì´í°ë¸ ì¤íì ìì¸ë¤. ## í´ëì¤ ë¡ë©(Class loading) * Javaìì í´ëì¤ê° ë¡ë©ëë ê³¼ì ì í´ëì¤ ë¡ëê° íì¥ìê° .class í´ëì¤ íì¼ì ìì¹ë¥¼ ì°¾ì ê·¸ê²ì JVMìì ì¬ë ¤ëë ê³¼ì ì ë§íë¤. * ìë°ë í´ëì¤ íì¼ì **ëì ì¼ë¡ ì½ì´ì¨ë¤.** JVMì´ ëìíë¤ê° í´ëì¤ íì¼ì 참조íë ìê° ëì ì¼ë¡ ì½ì´ì ë©ëª¨ë¦¬ì ë¡ëëë©´ì JVMì ë§í¬ëë¤. ìë° í´ëì¤ë¡ëë í´ëì¤ë¥¼ ëì ì¼ë¡ ë©ëª¨ë¦¬ì ë¡ë©íë ìí ì ë´ë¹íë¤. ### í´ëì¤ ë¡ëë  í´ëì¤ ë¡ëìë ë¡ë©, ë§í¬, ì´ê¸°í ë¨ê³ë¡ ëëì´ì ¸ ìë¤. * ë¡ë© * ìë° ë°ì´í¸ ì½ë(.class)를 ë©ìë ììì ì ì¥íë¤. * ê° ìë° ë°ì´í¸ ì½ë(.class)ë JVMì ìí´ ë©ìë ììì ë¤ì ì ë³´ë¤ì ì ì¥íë¤. 1. ë¡ëë í´ëì¤ë¥¼ ë¹ë¡¯í ê·¸ì ë¶ëª¨ í´ëì¤ ì ë³´ 2. í´ëì¤ íì¼ê³¼ Class, Interface, Enumì ê´ë ¨ ì¬ë¶ 3. ë³ìë ë©ìë ë±ì ì ë³´ * ë§í¬ * ê²ì¦ : ì½ì´ë¤ì¸ í´ëì¤ê° ìë° ì¸ì´ì ëª ì¸ ë° JVM ëª ì¸ì ëª ìë ëë¡ ì 구ì±ëì§ íì¸íë¤. * ì¤ë¹ : í´ëì¤ê° íìë¡íë ë©ëª¨ë¦¬ë¥¼ í ë¹íê³ , í´ëì¤ìì ì ìë íë, ë©ìë, ì¸í°íì´ì¤ë¥¼ ëíë´ë ë°ì´í° 구조를 ì¤ë¹íë¤. * ë¶ì : ì¬ë³¼ë¦ ë©ëª¨ë¦¬ ë í¼ë°ì¤ë¥¼ ë©ìë ììì ìë ì¤ì ë í¼ë°ì¤ë¡ êµì²´íë¤. * ì´ê¸°í * í´ëì¤ ë³ìë¤ì ì ì í ê°ì¼ë¡ ì´ê¸°í íë¤. ì¦, static íëë¤ì´ ì¤ì ë ê°ì¼ë¡ ì´ê¸°ííë¤. ### í´ëì¤ ë¡ëì ì¢ ë¥  í´ëì¤ ë¡ëë ê³ì¸µì ì¼ë¡ 구ì±ëì´ ìë¤. > ê³ì¸µì 구ì±ì ì´ì > > * 모ëíê° ê°ë¥ > * ì¶©ëì í¼í ì ìì > * í¨ì¨ì ì¸ ì¬ì© ê°ë¥ #### ë¶í¸ì¤í¸ë© í´ëì¤ ë¡ë(Bootstrap Class Loader) JVM ìì ì ê°ì¥ ìµì´ë¡ ì¤íëë í´ëì¤ ë¡ëì´ë¤. ë¶í¸ì¤í¸ë© í´ëì¤ ë¡ëë ìë° í´ëì¤ë¥¼ ë¡ëíë ê²ì´ ìë, ìë° í´ëì¤ë¥¼ ë¡ëí ì ìë ìë° ìì²´ì í´ëì¤ ë¡ëì ìµìíì ìë° í´ëì¤(java.lang.Object, Class, ClassLoader)ë§ ë¡ëíë¤. **Java 8** * e/lib/rt.jar ë° ê¸°í íµì¬ ë¼ì´ë¸ë¬ë¦¬ì ê°ì JDKì ë´ë¶ í´ëì¤ë¥¼ ë¡ëíë¤. **Java 9 ì´í** * ë ì´ì /re.jarì´ ì¡´ì¬íì§ ìì¼ë©°, /lib ë´ì 모ëíëì´ í¬í¨ëë¤. ì´ì ë ì ííê² ClassLoader ë´ ìµìì í´ëì¤ë¤ë§ ë¡ëíë¤. #### íì¥ í´ëì¤ ë¡ë(Extension Class Loader) íì¥ í´ëì¤ ë¡ëë ë¶í¸ì¤í¸ë© ë¡ë를 ë¶ëª¨ë¡ ê°ë í´ëì¤ ë¡ëë¡ì, íì¥ ìë° í´ëì¤ë¤ì ë¡ëíë¤. java.ext.dirs íê²½ ë³ìì ì¤ì ë ëë í 리ì í´ëì¤ íì¼ë¤ì ë¡ëíê³ , ì´ ê°ì´ ì¤ì ëì´ ìì§ ìì ê²½ì° ${JAVA_HOME}/jre/lib/extì ìë í´ëì¤ íì¼ì ë¡ëíë¤. **Java 8** * URLClassLoader를 ììíë©°, jre/lib/ext ë´ ëª¨ë í´ëì¤ë¥¼ ë¡ëíë¤. **Java 9 ì´í** * Platform Loaderë¡ ë³ê²½ëìì¼ë©°, URLClassLoaderê° ìë BuiltinClassLoader를 ììíë¤. Inner Static í´ëì¤ë¡ 구íëì´ ìë¤. #### ìì¤í í´ëì¤ ë¡ë ìë° íë¡ê·¸ë¨ ì ì§ì í ClassPathì ìë í´ëì¤ íì¼ ëë jarì ìí í´ëì¤ë¤ì ë¡ëíë¤. ì½ê² ë§íìë©´ ì°ë¦¬ê° ë§ë class íì¥ì íì¼ì ë¡ëíë¤. ### í´ëì¤ ë¡ë ê³¼ì  System Loaderê° í´ëì¤ë¥¼ ë¡ë©í ë ê·¸ ë¡ë© ìì²ì ë¶ëª¨ ë¡ëë¤ë¡ ê±°ì¬ë¬ ì¬ë¼ê°ì ë¶í¸ì¤í¸ë© ë¡ëì ë¤ë¤ë¥¸ ë¤ ê·¸ ë°ì¼ë¡ ìì²ì ìííë ë°©ìì ì·¨íë¤. 1. JVMì ë©ìë ììì í´ëì¤ê° ë¡ëëì´ ìë ì§ íì¸íë¤. ë§ì¼ ë¡ëëì´ ìë ê²½ì° í´ë¹ í´ëì¤ë¥¼ ì¬ì©íë¤. 2. ë©ìë ììì í´ëì¤ê° ë¡ëëì´ ìì§ ìë 경구, ìì¤í í´ëì¤ ë¡ëì í´ëì¤ ë¡ë를 ìì²íë¤. 3. ìì¤í í´ëì¤ ë¡ëë íì¥ í´ëì¤ ë¡ëì ìì²ì **ìì**íë¤. 4. íì¥ í´ëì¤ ë¡ëë ë¶í¸ì¤í¸ë© í´ëì¤ ë¡ëì ìì²ì **ìì**íë¤. 5. ë¶í¸ì¤í¸ë© í´ëì¤ ë¡ëë ë¶í¸ì¤í¸ë© ClassPath(JDK/JRE/LIB)ì í´ë¹ í´ëì¤ê° ìëì§ íì¸íë¤. í´ëì¤ê° ì¡´ì¬íì§ ìë ê²½ì° íì¥ í´ëì¤ ë¡ëì **ìì²ì ë긴ë¤.** 6. íì¥ í´ëì¤ ë¡ëë íì¥ ClassPath(JDK/JRE/LIB/EXT)ì í´ë¹ í´ëì¤ê° ìëì§ íì¸íë¤. í´ëì¤ê° ì¡´ì¬íì§ ìë ê²½ì° ìì¤í í´ëì¤ ë¡ëì **ìì²ì ë긴ë¤.** 7. ìì¤í ë¡ëë ìì¤í ClassPathì í´ë¹ í´ëì¤ê° ìëì§ íì¸íë¤. í´ëì¤ê° ì¡´ì¬íì§ ìë ê²½ì° **ClassNotFoundException**ì ë°ììí¨ë¤. ### í´ëì¤ ë¡ëì ìì¹ 1. ìì(Delegation) - í´ëì¤ ë¡ë© ìì ì ìì í´ëì¤ì ìì 2. ê°ìì±(Visibility) - íì í´ëì¤ë¡ëë ìì í´ëì¤ë¡ëê° ë¡ëí í´ëì¤ì ë´ì©ì ë³¼ ì ìì§ë§ ê·¸ ë°ëë ë¶ê°ë¥íë¤. 3. ì ì¼ì±(Uniqueness) - íì í´ëì¤ë¡ëë ìì í´ëì¤ë¡ëê° ë¡ë©í í´ëì¤ë¥¼ ë¤ì ë¡ë©íì§ ìê² í´ì ì ì¼ì±ì ë³´ì¥íë¤. ### ëì í´ëì¤ ë¡ë© ìë°ì í´ëì¤ ë¡ë©ì í´ëì¤ ì°¸ì¡° ìì ì JVMì ì½ëê° ë§í¬ëê³ , ì¤ì ë°íì ìì ì ë¡ë©ëë ëì ë¡ë©ì ê±°ì¹ë¤. ë°íìì ëì ì¼ë¡ í´ëì¤ë¥¼ ë¡ë©íë¤ë ê²ì JVMì´ ë¯¸ë¦¬ 모ë í´ëì¤ì ëí ì 보를 ë©ìë ììì ë¡ë©íì§ ìë ë¤ë ê²ì ì미íë¤. ëì í´ëì¤ ë¡ë© ë°©ìì ëê°ì§ê° ìë¤. #### 1. ë¡ë íì ëì ë¡ë©(Load-time Dynamic Loading) ```java public class HelloWorld { public static void main(String[] args) { System.out.println("ìë íì¸ì!"); } } ``` ì ì½ëë ë¤ìê³¼ ê°ì´ ëìíë¤. 1. JVMì´ ììëê³ ë¶í¸ì¤í¸ë© í´ëì¤ ë¡ëê° ìì±ë íì 모ë í´ëì¤ê° ììë°ê³ ìë Object í´ëì¤ë¥¼ ì½ì´ì¨ë¤. 2. í´ëì¤ ë¡ëë ëª ë ¹ íìì ì§ì í HelloWorld í´ëì¤ë¥¼ ë¡ë©í기 ìí´, HelloWorld.class íì¼ì ì½ëë¤. 3. HelloWorld í´ëì¤ë¥¼ ë¡ë©íë ê³¼ì ìì íìí java.lang.Stringê³¼ java.lange.Systemì ë¡ë©íë¤. ì´ì²ë¼ íëì í´ëì¤ë¥¼ ë¡ë©íë ê³¼ì ìì ëì ì¼ë¡ ë¤ë¥¸ í´ëì¤ë ë¡ë©íë ê²ì **ë¡ë íì ëì ë¡ë©**ì´ë¼ê³ íë¤. #### 2. ë°íì ëì ë¡ë©(Run-time Dynamic Loading) ```java public class RuntimeLoading { public static void main(String[] args) { try { Class cls = Class.forName(args[0]); Object obj = cls.newInstance(); Runnable r = (Runnable) obj; r.run(); } catch (Exception e) { e.printStackTrace(); } } } ``` ì ì½ëìì Class.forNmae(className)ì íë¼ë¯¸í°ë¡ ë°ì classNameì í´ë¹íë í´ëì¤ë¥¼ ë¡ë©í íì ê°ì²´ë¥¼ ë°ííë©°, ë¤ìê³¼ ê°ì´ ëì * Class.forName() ë©ìëê° ì¤íë기 ì ê¹ì§ë RuntimeLoading í´ëì¤ìì ì´ë¤ í´ëì¤ë¥¼ 참조íëì§ ì ì ìë¤. * ë°ë¼ì RuntimeLoading í´ëì¤ë¥¼ ë¡ë©í ëë ì´ë¤ í´ëì¤ë ì½ì´ì¤ì§ ìê³ , RuntimeLoading í´ëì¤ì main() ë©ìëê° ì¤íëê³ Class.forName(args[0]) 를 í¸ì¶íë ìê°ì ë¹ë¡ì args[0] ì í´ë¹íë í´ëì¤ë¥¼ ë¡ë©íë¤. ì´ì²ë¼ í´ëì¤ë¥¼ ë¡ë©í ëê° ìë ì½ë를 ì¤ííë ìê°ì í´ëì¤ë¥¼ ë¡ë©íë ê²ì **ë°íì ëì ë¡ë©**ì´ë¼ê³ íë¤. **참조** https://velog.io/@shin_stealer/%EC%9E%90%EB%B0%94%EC%9D%98-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0 https://engkimbs.tistory.com/606 https://steady-coding.tistory.com/593