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搞了自己的类加载器,可看下图:
当处理类加载器时,父委托模式是一个需要理解的关键概念。它规定:类加载器在加载自己的类之前,可以委托先加载父类。父类加载器可以是客户化的类加载器或者引导类加载器。但是有一点很重要,类加载器只能委托自己的父类加载器,而不能是子类加载器(只能向上不能向下)。
如果应用程序类加载器需要加载一个类,它首先委托扩展类加载器,扩展类加载器再委托引导类加载器。如果父类加载器不能加载类,子类加载器就回在自己的库中查找这个类。基于这个特性,类加载器只负责它的祖先无法加载的类。