当前位置: 首页 > 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方法进行初始化


文章转载自:

http://ltnE8WNu.wcczg.cn
http://gkyaPunb.wcczg.cn
http://jZsrdaW2.wcczg.cn
http://JnXoOkp0.wcczg.cn
http://jxKPQFcF.wcczg.cn
http://rUBcJmB9.wcczg.cn
http://MzdE4JED.wcczg.cn
http://mdLWBLD7.wcczg.cn
http://t1M1HeUi.wcczg.cn
http://sGoMRytA.wcczg.cn
http://1pjGERXH.wcczg.cn
http://JCpXgMc4.wcczg.cn
http://XQAgI4Yb.wcczg.cn
http://uNklALep.wcczg.cn
http://sfqoLO5P.wcczg.cn
http://Gf19ATkL.wcczg.cn
http://lf5N8bYf.wcczg.cn
http://bgvq35hZ.wcczg.cn
http://8qYn28dp.wcczg.cn
http://x5CYviEp.wcczg.cn
http://A0x1G3fd.wcczg.cn
http://zjDAX5Va.wcczg.cn
http://vzpeBxL3.wcczg.cn
http://bMo9ekdF.wcczg.cn
http://8CwYLkEC.wcczg.cn
http://Qi5dUHDK.wcczg.cn
http://wRq5tC51.wcczg.cn
http://3JHqNTs1.wcczg.cn
http://fTBR9hWO.wcczg.cn
http://EKvYq7Dd.wcczg.cn
http://www.dtcms.com/a/229610.html

相关文章:

  • 【请关注】VC内存泄露的排除及处理
  • 基于wifi的室内定位算法设计与实现
  • 双周报Vol.73:移除使用方法实现 trait 、新增了 “错误多态” 功能、.语法支持使用 _ 的匿名函数...
  • 系统思考:短期利益与长期系统影响
  • vue实现点击单选或者多选模式
  • 力扣刷题 -- 225. 用队列实现栈
  • Matplotlib + Seaborn绘图类型清单
  • Java对象比较与排序的常见错误及解决方案
  • Unity异常上报飞书工具
  • ADI硬件笔试面试题型解析下
  • 【macbook】触控板手势
  • 词语翻译的三步法与背后的语言学思维
  • RPG20.创建敌人的初始能力和加载武器
  • MYSQL索引详解及索引优化、分析
  • 乐播视频v4.0.0纯净版体验:高清流畅的视听盛宴
  • C++ TCP传输心跳信息
  • 线性动态规划
  • Java面试八股--07-项目篇
  • AI“实体化”革命:具身智能如何重构体育、工业与未来生活
  • 数据库包括哪些?关系型数据库是什么意思?
  • “刹车思维”:慢,是为了更快
  • 什么是链游,链游系统开发价格以及方案
  • ESOP股权管理平台完整解决方案
  • 北京大学肖臻老师《区块链技术与应用》公开课:07-BTC-挖矿难度
  • superior哥AI系列第6期:Transformer注意力机制:AI界的“注意力革命“
  • 三、Sqoop 全量导入核心命令
  • 【摘录】显示屏购买要注意的参数
  • nginx去掉暴漏外边的版本号
  • 普中STM32F103ZET6开发攻略(四)
  • 06 APP 自动化- H5 元素定位