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)
上一篇 2022年2月23日 下午6:00
下一篇 2022年2月23日 下午7:00


相关推荐

  • BeanUtils.copyProperties 详解

    BeanUtils.copyProperties 详解简介BeanUtils提供对Java反射和自省API的包装,其主要目的是利用反射机制对JavaBean的属性进行处理我们知道,一个JavaBean通常包含了大量的属性,很多情况下,对JavaBean的处理导致大量get/set代码堆积,增加了代码长度和阅读代码的难度用法BeanUtils是这个包里比较常用的一个工具类,这里只介绍它的copyProperties()方法,该方法定义如下:publicstaticvoidcopyProperties(Object

    2022年10月4日
    5
  • 深入浅出JMS(一)——JMS简单介绍

    深入浅出JMS(一)——JMS简单介绍

    2021年11月24日
    46
  • 保姆级教程:OpenClaw 本地 AI 助手安装、配置与钉钉接入全流程

    保姆级教程:OpenClaw 本地 AI 助手安装、配置与钉钉接入全流程

    2026年3月13日
    2
  • 解决 [HPM] Error occurred while trying to proxy request

    解决 [HPM] Error occurred while trying to proxy request之前 vue 运行访问接口本来没有问题的 今天突然访问老是出现这个问题 情况有四中情况 而我是我这边网络不稳定的原因 气气 第二个情况是因为代理的接口写错 第三个是端口被占用 第四个是 node 版本低的原因 下面来说说如何解决版本低这个问题 Node 版本更新 下载指定版本 msi 文件 安装到历史安装目录 即完成版本更新 这是 node 的官网 http nodejs cn download

    2026年3月19日
    2
  • php源码审计_静态代码审计

    php源码审计_静态代码审计最近在学PHP代码审计,那就将学习的笔记都整理一遍吧~前期准备:1、安装相关软件,如Sublimetext、 Notepad++、editplus、 Seay源代码审计系统等2、获得源码,可以到网上下载各种网站源码3、安装网站审计方法:通读全文法:麻烦但全面敏感函数参数回溯法:高效常用,Seay源代码审计系统定向功能分析法:主要根据程序的业

    2022年10月2日
    7
  • 笃志前行——一个四非一本院校计算机学子保研之路

    笃志前行——一个四非一本院校计算机学子保研之路之前看了许许多多保研经验帖 如今我也写下这篇文章 希望帮助到各位学弟学妹们 曾经的我是想出国的 但是有位学长 真的很感激他 帮了我很大忙 和我说复旦希望很大 因此在大三上就决定走保研这条路了 不过呢 我还是建议大家可以去美国还是去美国吧 我是因为从小就特别憧憬复旦 所以选择放弃出国了 这篇文章主要分为两个部分 一个是夏令营情况 一个是九推的情况 夏令营一般 5 月就要关注并报名和投材料了

    2026年3月19日
    1

发表回复

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

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