JVM-Class文件加载过程

加载:从磁盘中加载class文件到内存中,生成class对象

链接:
1.验证 : 确保class文件中包含的信息符合当前虚拟机的要求
2.准备 : 为类变量分配内存并且设置该类变量的默认初始值,即为0(最终赋值是在init阶段)和静态代码块赋值。
这里不包括用final修饰得到statis变量(相当于常量了),在这个阶段是直接赋值了,不用到初始化阶段
3.解析 : 将常量池中的符号引用转换为直接引用的过程(主要针对接口,方法等调用的文件)(虚方法表的创建)

初始化:
1.初始化阶段是执行类构造器方法()的过程。
此方法不需要定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句 合并而来的。(只有有静态变量或者代码块,才会生成此方法)
2.构造器方法中指令按语句在源文件中出现的顺序执行。(关联:构造器是虚拟机视角下的<init>() 方法)
若该类具有父类,JVM会保证子类的<clinit>()执行前,父类的<clinit>()已经执行完毕
3.虚拟机必须保证一个类的()方法在多线程下被同步加锁(静态变量是多线程共享的)(单例模 式中的–饿汗模式)

加载器:
BoostrapClassloader启动类加载器 :
1.加载核心类库的 jre/lib/*
2.加载拓展类和应用程序类加载器,并为他们 指定他们的父类加载器
3.c和c++写的
||
||
ExtClassloader拓展类加载器:
1.虚拟机自带的加载器
2.java编写
3.继承于Classloader
4.加载路径:jre/lib/ext
||
||
ApplicationClassloader系统类加载器、应用程序类加载器:1.继承于Classloader
||
||
自定义加载器

获取加载类的方法:

//1.获取当前类的Classloader
clazz.getClassLoader()
//2.获取当前线程上下文的ClassLoader
Thread.currentThread().getContextClassLoader()
//3.获取系统的ClassLoader
ClassLoader.getSystemCLassLoader()
//4.获取调用者的CLassLoader
DriverManager.getCaller ClassLoader()

双亲委派机制:
1.如果一个类加载器收到了类加载请求,它不会自己先去加载,而是把这个请求委托给父类的加载器 去执行;
2.如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启 动类加载器
3.如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加 载器尝试自己去加载,这就是双亲委托模式。

好处:
1.避免重复加载类
2.保护程序安全,防止核心API被随意篡改(沙箱安全机制)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值