JVM加载Class文件的原理机制

1 转载地址:http://www.cnblogs.com/blogonfly/articles/3778426.html


http://blog.sina.com.cn/s/blog_63d45c1001013yob.html

1.java中的所以类,必须被加载到JVM中才能运行,这个加载是由类加载器完成的,类加载器所做的工作实质上是把类文件从硬盘读取到内存中

2.java中的类大致分为三种:
1、系统类
2、扩展类
3、程序员自定义的类
3.类加载的方式,两种
1、隐式装载,程序在运行过程中碰到new等方式生成对象时,隐式调用类加载器加载对应的类到JVM中
2,显示装载,通过class.forName()等方法,显示加载需要的类
4.类加载的动态性体现
一个应用程序总是由n多个类组成,java程序启动时,并不是一次性把全部的类加载后在运行的,它总是先把保证运行的基础类一次性加载到JVM中,其他的类等到JVM用到的时候再加载,这样节约内存开销,
5.java类装载器
java中的类装载器把类载入JVM中,值得注意的是JVM的类装载器有3个
Bootstrap ClassLoader - 负责加载系统类
|
--ExtClassLoader - 负责加载扩展类
|
-- AppClassLoader 负责加载应用类
 
三个类加载器一方面各自负责各自的区块,另一方方面实现委托模型
6.类加载器之间是如何协调工作的
碰到一个类需要加载时,java采用了委托模型机制,这个机制简单来讲,就是类装载器有载入类的需求时,会先请示器parent使用其搜索路径帮忙载入,如果parent找不到,那么才会自己依照自己的搜索路径搜索类。
下面举一个例子来说明,为了更好的理解,先弄清楚几行代码:
public class Test{
  
    public static void main(String[] arg){
  
      ClassLoader c  = Test.class.getClassLoader();  //获取Test类的类加载器
  
        System.out.println(c); 
  
      ClassLoader c1 = c.getParent();  //获取c这个类加载器的父类加载器
  
        System.out.println(c1);
  
      ClassLoader c2 = c1.getParent();//获取c1这个类加载器的父类加载器
  
        System.out.println(c2);
  
  }
  
}
运行结果:
sun.misc.Launcher$AppClassLoader@addbf1
  
sun.misc.Launcher$ExtClassLoader@42e816
null
可以看出Test是由AppClassLoader加载器加载的
AppClassLoader的Parent 加载器是 ExtClassLoader 但是ExtClassLoader的Parent为 null 是怎么回事呵,如果留意的话,前面有提到Bootstrap Loader是用C++语言写的,依java的观点来看,逻辑上并不存在Bootstrap Loader的类实体,所以在java程序代码里试图打印出其内容时,我们就会看到输出为null。
 
类加载器ClassLoader(抽象类)描述JVM加载class文件的原理机制
类装载器就是寻找类或接口字节码文件进行解析并构造JVM内部对象表示的组件,
装载类到JVM的步骤
1、装载:查找和导入class文件
2、连接:其中解析步骤是可选的
1)检查:检查载入的class文件数据的正确性
2)准备:给类的静态变量分配存储空间
3)解析:将符号引用转换成直接引用
3、初始化:对静态变量,静态代码块执行初始化
java装载类使用“全盘负责委托机制”:
是指一个ClassLoader装载一个类时,除非显示使用另一个ClassLoader,该类所依赖及引用的类也由这个ClassLoader载入。
“委托机制”是指先委托父类装载器寻找目标类,只有在找不到的情况下才从自己的路径中查找并载入。这一点是从安全的方面考虑的,试想一下如果有人写了一个恶意的基础类(如java.lang.String)并加载到JVM将引起严重后果,但是全盘负责制,java.lang.String永远是由根装载器来装载的,避免以上情况发生。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值