java class加载机制及对象生成机制

java class加载机制及对象生成机制

大家好,又见面了,我是全栈君。

java class加载机制及对象生成机制

当使用到某个类,但该类还未初始化,未加载到内存中时会经历类加载链接初始化三个步骤完成类的初始化。需要注意的是类的初始化和链接的顺序有可能是互换的。

ClassLoader加载机制

ClassLoader用于动态加载class文件到内存中。

Java 提供了三个ClassLoader:

  • 启动类加载器(BootStrap ClassLoader):java类加载器中最顶层的类加载器,负责加载jdk中核心的类库,如:rt.jar、resources.jar、charsets.jar等。
    可通过System.out.println(System.getProperty("sun.boot.class.path"));查看。
  • 扩展类加载器(Extension ClassLoader):负责加载java的扩展类库,默认加载:JAVA_HOME/jre/lib/ext目录下的jar。
  • 系统类加载器(App ClassLoader):负责加载应用程序classpath下的所有jar和class文件。
  • 自定义类加载器(CustomClassLoader):自定义类加载器必须继承自java.lang.ClassLoader

ClassLoader加载类的原理

  • 首先由最顶层的类加载器Bootstrap ClassLoader试图加载
  • 如果没加载到,则把任务转交给Extension ClassLoader试图加载
  • 如果也没加载到,则转交给App ClassLoader 进行加载

JVM类加载机制

  • 全盘负责:当一个类加载某个class时,该class依赖的和引用的其它class都有该加载器负责加载,除非显式使用另外一个类加载器来载入。
  • 父类委托:先让父类试图加载该类,只有在父类无法加载该类时才从自己的类路径中进行加载。
  • 缓存机制:所有加载过的类都会缓存在内存中,如果程序中尝试使用某个class时,先从缓存中查找这个类;如果不存在,则读取该类对应的二进制文件并将其转换为class对象并存入缓存区。这就是为什么类修改后需要重启的原因。

双亲委派模型的工作过程

  • 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的加载器都是如此,因此所有的类加载请求都会传给顶层的启动类加载器。
  • 只有当父加载器反馈自己无法完成该加载请求(该加载器的搜索范围中没有找到对应的类)时,子加载器才会尝试自己去加载。

使用双亲委派模型的优点:

  • 保证了类加载的唯一性
  • 避免应用程序出现混乱

类的链接

当类加载完成后,系统会给为之生成一个对象;随后进入链接阶段,链接阶段负责把类的二进制数据添加到JRE中。

三个阶段:

  • 验证:检验被加载的类是否有正确的内部结构,并和其他类协调一致
  • 准备:负责为类的类变量分配内存。并设置默认初始值
  • 解析:将类的二进制数据中的符号引用替换成直接引用

类的初始化

JVM负责对类进行初始化,主要对类变量进行初始化

在Java中对类变量进行初始值设定有两种方式:

* 声明类变量是指定初始值
* 使用静态代码块为类变量指定初始值

JVM初始化步骤

  • 假如这个类还没有被加载和连接,则程序先加载并连接该类
  • 假如该类的直接父类还没有被初始化,则先初始化其直接父类
  • 假如类中有初始化语句,则系统依次执行这些初始化语句

参考文档:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108694.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c++中this指针的用法详解

    c++中this指针的用法详解为什么引入this指针?   最简单的应用场景就是:当我们在类中定义了一个变量,同时在类成员函数中定义了同一变量时,也就是说变量名重复时,但是我们想使用类中定义的变量,这个时候我们该怎么办呢?这个时候就是this指针大显身手的时候了。为此我们引入this指针的概念。1.this指针的用处:  一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this…

    2022年5月13日
    51
  • 网页设计css导航链接怎么做,如何用DIV+CSS制作导航条

    网页设计css导航链接怎么做,如何用DIV+CSS制作导航条一个蓝色主题的导航条布局案例,本CSS小实例,采用DIVCSS实现。同时不用图片做背景,直接使用背景色实现,鼠标经过悬停对应栏目名称是对应背景蓝色变深。一般导航条采用ulli列表布局,这里也不例外DIVCSS5实例也采用列表标签ulli+CSS布局。这样的导航条有以下二部分代码组成。1、CSS代码:ul#nav{width:100%;height:60px;background:#…

    2022年7月22日
    8
  • Vim命令合集

    Vim命令合集Vim命令合集命令历史以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令。启动vim在命令行窗口中输入以下命令即可vim直接启动vimvimfilename打开vim并创建名为filename的文件文件命令打开单个文件vimfile同时打开多个文件vimfile1file2file3..

    2022年6月2日
    41
  • linux中wq(linux a)

    LinuxESC:wq和:wq!的区别LinuxESC:wq和:wq!的区别发布者:IT人在线|发表时间:2018-12-417:20:43LinuxESC:wqesc(键退出)->:(符号输入)->wq(保存退出)wq(存盘并退出write%quite)即使文件没有被修改也强制写入,并更新文件的修改时间。:wq和:wq!的区别::wq(保存编辑操作退出)强…

    2022年4月11日
    117
  • pycharm 字体以及颜色修改「建议收藏」

    pycharm 字体以及颜色修改「建议收藏」 自处记录本人使用Pycharm时习惯用的代码风格以及左侧文件栏的字体大小。Pycharm代码风格修改如下图: Pycharm左侧工具栏字体大小相关设置:  

    2022年8月26日
    5
  • svn upgrade

    svn upgrade

    2021年10月29日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号