计算机系统应用教程网站

网站首页 > 技术文章 正文

我的JAVA学习一:java的类加载机制

btikc 2024-09-08 12:00:05 技术文章 14 ℃ 0 评论

hello大家好,我是爱足球的程序员,新的一年,我将在头条上连载我的java学习之路,关于底层源码,源码这东西,说难不难,说简单也不简单,希望我能用我的理解给大家带来帮助,路过的各位,就点个关注吧!!!(跪求[可怜])

欢迎关注我的后续学习记录~

我们都知道,我们java项目的组成,到最基础部分,都是一个个的类、接口,那么这一个个的类,又是怎么加载启动的呢,这就要涉及到我们jvm的底层,关于java的类加载机制了,也就是我们今天所要讲的课题。


从上图我们可以看出,首先后缀为.java的文件,会被编译成.class文件,这个.class文件后面有时间我们可以进行探讨,是由字节码所构成的一个文件,通过这次编译 java文件就会编译成jvm虚拟机可以读取的文件,再通过classloader,也就是类加载器,将java类加载起来。

但是,java的类加载就这么简单吗?不,不是的,接下来就让我们来剖析关于java的类加载器


看上图,这就是大名鼎鼎的双亲委派机制的原理图,当一个java类进入,准备进行加载时,它是不会先自己去尝试加载的,也就是说,它第一步是委派给父类去完成,例如我现在要new一个Example类,这个Example是我们自定义的类,如果我们要加载这个Example类,我们根据图片可以知道,它就会先委派App ClassLoader,让父加载器去自己的缓存中群寻找,看有没有这个类,只有当父类加载器都反馈自己无法完成这个请求(也就是父类加载器都没有找到加载所需的Class)时,子类加载器才会自行尝试加载。

这样做的好处是,保证了我们java类在进行加载的同时,保障了运行时候的安全,当我们加载位于rt.jar包中的类时不管是哪个加载器加载,最终都会委托到BootStrap ClassLoader进行加载,这样保证了使用不同的类加载器得到的都是同一个结果。即,如果说,你自定义了一个java初始jar包的类的同名类,例如你自己定义了一个Integer类,假如没有双亲委派机制来进行,那么就会出现错误混乱,这是既浪费时间又没必要的事。


如图,双亲委派机制的流程图,如同一个圈圈一样,保证了我们在运行java文件时候的安全。

接着我们就来讲一个java面试常问的问题(简单的),一个java类的生命周期,类加载器,之前也提到了它是负责加载.class文件的,它们在文件开头会有特定的文件标示,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构,jvm所可以识别的内容,所以事实上ClassLoader只负责class文件的加载,而是否能够运行则由 Execution Engine 来决定

如图所示:从类被加载到虚拟机内存中开始,到释放内存总共有7个步骤:加载,验证,准备,解析,初始化,使用,卸载。其中验证,准备,解析三个部分统称为连接

在这其中,加载环节的作用是将class文件加载到内存,同时将类中的静态数据结构转化成方法区中运行时的数据结构,并且在堆中生成一个代表这个类的 java.lang.Class对象作为数据访问的入口,这里就涉及到我们java中最重要的jvm虚拟机的相关知识,我们也将会在后面中讲到,欢迎大家关注我嘎嘎。

而我们看到中间连接部分有三个组成部分:验证,准备,解析,其中验证作用是保证被校验类的方法在运行时不会做出危害虚拟机的事件,确保加载的类符合 JVM 规范和安全,简单来说,这其实就是一个安全检查

第二,准备:在这个阶段,jvm会为static变量在方法区中分配内存空间,设置变量的初始值,例如 static int b = 8 ,在这里我们要注意的点是,在准备阶段中,我们是只设置类中的静态变量将其放置至jvm的方法区中,但是却不包括实例变量(也就是即将会放置到堆内存的实例),因为我们要知道实例变量是对象初始化时赋值的。

第三,解析:虚拟机将常量池内的符号引用替换为直接引用的过程

在度过连接部分后,类进入到初始化状态,在初始化状态中,虚拟机会进行赋值操作,,它会执行一个类构造器的<clinit>()方法。由编译器自动收集类中所有变量的赋值动作,此时准备阶段时的那个 static int b =8 的例子,在这个时候就正式赋值为8

最后,在类被我们项目使用完之后,就会进入最后的卸载状态,通过我们虚拟机的垃圾回收,也就是我们俗称的GC,从虚拟机中被清除。


好了,我们本篇学习笔记就到这里结束了,欢迎大家评论区讨论,指出我的不足,下一篇我将进行jvm虚拟机的理解讲解,欢迎大家关注我,观看我的后续文章!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表