Java虚拟机类加载机制浅谈

发表于:2013-6-19 09:47

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:zhao_xiao_long    来源:51Testing软件测试网采编

  二、类加载器

  1、类加载器的分类

  启动类加载器(Bootstrap ClassLoader):  主要负责加载<JAVA_HOME>\lib目录中的,或是-Xbootclasspath参数指定的路径中的,并且可以被虚拟机识别(仅仅按照文件名识别的)的类库到虚拟机内存中。它加载的是System.getProperty("sun.boot.class.path")所指定的路径或jar。

  扩展类类加载器(Extension ClassLoader):主要负责加载<JAVA_HOME>\lib\ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库。它加载的是

  System.getProperty("java.ext.dirs")所指定的路径或jar。

  应用程序类加载器(Application ClassLoader):也叫系统类加载器,主要负责加载ClassPath路径上的类库,如果应用程序没有自定义自己类加载器,则这个就是默认的类加载器。

  它加载的是System.getProperty("java.class.path")所指定的路径或jar。

  2、类加载器的特点

  1)运行一个程序时,总是由Application Loader(系统类加载器)开始加载指定的类。

  2)在加载类时,每个类加载器会将加载任务上交给其父,如果其父找不到,再由自己去加载。

  3)Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为null.

  3、类加载器的双亲委派模型

  类加载器双亲委派模型的工作过程是:如果一个类加载器收到一个类加载的请求,它首先将这个请求委派给父类加载器去完成,每一个层次类加载器都是如此,则所有的类加载请求都会传送到顶层的启动类加载器,只有父加载器无法完成这个加载请求(即它的搜索范围中没有找到所要的类),子类才尝试加载。

  下面是一个类加载器双亲委派模型,这里各个类加载器并不是继承关系,它们利用组合实现的父类与子类关系。

  4、类加载的几种方式

  1)命令行启动应用时候由JVM初始化加载,加载含有main的主类。

  2)通过Class.forName()方法动态加载类,默认会执行初始化块。如果指定了ClassLoader,则不会执行初始化块。

  3)通过ClassLoader.loadClass()方法动态加载类,不会执行初始化块。

  5、类加载实例

  当在命令行下执行:java HelloWorld(HelloWorld是含有main方法的类的Class文件),JVM会将HelloWorld.class加载到内存中,并在堆中形成一个Class的对象HelloWorld.class。

  基本的加载流程如下:

  1)寻找jre目录,寻找jvm.dll,并初始化JVM;

  2)产生一个Bootstrap Loader(启动类加载器);

  3)Bootstrap Loader自动加载Extended Loader(标准扩展类加载器),并将其父Loader设为BootstrapLoader。

  4)Bootstrap Loader自动加载AppClass Loader(系统类加载器),并将其父Loader设为ExtendedLoader。

  5)最后由AppClass Loader加载HelloWorld类。

22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号