Java虚拟机中类加载机制详解

Java虚拟机中类加载机制详解

1,什么是java类加载机制

**首先在java中,是通过编译来生成.class文件(可能在本地,或者网页下载),java的类加载机制就是
将这些.class文件加载到我们的工作内存当中去,并为之生成Java.lang.Class对象
之后当我们启动jvm虚拟机的时候,会随之形成 “初始类加载层次结构” 初始类加载层次结构是由三个类加载器
组成如下图(依次继承的关系)

三个初始化类加载器

BootStarpClassLoader: 称为引导类加载器 底层是c语言实现的(无需深入),这个加载器的是非常特殊的,它实际上不是 java.lang.ClassLoader的子类,而是由JVM自身实现的。因为JVM在启动的时候就自动加载它们,所以不需要在系统属性CLASSPATH中指定这些类库
引导类加载器默认加载的就是我们JDK安装目录下的/JDK/jre/lib/rt.jar(rt就是运行时的jar)
而我们使用的myeclipse是自身集成的jar,我们可以换成我们JDK目录下的rt.jar ,这个jar 中包含的就是我们
常用的java.lang///java.io//的初始化类包

ExtClassLoader:称为扩展类加载器,主要加载的是jdk/jre/lib/ext目录下的jar。我们可以将自己写的类打成jar包放在这个目录下,之后什么路径什么的就无需我们操心了。扩展类加载器将自动将其加载到内存中,但是一定要注意(不要与已有的类重名,很危险),所以我们尽量不要去扩展这个目录下的jar!!!

AppClassLoader(SystemClassLoader)系统类加载器 ,这个类加载器加载的是CLASSPATH下(环境变量下)的所有的jar(默认我们自定义的类会调用这个类加载器)
例如:在我们的web项目中就是我们src目录下的jar或目录。

MyClassLoader:自定义类加载器,就是俺们自己写的类。

三个基础的类加载器各司其职:

例如我们在ExtClassLoader下随机找一个.class文件获取他的类加载器名称
这里写图片描述

下面就来说我们的我们类加载机制的一个重要的机制!!父类委托机制!!废话不说上图
有点蹩脚

父类委托机制,见名思意,就是子类委托爸爸类,我们来假设一种情况:我们自定义了一个Myclass类,这个类它自己本身不会去解析,而是让他的父类(AppClassLoaader)去解析也就是我们的第1个步骤, 但AppClassLoaader也不去解析继续往上传递,直到到达BootStarp这个最顶成类,它已经木有了父类,所以会到他的类包中去查找,也就是我们的4步骤。如果4步骤中还是没有找到的话就会到5步骤中然后在JRE/lib/*.jar去找,
这样一次类推下去,如果还是没找到!!最后就回到9步骤中抛出C我们常见lassNotFoundException异常,完美诠释了父类委托机制。
那么JVM中为什么会采用这种加载机制呢,相信大家已经有答案了。就是保证了我们的字节码文件只被加载一次!!!。

下面是Servlet的加载顺序。

首先加载我们D:\TomCat\apache-tomcat-zgj\webapps\llptBack\WEB-INF\classes的class目录下查找,
之后加载D:\TomCat\apache-tomcat-zgj\webapps\llptBack\WEB-INF\lib目录
在后才加载D:\TomCat\apache-tomcat-zgj\bin中的clsaa(servlet规范在这里)

来张图

这里写图片描述

假设有个类A继承B类,我们将其放在继承类加载器中。然后我们开始我们的父类委托机制。这里值得注意的是,我们先找的是A类!!!而不是父类B。然后我们按照红色的箭头依次向上寻找,假设当我们到红色3步骤时,找到了类A,之后就开始寻找父类B,(注意!!) 因为我们B是A的父类,所以不可能向子类寻找,只能在父类上寻找。所以为我们继续向上进行红色的1.2.3步骤。如何我们在红色123步骤中找到了最好。如果找不到就会截止到红色3步骤处
报出!!ClassNotFound异常。而不会向下继续执行!!!!*是一定不会向下执行!!!*
总之就是一条原则 寻找的父类!!绝不会在子类之下寻找。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值