JVM1

1 java是如何調用main函數的

咱們知道JVM是由C/C++語言實現的,那麼JVM跟CLASS打交道則須要JNI(Java Native Interface)(JNI 使得Java虛擬機中的Java程序能夠調用本地應用/或庫,也能夠被其餘程序調用)這座橋樑,當咱們在命令行執行java時,由C/C++實現的java應用經過JNI找到了HelloWorld裏面符合規範的main方法,而後開始調用。咱們來看下java命令的源碼就知道了java

/*
* Get the application's main class.
*/
if (jarfile != 0) {
mainClassName = GetMainClassName(env, jarfile);
... ...
mainClass = LoadClass(env, classname);
if(mainClass == NULL) { /* exception occured */
... ...
/* Get the application's main method */
mainID = (*env)->GetStaticMethodID(env, mainClass, "main", "([Ljava/lang/String;)V");
... ...
{/* Make sure the main method is public */
jint mods;
jmethodID mid;
jobject obj = (*env)->ToReflectedMethod(env, mainClass, mainID, JNI_TRUE);
... ...
/* Build argument array */
mainArgs = NewPlatformStringArray(env, argv, argc);
if (mainArgs == NULL) {
ReportExceptionDescription(env);
goto leave;
}
/* Invoke main method. */
(*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs);

2 類加載器

操做系統層面:讀取文件到內存

上一節咱們留了一個核心的環節,就是JVM在執行類的入口以前,首先得找到類再而後再把類裝到JVM實例裏面,也便是JVM進程維護的內存區域內。咱們固然知道是一個叫作類加載器的工具把類加載到JVM實例裏面,拋開細節從操做系統層面觀察,那麼就是JVM實例在運行過程當中經過IO從硬盤或者網絡讀取CLASS二進制文件,而後在JVM管轄的內存區域存放對應的文件。咱們目前還不知道類加載器的實現,可是咱們從功能上判斷無非就是讀取文件(從硬盤或網絡)到內存,這個是很普通也很簡單的操做。設計模式

如從操做系統層面看的話,若是隻是加載,以上代碼就足以把類文件加載到JVM內存裏面了。可是結果就是亂糟糟的把一堆毫無秩序的類文件往內存裏面扔,沒有良好的管理也無法用,因此須要咱們須要設計一套規則來管理存放內存裏面的CLASS文件,咱們稱爲類加載的設計模式或者類加載機制,這個下文會重點解釋。網絡

類加載器分類

系統 or 自定義 名稱 做用 類加載器 類加載路徑 實現原理
系統默認加載器 Bootstrap class loader 啓動類加載器,加載JDK核心類 C/C++實現 /jre/lib */jre/lib/*.jar 本地方C++實現
系統默認加載器 Extensions class loader 擴展類加載器,加載JAVA擴展類庫 JAVA實現 /jre/lib/ext System.getProperty("java.ext.dirs"); **/jre/lib/ext: 擴展類加載器ExtClassLoader本質上也是URLClassLoader
系統默認加載器 System class loader 系統類加載器,加載應用指定環境變量路徑下的類 sun.misc.Launcher$AppClassLoader -classpath下面的全部類 系統類加載器AppClassLoader本質上也是URLClassLoader
系統默認加載器 自定義 內置類加載器只加載了最少須要的核心JAVA基礎類和環境變量下的類,可是咱們應用每每須要依賴第三方中間件來完成額外的業務,那麼如何把它們的類加載進來就顯得格外重要了。幸虧JVM提供了自定義類加載器,能夠很方便的完成自定義操做,最終目的也是把外部的類文件加載到JVM內存 自定義 把外部的類文件加載到JVM內存 經過繼承ClassLoader類而且複寫findClass和loadClass方法就能夠達到自定義獲取CLASS文件的目的
相關文章
相關標籤/搜索