jvmclass加载机制,描述一下jvm加载

jvmclass加载机制,描述一下jvm加载,一文读懂Jvm类加载机制

本文主要介绍了读取Jvm类加载的机制,通过示例代码介绍的非常详细,对于大家的学习或者工作都有一定的参考价值,有需要的朋友可以参考一下。

前言

一个月没更新了。这个月发生了太多的事情,大大降低了更新的频率。再怎么收拾心情,技术的研究也不能落下!

作为每个java程必须知道的知识,博主推荐一本书《深入理解Java虚拟机》。博主之前在学校看过几次,每看一次都有新的认识。工作一年多了,有必要总结一下~

什么是jvm

我们通常写信。java文件。我们如何将它们部署到机器上运行呢?通过jar包或war包,然后部署并运行。

如果您已经阅读了jar包的内容,您可以知道所有的。我们写的java文件已经编译成。类文件。

有一个重要的步骤3354编译:把我们写的程序翻译成jvm可以读取的文件格式。

值得注意的是,每个类都会被编译成一个. class文件,包括内部类等。也就是说,每。类文件只对应于我们代码中的一个类。

类的生命周期

一个类的生命周期从加载到jvm虚拟机的内存开始,可以分为:加载-验证-准备-解析-初始化-使用-卸载。

下面我们来逐一解释一下:

加载

当生成一个jar包时,我们编写的所有程序都被编译到。jvm可以读取的类格式。至此,是时候载入我们编译好的了。类文件加载到jvm中。至此,就有了“类加载器”的概念。如下图。

下一个问题,类装入器什么时候用jvm装入一个. class?也就是说什么时候加载一个类?

当jar包运行时,它将指定一个main()方法作为入口方法。首先,main()方法所在的类将被加载到jvm中,然后当代码执行遇到new时,对象将继续被加载到jvm中。

所以总而言之,当你需要在代码中使用这个类的时候,你会把它加载到jvm中。

确认

这个没必要理解太深。这是一个简单明了的事实。所有的猫狗都不能装入jvm,不然会很乱。所以这个阶段是验证是否加载。类文件符合指定的规则。

有趣的是。类文件是浪漫的,因为每个。类文件取8十六进制0CAFEBABE,翻译过来就是咖啡宝宝。很浪漫,对吧?验证阶段的第一步是检查。班级档案从咖啡宝贝开始。

准备

当我们合法地将一个. class文件加载到jvm中时,我们会在这个时候做一些准备工作。

首先,为这个类分配内存空间,然后为类变量(由static修饰的变量)赋一个默认的初始值。但是如果类变量同时被final修饰,那就不是初始值而是具体值了。

用下面两种情况来说明:

公共课学生{

私有静态int age=18

}

//此时,将为age变量分配内存空间,并将初始值0赋给它。

公共课学生{

私有静态最终int age=18

}

//age由final修饰,此时将为age变量分配内存空间,并为其赋值18。

所以我们的流程图可以更新为

解析

在解析阶段,jvm将常量池的符号引用替换为直接引用。

简单地说,在我们编写的代码中,当一个变量引用一个对象时,该引用作为一个符号引用存储在。类文件。在解析阶段,需要将其解析为直接引用。如果有直接引用,引用的目标必须已经存在于内存中。

所以我们的流程图可以更新为

初始化

在准备阶段,我们已经为加载到jvm中的类分配了内存空间,并为类变量赋予了初始值。

在初始化阶段,类中定义的java程序代码才真正开始执行。主要步骤如下:

给类的静态变量正确的初始值。

执行类的静态代码块。

从上到下依次运行类中的变量赋值语句和静态语句,只有当类或接口第一次被Java程序主动使用时才初始化。如果有父类,先依次运行父类中的变量赋值语句和静态语句。

所以我们的流程图可以更新为

总结

我们不能在静态方法中直接使用非静态变量。当我们使用静态方法时,我们只是初始化静态方法所在的类。此时只有静态变量赋值,非静态变量不赋值。因此,不能在静态方法中直接使用非静态变量。这是我的理解。如有错误,欢迎给我发消息或私信~

这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: