JVM-类加载机制的那些事

首先抛出几个在学习中遇到的几个问题:

1、什么是类加载?类加载是在什么时候进行的?
2、什么是初始化?初始化是在什么时候尽心的?
3、什么是静态链接?什么是动态链接?又是在什么阶段发生的?
4、什么是符号引用?什么是直接引用?
5、类加载器是什么?都有哪些类加载器?
6、如何自定义一个类加载器?

	***首先***,在代码编译后,就会生成JVM能够识别的二进制字节流文件(*.class)。而JVM把Class文件中的类描述数据从文件加载到内存,并对数据进行校验、转换解析、初始化,使这些数据最终成为可以被JVM直接使用的Java类型,这个说来简单但实际复杂的过程叫做**JVM的类加载机制**。

在这里插入图片描述
加载:在磁盘上查找并通过IO load字节码文件,使用时在加载;
验证:校验字节码文件的正确性和安全性;
准备:给类的静态变量分配内存,然后赋予默认值;
解析:将符号引用替换为直接引用,也叫静态链接;(通过java反编译可以查看字节码文件)
初始化:给静态变量赋值,执行静态方法;
使用:……
卸载:……

一、类加载

说到类加载就不得不说类加载器了
首先说启动类加载器,他也是顶级的类加载器,第一个启动,主要加载jdk的核心类库,比如rt.jar charsets.jar等。启动类加载器由于是C语言实现的,所以java没办法打印出来。
扩展类加载器:加载jvm启东市所需要的扩展类库,都在jdk的ext目录下。

应用程序类加载器:加载classpath下所有的jar包;
在这里插入图片描述

还有一个最最最重要的,也是我们能自己操作的。------自定义类加载器:加载自定义的类包,
自定义类加载器需要继承ClassLoader.java,该类有两个核心方法,loadClass()和findClass();
说到loadClass方法就不得不说一下jvm的类加载机制了,
jvm类加载机制-双亲委派机制
通过检查是否加载过该类,如果有则直接返回,如果没有则调用parent.loadClass(String,false),如果一直到启动类加载器还没有找到的话则调用findClass(String)来完成该类的加载。就说这么多了,直接上代码吧
在这里插入图片描述

class MyClassLoader extends ClassLoader{
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        /*
        *  TODO 机会留给你们类,你们自由发挥,如果实在想看自定义类加载器的源码设计
        *       建议去看TOMCAT的源码
        */
        return super.findClass(name);
    }
}

类加载机制一直遵循一个原则,双亲委派原则,直接上图
在这里插入图片描述
图有点抽象,比如说自定义类加载器要去加载一个类,它首先会检索有没有加载过这个类,如果没有则会调用loadClass(String,false)向上一级委托,一次类推,如果父类还是没有则会调用findClass(String)完成类的加载。
为何么要这么做呢???
沙箱安全机制:安全问题,避免外部的程序串改jdk的核心类库,比如自己编写String.class之类的会加载失败。
避免类的重复加载:重复加载问题,比如说app类加载器已经加载了你写的AppTest,而你自定义了一个类加载器去加载你写的AppTest,会发现自定义类加载器不回生效,这也是避免了资源的浪费,写自定义类加载器的时候一定要注意这一点。
对了,还有动态链接没有解释,这个放在下次结合JVM一起说吧,那样更容易理解…
最近新推荐一本书,《码农的辛酸史》,看的一把鼻涕一把泪的,唉不说了,搞他在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值