从图中可以看到对于一个XXX.class文件 是由ClassLoader将其加载进内存的代码段 然后找到函数入口点 对于XXX.class文件中的所用到的yyy zzz类 则不是一次加载完毕,而是动态的加载即扫描到后才加载
对于上面提到的ClassLoader类加载器其实是非常重要的东西了解它有助于我们了解Jvm的执行过程
在控制台下当我们打入 java HelloWorld时会进行大致如下的工作:
1.找到jvm.dll 初始化JVM 我的电脑下的路径为:B:\Java\jdk1.7.0_45\jre\bin\jvm.dll
2.产生一个启动类加载器
3.启动类加载器自动加载一个标准扩展类加载器
4.启动类加载器自动加载一个系统类加载器
5.最后由系统类加载器加载我们的HelloWorld类
简单的过程大致如上
其中
1.启动类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的 貌似是c实现
而且固化在了JVM上了
2.扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类
3.系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类.一般来说,Java 应用的类都是由它来完成加载的.可以通过 ClassLoader.getSystemClassLoader() 来获取它
类加载器的委托加载原理,首先加载类一直交给父类加载器加载,一直提交到bootstrap,当父类加载器加载不到时,在一层层的返回给下一级加载器加载(不是Super,不是继承关系)
3.Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为null.
关于上述加载器的加载路径问题
在JVM源代码中这样写道:
static const char classpathFormat[] =
"%/lib/rt.jar:"
"%/lib/i18n.jar:"
"%/lib/sunrsasign.jar:"
"%/lib/jsse.jar:"
"%/lib/jce.jar:"
"%/lib/charsets.jar:"
"%/classes";
这就是Bootstrap加载路径
Extension ClassLoader用来加载扩展类,即/lib/ext中的类。
最后AppClassLoader才是加载Classpath的。
另外推荐一篇比较好的文章关于类器:
http://www.blogjava.net/jjshcc/archive/2011/12/27/367309.html