原文:https://blog.csdn.net/wy11933/article/details/80254223
1、根據JVM內存配置要求,為JVM申請特定大小的內存空間;
JVM啟動時按照其配置要求,申請一塊內存,並根據JVM規范和實現將內存划分為幾個區域。class二進制文件信息被放入“方法區”,對象實例被放入“java堆”等。關於JVM內存模型內容參考 JVM(一)JVM內存模型
2、創建一個引導類加載器實例,初步加載系統類到內存方法區區域中;
JVM申請好內存空間后,JVM會創建一個引導類加載器(Bootstrap Classloader)實例,引導類加載器是使用C++語言實現的,負責加載JVM虛擬機運行時所需的基本系統級別的類,如java.lang.String, java.lang.Object等等。 (這也是為什么我們不能自定義java.lang.String類)
引導類加載器(Bootstrap Classloader)會讀取{JRE_HOME}/lib下的jar包和配置,然后將這些系統類加載到方法區內。
引導類加載器將類信息加載到方法區中,以特定方式組織,對於某一個特定的類而言,在方法區中它應該有 運行時常量池、類型信息、字段信息、方法信息、類加載器的引用,對應class實例的引用等信息。
3、創建JVM 啟動器實例 Launcher,並取得類加載器 ClassLoader;
此時,JVM虛擬機調用已經加載在方法區的類sun.misc.Launcher 的靜態方法 getLauncher(), 獲取 sun.misc.Launcher 實例
4、使用上述獲取的 ClassLoader 實例加載我們定義的類;
通過 launcher.getClassLoader() 方法返回 AppClassLoader 實例,接着就是 AppClassLoader 加載 我們自定義類.
加載自己寫的類之前先要加載我們寫的類中用到的其他類。在 org.luanlouis.jvm.load.Main 類被編譯成的class文件中有一個叫常量池(Constant Pool)的結構體,通過這個常量池中的 CONSTANT_CLASS_INFO 常量判斷該class用到了哪些類,並通過類加載器去加載這些類。
5、加載完成時候JVM會執行Main類的main方法入口,執行Main類的main方法;
6、結束,java程序運行結束,JVM銷毀。