当前位置: 首页 > news >正文

原来Java类的加载过程是这样的?

如果大家对java架构相关感兴趣,可以关注下面公众号,会持续更新java基础面试题, netty, spring boot,spring cloud等系列文章,一系列干货随时送达, 超神之路从此展开, BTAJ不再是梦想!

架构殿堂

1.类的加载过程:加载-验证-准备-解析-初始化

2.加载阶段(加载阶段主要做三件事情):

(1).通过类的全限名来获取此类的二进制流。

(2).将这个字节流所代表的的今天存储结构转化为方法区中可运行的数据结构。

(3).在内存中生成一个代表这个类的java.lang.Class对象,作为方法区中这个类的各种数据结构的访问入口。

3.验证

为了确保Class文件中的字节流中包含的信息符合当前虚拟机的要求。

4.准备

(1).为类变量分配内存并设置类变量的初始值(这些变量所需要的内存将在方法去中进行分配),初始值是指0或者null,所以我们在声明一个类变量时不需要去附0值或附为null。

(2).注意不包括实例变量,实例变量将会在对象实例化时随着对象一起被分配在堆中。

(3).如果说被final修饰,则会直接赋值。

5.解析

将符号引用装换为直接引用的过程。

(1)符号引用:符号引用以一组符号来描述所应用的目标,符号可以是任意形式的字面量,只要使用时能够无歧义的定位目标即可。

(2)直接引用:可以是直接指向目标的指针,或者句柄。

6.初始化

(1)在此阶段才开始真正的执行java代码

(2)编译器会自动收集类中的类变量赋值语句与静态代码块语句合并生成一个方法(类构造器方法)。

(3)虚拟机会保证在自类的方法执行前,父类的方法已经执行完毕。

(4)虚拟机会保证一个类的()方法在所线程环境中被正确地加锁,同步。如果多个线程同时去初始化一个类,那么只要一个线程去执行类的()方法,其它线程都需要阻塞等待。

7.加载,验证,准备,初始化的顺序是确定的,而解析阶段是不一定的,解析阶段有可能发生在初始化之后与java中的运行时多态有关。

8.有一下几种情况需要对类进行初始化

(1)使用new实例化对象时,读取或设置一个类的静态字段时,调用一个类的静态方法时。

(2)使用java.lang.reflect包的方法对类进行反射调用时。

(3)当初始化一个类其父类还没有被初始化时。

(4)虚拟机启动时包含main()方法的那个类。

如果大家对java架构相关感兴趣,可以关注下面公众号,会持续更新java基础面试题, netty, spring boot,spring cloud等系列文章,一系列干货随时送达, 超神之路从此展开, BTAJ不再是梦想!

架构殿堂

相关文章:

  • 淘宝数据库OceanBase SQL编译器部分 源代码阅读--生成物理查询计划
  • 聊聊jvm几种垃圾收集器
  • 搭建 webpack + React 开发环境
  • jvm垃圾回收的过程
  • 到底什么是分布式锁,进程锁,线程锁
  • 晶振參数校定
  • 这样做能让nginx新能提升10倍
  • 查看项目错误信息
  • 简单说明String类为什么是final的
  • RocketMQ启动broker提示 错误:找不到或无法加载主类
  • CSS盒子模型
  • 总结HashMap和TreeMap的区别
  • Spring AOP中pointcut expression表达式解析 及匹配多个条件
  • typora+picgo+gitee,轻松搞定图片上传
  • 转载-C#事件的使用和讲解
  • 【React系列】如何构建React应用程序
  • 【剑指offer】让抽象问题具体化
  • centos安装java运行环境jdk+tomcat
  • in typeof instanceof ===这些运算符有什么作用
  • JavaScript设计模式系列一:工厂模式
  • MQ框架的比较
  • Python 反序列化安全问题(二)
  • ucore操作系统实验笔记 - 重新理解中断
  • 关于for循环的简单归纳
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 理解在java “”i=i++;”所发生的事情
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 正则表达式-基础知识Review
  • ​2020 年大前端技术趋势解读
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #stm32驱动外设模块总结w5500模块
  • (10)STL算法之搜索(二) 二分查找
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (day 12)JavaScript学习笔记(数组3)
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (五)关系数据库标准语言SQL
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • *Django中的Ajax 纯js的书写样式1
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Remoting学习笔记(三)信道
  • .NET 中的轻量级线程安全
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .stream().map与.stream().flatMap的使用
  • @Bean, @Component, @Configuration简析
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • []我的函数库
  • [20171113]修改表结构删除列相关问题4.txt