前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM的类加载机制

JVM的类加载机制

作者头像
Java学习录
发布2019-05-14 13:44:48
3670
发布2019-05-14 13:44:48
举报
文章被收录于专栏:Java学习录

在JVM中一个类的生命周期包括了:加载、验证、准备、解析、初始化、使用、卸载7个阶段,其中验证、准备和解析统称为连接

加载

加载是第一阶段,因为此时的虚拟机中还没有class的相关信息,必须将class文件加载到虚拟机中才能进行接下来的操作。加载的过程主要分为以下3个步骤:

  • 根据类的全限定名取得类的二进制流

注意这里指定的是类的二进制流而不是说.class文件,由此可知这是个典型的面向接口编程呀,基于这个机制,我们可以把类放在任何地方。比如:在核心代码从数据库中获取、动态代理生成的类、JSP等其他文件转换

  • 讲类的二进制流转化为方法区的运行时数据结构
  • 在堆中生成类对应的java.lang.Class对象

验证

验证阶段所做的操作类似于我们的一个接口接收到外部的请求之后首先需要做的事

  • 首先是格式验证
    • 文件是否以魔数0xCAFEBABE开头
    • 文件的版本号是否在当前虚拟机可处理的范围内
    • 常量池中的常量是否有不支持的常量
    • 等其他关于文件是否正确的验证
  • 接着是逻辑验证
    • 这个类是否有父类
    • 继承的父类是否是不允许被继承的,如final
    • 等其他是否符合Java语法规范的验证
  • 然后是安全性验证
    • 保证方法内的跳转语句不会跳转到方法外
    • 保证类型转换是有效的
    • 等其他可能危害虚拟机安全的验证
  • 最后是对引用内容验证
    • 引用的类是否存在
    • 对引用的类、方法、属性是否有权限访问
    • 等其他引用内容的验证

准备

准备阶段主要是为类变量分配内存并且设置初始值。这里有两个需要注意的地方:

  • 类变量是指static变量
  • 设置初始值是设置当前数据类型的零值,例如当前存在以下两个变量:
代码语言:javascript
复制
static int a=1static long b=2

它们的初始值其实是这样的:

代码语言:javascript
复制
a=0b=0L

而final类型的变量则没有这一步骤,设置初始值的时候跳过零值设置初始值

解析

解析阶段主要是将符合引用替换为直接引用

  • 符合引用是使用一组符合来描述所引用的目标,简单来说是一个假的地址,引用的目标可能还没加载到内存中
  • 直接引用则是一个直接指向目标的指针,真实的地址

解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用

初始化

初始化阶段主要是为类的静态变量(准备阶段涉及的变量)赋予正确的初始值

这里需要注意的是,初始化阶段不是紧跟着解析进行的,而是当对类的主动使用才引起的类的初始化。以下几种情况会引起类的初始化:

  • new关键字
  • static变量的get、set(final类型的不算)
  • static方法的调用
  • 执行构造方法
  • 反射
  • 初始化子类时会首先初始化父类
  • 被标示为启动类的类(Main方法所在的类)

不得不看

1.SpringCloud系列博客汇总

2.为啥一线大厂面试必问Redis,有啥好问的?

3.Java多线程面试必备基础知识汇总

4.Java集合源码分析汇总

5.Linux常用命令汇总

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档