深入理解JVM虚拟机笔记——类加载机制

深入理解JVM虚拟机笔记——类加载机制

boot类加载器:加载jre/lib 下的jar/class
ext类加载器:加载jre/lib/ext 下的jar/class
app类加载器:加载自己应用程序下的jar/class(如target编译文件目录)

为什么要设计双亲委派机制?
1:沙箱保护机制:比如自己写的java.lang.String不会生效
2:避免类的重复加载,保证了被加载类的唯一性(loadClass方法有做非空判断)

自定义类加载器:
只需要继承ClassLoad类重写findClass方法把自己的类库转为字节数组调用defineClass方法转为Class返回就好了,甚至可以重写loadClass打破双亲委派机制。

loadClass加载类时会做以下几个过程:
加载-验证-准备-解析-初始化

加载:把类通过io读入字节码文件,在堆中生成这个类的java.lang.Class到内存中

验证:校验字节码文件的正确性

准备:给静态变量赋默认值并分配内存。int默认值是0 对象默认值是null 布尔类型默认值是false

解析:把静态符号引用转换为直接引用(内存地址),比如a.hello() 这个a和 hello都是符号引用,这时会把hello转为直接引用(内存地址)这样就能找到这个hello()具体的代码从而去执行。

初始化:把静态变量赋指定值(这时赋的值才是我们程序员写的值)然后执行静态代码块。

类被加载后会把一系列的信息放到方法区(如运行时常量池,方法信息,字段信息,类加载器的引用,对应class实例的引用)
class实例的引用指的是被加载类会实例出java.lang.Class的对象实例到堆中。作为方法区类定义的入口

总结

类加载运行全过程:
首先windows系统下java.exe调用jvm.dld文件创建java虚拟机(c++实现),jvm会创建好boot类加载器,然后创建launcher实例,在launcher类构造方法中创建了两个类加载器,第一个是ext类加载器,第二个是app类加载器 得到classload,然后调用loadclass方法加载这个加载器下的所有类,loadclass方法首先会去判断有没有之前是不是已经加载过这个类,如果没有加载过就会去调用parent加载器也就是他的父类加载器ext,ext同样调用loadclass 然后又去找自己的parent加载器boot加载器。因为boot类加载器是最大的加载器没有父加载器了,所以会去判断这个加载器有没有这个类如果没有这个类就会再依次回到子加载器去加载这个类,如果子类加载器找到了这个类则调用findClass方法来完成类的加载。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值