JVM(持续更新)

一.架构图

① Java 源文件—->编译器—->字节码文件
② 字节码文件—->JVM—->机器码

灰色部分是线程共享的,红色部分是进程共享灰色部分是线程共享的,红色部分是进程共享
在这里插入图片描述
在这里插入图片描述

二.类加载器子系统

描述

在这里插入图片描述

  • 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识(CA FE BA BE)
  • ClassLoader只负class文件的加载,至于它是否可以运行则由ExcutionEngine决定
  • 加载的类信息存放于一块称为方法区的内存空问。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符申字而量和数宇常量《这部分常量信息是
    Class文件中常量池部分的内存映射)
  • mac查看步骤
  • cmd 输入 vim -b Main.class 会发现内容是乱码
  • 输入:%!xxd
    在这里插入图片描述
    在这里插入图片描述

类的加载过程

在这里插入图片描述

加载

加载

  1. 通过一个类的全限定名获取定义此谈的二进制字节流
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
  3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个头
    的各种数据的访问入口

连接

验证(Verify)

  • 目的在于确保class文件的字节流中包含信息符合当前虚拟机要求,确保被加载类的正确性,不会危害虚拟机的自身安全
  • 主要包含四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证

准备(Prepare)

  • 为类变量分配内存并设置该类的默认初始化值,即零值
  • 这里不包含final修饰的static,因为final在编译的时候就会分配了,准备阶段会显式初始化
  • 这里不会为实例变量分配初始化,类变量会分配到方法区中,而实例变量是会随着对象一起分配到JAVA堆中

解析(Resolve)

  • 将常量池内的符号饮用转换为直接引用的过程
  • 事实上,解释操作往往会伴随JVM在执行完初始化之后再执行
  • 符号引用就是一组符号来描述所引用的目标。符号引用的字面量形式明确定义在《java虛拟机规范》的C1ass文件格式中。直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄
  • 解析动作主要针对类或接口、宇段、类方法、接口方法、方法类型等。对应常量池中的CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等

初始化

初始化

  • 初始化阶段就是执行类构造器方法<clinit>()的过程
  • 此方法不需定义,是javac编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并而来的
  • 构造器方法中指令按语句在原文件中的顺序执行
  • <clinit>()不同于类的构造器(关联:构造器是虚拟机视角下的<init>())
  • 若该类具有父类,JVM会保证子类的<clinit>()执行前,父类的<clinit>()已执行完毕
  • 虚拟机必须保证一个类的<clinit>()方法在多线程下被同步加锁

idea安装在这里插入图片描述插件即可展示
//需要演示

类加载器的分类

  • JVM支持两种类型的类加载器,分别为引导类加载器(BootstrapClassLoader)和自定义类加载器(User-Defined ClassLoader)
  • 从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器
  • 无论类加载器的类型如何划分,在程序中我们最常见的类加载器始终是有三个,如图所示:

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

public class ClassloaderTest {
    public static void main(String[] args) {
        //获取系统类加载器
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        System.out.println(systemClassLoader); //sun.misc.Launcher$AppClassLoader@18b4aac2

        //获取其上层:扩展类加载器
        ClassLoader extClassLoader = systemClassLoader.getParent();
        System.out.println(extClassLoader); //sun.misc.Launcher$ExtClassLoader@1540e19d

        //获取其上层:获取不到引导类加载器
        ClassLoader bootstrapClassLoader = extClassLoader.getParent();
        System.out.println(bootstrapClassLoader); //null

        //对于用户自定义类来说:默认使用系统类加载器进行加载
        ClassLoader classLoader = ClassloaderTest.class.getClassLoader();
        System.out.println(classLoader); //sun.misc.Launcher$AppClassLoader@18b4aac2

        //String类使用引导类加载器进行加载的 --->Java核心类库都是引导类加载器加载的
        ClassLoader classLoader1 = String.class.getClassLoader();
        System.out.println(classLoader1); //null
    }
}

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

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

双亲委派机制

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

三.运行时数据区概述及线程

在这里插入图片描述
在这里插入图片描述
红色部分一个进程一份,灰色部分一个线程一份
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

程序计数器

介绍

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

说明

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

常见问题

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

虚拟机栈

虚拟机栈概述

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

栈的存储单位

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

局部变量表

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

关于Slot的理解

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

操作数栈

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

代码追踪

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

栈顶缓存技术

在这里插入图片描述

动态链接

方法调用:解析与分派

方法返回地址

一些附加信息

栈的相关面试题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值