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

java类的生命周期

运行时常量池,类加载器的作用,多态的原理,类的加密和解密 

加载

1,类加载器根据类的全限名 通过不同渠道 以二进制流的方法获取字节码信息

2,加载完后,jvm会将字节码信息保存到方法区里

3,jvm在方法区里会生成一个instanceKlass对象,保存类的所有信息(基本信息,常量池,字段,方法,虚方法表(实现多态的基础))

4,还会在堆里生成一份与方法区中数据类似的java.lang.class对象,作用是在java代码中获取类的信息。方法区和堆里的信息相互关联。jdk8以后静态字段数据存储在栈里

为什么在内存和栈里都要创建一个对象保存类的数据??

instanceKlass是C++编写的,java不能直接操作,但是java.lang.class是java封装后的对象,代码好获取。java.lang.class剔除了instanceKlass中的一些信息,剔除了一些开发不用的信息。

类加载器

类加载器是一个负责加载类的对象,用于实现类加载过程中的加载这一步。

每个 Java 类都有一个引用指向加载它的 ClassLoader。

数组类不是通过 ClassLoader 创建的(数组类没有对应的二进制字节流),是由 JVM 直接生成的

链接

1,验证

校验字节码信息是否满足《java虚拟机规范》,不满足就滚。程序员不用参与

常见校验内容

  • 文件格式验证(Class 文件格式检查,校验文件开头)
  • 元数据验证(字节码语义检查,比如:类一定有父类)
  • 字节码验证(程序执行指令语义检查,比如:跳转的地方不能为空)
  • 符号引用验证(比如是否引用了其他类的private方法)

2,准备

给静态(static)变量赋初始值

为什么一开始有初始值??

因为怕原来的地址上有残留值

编译器认为你后面不会变了,就直接给赋值了 

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段

3,解析

解析阶段主要是将常量池中的符号引用替换为直接引用。虚拟机将常量池内的符号引用替换为指向内存的直接引用的过程。

符号引用就是在字节码文件中使用编号来访问常量池中的内容

符号引用:比如说#5

初始化

与程序员有关的阶段。给静态(static)变量赋最终值

执行静态代码块中的代码,并为静态变量赋值

从字节码角度分析就是执行了字节码文件中的clinit部分的字节码指令

当一个类编译为字节码文件,字节码文件的方法信息包括:init(构造方法),main方法,clinit(初始化阶段执行)。clinit方法中的执行顺序与java编写的顺序一致

类继承的情况:

数组的创建不会导致数组中元素的类进行初始化

final修饰的变量如果赋值的内容需要执行指令才能得到结果,会执行clinit方法进行初始化

相关文章:

  • 【请关注】VC内存泄露的排除及处理
  • 基于wifi的室内定位算法设计与实现
  • 双周报Vol.73:移除使用方法实现 trait 、新增了 “错误多态” 功能、.语法支持使用 _ 的匿名函数...
  • 系统思考:短期利益与长期系统影响
  • vue实现点击单选或者多选模式
  • 力扣刷题 -- 225. 用队列实现栈
  • Matplotlib + Seaborn绘图类型清单
  • Java对象比较与排序的常见错误及解决方案
  • Unity异常上报飞书工具
  • ADI硬件笔试面试题型解析下
  • 【macbook】触控板手势
  • 词语翻译的三步法与背后的语言学思维
  • RPG20.创建敌人的初始能力和加载武器
  • MYSQL索引详解及索引优化、分析
  • 乐播视频v4.0.0纯净版体验:高清流畅的视听盛宴
  • C++ TCP传输心跳信息
  • 线性动态规划
  • Java面试八股--07-项目篇
  • AI“实体化”革命:具身智能如何重构体育、工业与未来生活
  • 数据库包括哪些?关系型数据库是什么意思?
  • 做宽带销售网站/推广软文模板
  • 个人网站建立 学生/网推
  • 什么网站做的很好/泉州百度推广排名优化
  • 做视频解析网站犯法吗/舆情服务网站
  • 建筑室内设计软件/盐城seo营销
  • 聊城网站建设动态/郴州seo快速排名