Java是程序設計語言
java也是一個shell命令,我們啓動Java程序用 java --setting xxxx.java 這個命令啓動JVM,setting是啓動這個JVM給的各種參數,比如內存,垃圾蒐集器等等等等,當然你不設置,sun給你了弄了些默認值,這些默認值很多會智能的根據你的機器來設置,有些你就要根據自己的需求自己琢磨了。
本文記錄JVM的一個重要部件:類加載器
當啓動JVM的時候,可以使用三個類加載器:引導(bootstrap)類加載器、擴展(extensions)類加載器、應用程序(application)類加載器。
1.引導類加載器僅僅負責加載核心的Java庫,e.g. java.*
, javax.*
, etc。這個類加載器,是JVM核心部分,是用native代碼寫成的。
2. 擴展類加載器負責加載擴展路徑下的代碼,一般位於<JAVA_HOME>/jre/lib/ext 或者通過java.ext.dirs 這個系統屬性指定的路徑下的代碼。這個類加載器是由sun.misc.Launcher$ExtClassLoader 實現的。
3.應用程序類加載器負責加載java.class.path(映射系統參數 CLASSPATH的值) 路徑下面的代碼,這個類加載器是由 sun.misc.Launcher$AppClassLoader 實現的,如果你接觸過JavaEE,你會發現tomcat會從什麼lib之類的目錄加載類,那是因爲tomcat搞了自己的類加載器,可看下圖:
當處理類加載器時,父委託模式是一個需要理解的關鍵概念。它規定:類加載器在加載自己的類之前,可以委託先加載父類。父類加載器可以是客戶化的類加載器或者引導類加載器。但是有一點很重要,類加載器只能委託自己的父類加載器,而不能是子類加載器(只能向上不能向下)。
如果應用程序類加載器需要加載一個類,它首先委託擴展類加載器,擴展類加載器再委託引導類加載器。如果父類加載器不能加載類,子類加載器就回在自己的庫中查找這個類。基於這個特性,類加載器只負責它的祖先無法加載的類。