JVM啟動過程


原文: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銷毀。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM