IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【JVM类加载及字节码技术】类加载阶段——加载、链接(一) -> 正文阅读

[Java知识库]【JVM类加载及字节码技术】类加载阶段——加载、链接(一)

类加载

类的生命周期:加载->验证->准备->解析->初始化->使用->卸载

  • 加载阶段:加载
  • 链接阶段:验证,准备,解析
  • 初始化阶段:初始化,使用

1、加载

将类的字节码载入方法区(1.8后为元空间,在本地内存中)中,内部采用 C++ 的 instanceKlass 描述 java 类,它的重要 ?eld 有:

  • _java_mirror 即 java 的类镜像,例如对 String 来说,它的镜像类就是 String.class,作用是把 klass 暴露给 java 使用
  • _super 即父类
  • _?elds 即成员变量
  • _methods 即方法
  • _constants 即常量池
  • _class_loader 即类加载器
  • _vtable 虚方法表
  • _itable 接口方法

如果这个类还有父类没有加载,先加载父类,并且加载和链接可能是交替运行的

在这里插入图片描述

  • instanceKlass保存在方法区。JDK 8以后,方法区位于元空间中,而元空间又位于本地内存中
  • _java_mirror则是保存在堆内存中
  • InstanceKlass和*.class(JAVA镜像类)互相保存了对方的地址
  • 类的对象在对象头中保存了*.class的地址(也可以说是_java_mirror的地址)。让对象可以通过其,找到方法区(元空间)中的instanceKlass,从而获取类的各种信息。

2、链接

链接中包含,验证,准备,解析

2.1、验证

验证类是否符合 JVM规范,安全性检,有一个很有趣的就是,每个.class文件都很浪漫,因为每一个.class文件都是以8个十六进制的 0×CAFEBABE,翻译过来就是咖啡宝贝。浪漫吧?在验证阶段的第一步就是检查.class文件是否以咖啡宝贝来开头的。
在这里插入图片描述

2.2、准备

为 static 变量分配空间设置默认值

  • static变量在JDK 7以前是存储与instanceKlass末尾。但在JDK 7以后就存储在_java_mirror(类对象)末尾了。
  • static变量在分配空间和赋值是在两个阶段完成的。分配空间在准备阶段完成,赋值在初始化阶段完成。
  • 如果 static 变量是 ?nal 的基本类型,以及字符串常量,那么编译阶段值就确定了,赋值在准备阶段完成。
  • 如果 static 变量是 ?nal 的,但属于引用类型,那么赋值也会在初始化阶段完成。
    在这里插入图片描述
static int a;
    descriptor: I
    flags: (0x0008) ACC_STATIC

  static int b;
    descriptor: I
    flags: (0x0008) ACC_STATIC

  static java.lang.String c;
    descriptor: Ljava/lang/String;
    flags: (0x0008) ACC_STATIC

  static final java.lang.String d;
    descriptor: Ljava/lang/String;
    flags: (0x0018) ACC_STATIC, ACC_FINAL
    ConstantValue: String hello

  static final java.lang.Object e;
    descriptor: Ljava/lang/Object;
    flags: (0x0018) ACC_STATIC, ACC_FINAL

2.3、解析

将常量池中的符号引用解析为直接引用未解析时,常量池中的看到的对象仅是符号,未真正的存在于内存中。

public class Load2 {
   public static void main(String[] args) throws IOException, ClassNotFoundException {
      ClassLoader loader = Load2.class.getClassLoader();
      //只加载不解析
      Class<?> c = loader.loadClass("com.nyima.JVM.day8.C");
      //用于阻塞主线程
      System.in.read();
   }
}
class C {
   D d = new D();
}
class D {

}

打开HSDB

  • 可以看到此时只加载了类C
    在这里插入图片描述
  • 查看类C的常量池,可以看到类D未被解析,只是存在于常量池中的符号,单词为UnresolvedClass,未解析的类。
    在这里插入图片描述
  • 当将loadClass方法换成,new 调用的时候,类C会被解析,类D也会被解析,会将常量池中的符号引用解析为直接引用
public class Load2 {
   public static void main(String[] args) throws IOException, ClassNotFoundException { 
   
      new C();   //--------------->此处修改为new调用
      //用于阻塞主线程
      System.in.read();
   }
}
class C {
   D d = new D();
}
class D {
}

在这里插入图片描述
在这里插入图片描述


下一结:JVM类加载【二】

本博客总结自黑马JVM课程,黑马yyds。

总结

分析到这里流程图如下:
在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:22:29  更:2022-03-04 15:25:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:24:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码