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

类加载过程

基本说明

反射机制是Java实现动态语言的关键,也就是通过反射实现类动态加载。

  1. 静态加载:编译时加载相关的类,如果没有则报错,依赖性太强
  2. 动态加载:运行时加载需要的类,如果运行时不用该类,即使不存在该类,也不会报错,降低了依赖性。

类加载时机

  1. 当创建对象时(new)  //静态加载
  2. 当子类被加载时,父类也加载  //静态加库
  3. 调用类中的静态成员时  //静态加载
  4. 通过反射  //动态加载

类加载过程

加载阶段

JVM在该阶段的主要目的是将字节码从不同的数据源(可能是 class文件、也可能是 jar包,甚至网络)转化为二进制字节流加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象。

链接阶段

  1. 验证:(1)、目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求。并且不会会危害虚拟机自身的安全。(2)、包括:文件格式验证(是否以魔数 oxcafebabe开头)、元数据验证、字节码验证和符号引用验证。(3)、可以考虑使用 -Xverify:none 参数来关闭大部分的类验证措施,缩短虚拟机类加载的时间。
  2. 准备:JVM会在该阶段对静态变量,分配内存并默认初始化(对应数据类型的默认初始值,如0、OL、null、false等)。这些变量所使用的内存都将在方法区中进行分配。
  3. 解析:虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程。

初始化阶段

  1. 到初始化阶段,才真正开始执行类中定义的Java程序代码,此阶段是执行<clinit>() 方法的过程。
  2. <clinit>() 方法是由编译器按语句在源文件中出现的顺序,依次自动收集类中的所有静态变量的赋值动作和静态代码块中的语句,并进行合并。
  3. 虚拟机会保证一个类的<clinit>() 方法在多线程环境中被正确地加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的<clinit>() 方法,其他线程都需要阻塞等待,直到活动线程执行<clinit>() 方法完毕

http://www.lryc.cn/news/61308.html

相关文章:

  • 【C/C++】C++11 无序关联容器的诞生背景
  • h264编码原理
  • 网络工程师经常搞混的路由策略和策略路由,两者到底有啥区别?
  • 高精度气象模拟软件WRF实践技术
  • 总结827
  • 还在发愁项目去哪找?软件测试企业级Web自动化测试实战项目
  • 总结下Spring boot异步执行逻辑的几种方式
  • 【开发日志】2023.04 ZENO----Composite----CompNormalMap
  • 春秋云境:CVE-2022-28525 (文件上传漏洞)
  • 【软件测试二】开发模型和测试模型,BUG概念篇
  • 短视频app开发:如何实现视频直播功能
  • [架构之路-174]-《软考-系统分析师》-5-数据库系统-7-数据仓库技术与数据挖掘技术
  • 销售高品质 FKM EPDM NBR 硅胶 O 形密封圈
  • Linux环境变量:不可或缺的系统组成部分
  • FFmpeg命令行解析
  • 机器学习——为什么逻辑斯特回归(logistic regression)是线性模型
  • 从输入URL到页面展示到底发生了什么
  • Qt connect传参方式及lambda函数传参方式详解
  • 如何在硬盘上恢复已经删除的照片?
  • Unity日记22(携程概念)
  • 01-Linux-磁盘分区与目录配置
  • 连接器信号完整性仿真教程 二
  • 基于深度学习的图片上色(Opencv,Pytorch,CNN)
  • Python爬虫
  • python基础案例题:进制转换、字符串加密的实现、猜拳游戏、多种方法计算π
  • Spring Boot入门与进阶
  • servlet(1)—javaEE
  • 定制 Jenkins 镜像说明
  • 【离散数学】测试五 图论
  • 根据cadence设计图学习硬件知识 day03 了解 一些芯片 和 数据手册下载的地方