JDK15类的后半生:准备、解析、初始化、卸载过程是什么

发布时间:2021-10-19 16:18:55 作者:iii
来源:亿速云 阅读:122

这篇文章主要介绍“JDK15类的后半生:准备、解析、初始化、卸载过程是什么”,在日常操作中,相信很多人在JDK15类的后半生:准备、解析、初始化、卸载过程是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JDK15类的后半生:准备、解析、初始化、卸载过程是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

准备

两个目标:

JDK15类的后半生:准备、解析、初始化、卸载过程是什么

案例

public static final int value = 123;

准备阶段后 value 的值为 0,而非 123,初始化后才为 123。

但若是被final修饰,若有初始值,则在编译阶段就会将初始值存入constantValue属性中,在准备阶段就将constantValue的值赋给该字段(此处将value赋为123)。

解析

把常量池中的符号引用转换成直接引用。

一组无歧义的符号来描述所引用的目标,与JVM的实现无关

直接指向目标的指针、相对偏移量、或是能间接定位到目标的句柄,和JVM实现相关

主要针对:类、接口、字段、类方法、接口方法、方法类型、方法句柄、调用点限定符。

初始化

真正开始执行类中定义的Java程序代码(或是字节码)。

类的初始化就是为类的static变量赋初始值,初始化阶段就是执行类构造器的过程。

若是接口

调用Classloader类的loadClass方法来装载一个类,并不会初始化这个类,不属于对类的主动使用

clinit()方法由编译器自动产生,收集类中static代码块中的类变量赋值语句和类中static变量的赋值语句:

在准备阶段,类中static变量已完成默认初始化

而在初始化阶段,clinit()方法对static变量进行显式初始化

类的初始化时机

Java程序对类的使用方式分为:

JVM必须在每个类或接口“首次主动使用”时才初始化它们,被动使用类不会导致类的初始化。

主动使用的场景

FAQ

public class Test {     static {         i = 0;         System.out.println(i); //编译失败:"非法向前引用"     }     static int i = 1; }

其他线程虽会被阻塞,只要有一个clinit()方法执行完,其它线程唤醒后不会再进入clinit()方法。同一个类加载器下,一个类型只会初始化一次。

类的卸载

当代表一个类的Class对象不再被引用,那么Class对象的生命周期就结束了,对应的在方法区中的数据也会被卸载。Jvm自带的类加载器装载的类,是不会卸载的,由用户自定义的类加载器加载的类是可以卸载的。

到此,关于“JDK15类的后半生:准备、解析、初始化、卸载过程是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. zookeeper,jdk,tomcat 在linux下的安装教程
  2. 如何使用jdk连接mysql

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jdk java

上一篇:如何理解C#Break ,Continue, Return

下一篇:如何理解JDK15类加载、验证、准备过程

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》