JVM-基础知识

这篇具有很好参考价值的文章主要介绍了JVM-基础知识。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JVM基础知识

JVM结构图

JVM-基础知识
JVM-基础知识

字节码文件

Java虚拟机不和包括Java在内的任何语言绑定,它只与字节码文件这种特定的二进制文件格式所关联.
Class文件结构不仅仅是JVM的执行入口,更是Java生态圈的基础和核心.

字节码文件内容是什么

字节码是一种二进制的类文件,他的内容是JVM指令,而不像C,C++经由编译器直接生成机器码(JIT后面进行了优化).

class文件编译器

分为前端编译器 就是javac(ecj,eclipse的增量编译器)编译器,他把咱们写的Java代码编译为字节码文件,还有后端的编译器就是JIT,运行时编译,能把字节码文件的执行命令再编译为native的本地执行代码,让运行效率更高(这也是Java说自己的运行效率基本等同于C语言的底气所在) 后面还有个aot提前编译

javac前端编译器的编译步骤

词法解析->语法解析->语义解析->生成字节码

哪些类型对应有class对象
  • class: 类对象都算,包括各种的内部类
  • interface: 接口
  • []: 数组
  • enum: 枚举
  • annotation: 注解
  • primitive type: 基本数据类型
  • void
字节码指令

是由一个字节长度的,代表着某种特定操作含义的操作码(opcode),以及跟随其后的零至多个代表此操作所需参数的操作数(operand)所构成.虚拟机中的许多指令并不包含操作数,只有一个操作码

字节码趣味题目
class文件结构
结构概述
  • 魔数
  • 每个class文件开头的4个字节的无符号整数称为魔数
  • 他的唯一作用是确定这个文件是否为一个能被虚拟机接受的有效合法的Class文件(魔数就是Class文件的标识符)
  • 魔数值固定为0xCAFFBABE不会改变
  • 之所以用魔数不用扩展名是出于安全方面的考虑(因为扩展名可以随意的更改)
  • Class文件版本
  • 排列在magic后的第5个和第6个字节所代表的含义就是编译的副版本号minor_version,而第7个和第8个字节就是编译的主版本号major_version
  • 验证字节码文件的主版本号和次版本号同样也是格式验证的任务之一,因为如果是高版本的JDK编译的字节码文件,自然不能在低版本的JVM中运行,否则JVM会抛出java.lang.UnsupportedClassVersionError异常
  • 常量池(一共是有21项,(其实大小是22,0表示不引用常量池))
  • constant_pool_count (常量池计数器):constant_pool_count的值等于常量池表中的成员数加1。常量池表的索引值只有在大于0且小于constant_pool_count时才会认为是有效的,对于long和 double类型有例外情况。
  • constant_pool [](常量池):constant_pool是一种表结构,以 1 ~ constant_pool_count - 1为索引。它包含class文件结构及其子结构中引用的所有字符串常量、类或接口名、字段名和其他常量。常量池中的每一项都具备相同的特征——第1个字节作为类型标记,用于确定该项的格式,这个字节称为tag byte (标记字节、标签字节)
  • 访问标识(或者说是标志)
  • 常量池后面就是访问标志,用两个字节来表示,其标识了类或者接口的访问信息,比如:该Class文件是类还是接口,是否被定义成public,是否是abstract,如果是类,是否被声明成final等等。
  • 类索引,父类索引,接口索引集合
  • 访问标志后的两个字节就是类索引;
  • 类索引后的两个字节就是父类索引;
  • 父类索引后的两个字节则是接口索引计数器。
  • 通过这三项,就可以确定了这个类的继承关系了。
  • 字段表集合(字段表用来描述类或者接口中声明的变量。这里的字段包含了类级别变量以及实例变量,但是不包括方法内部声明的局部变量)
  • fields_count (字段计数器): fields_count的值表示当前class文件fields表的成员个数。fields表中每个成员都是一个field_info结构,用于表示该类或接口所声明的类字段或者实例字段。
  • fields [](字段表): fields表中的每个成员都必须是一个fields_info结构的数据项,用 于表示当前类或接口中某个字段的完整描述。fields表描述当前类或接口声明的所有字段,但不包括从父类或父接口继承的那些字段。
  • 方法表集合(指向常量池索引集合,它完整描述了每个方法的签名,如果这个方法不是抽象的或者不是native的,那么字节码中会体现出来。)
  • methods_count (方法计数器):methods_count的值表示当前class文件methods表的成员个数。methods 表中每个成员都是一个method_info结构。
  • methods [](方法表):methods表中的每个成员都必须是一个method_info结构,用于表示当前类或接口中某个方法的完整描述。如果某个method_info结构的access_ flags项既没有设置 ACC_NATIVE 标志也没有设置ACC_ABSTRACT标志,那么该 结构中也应包含实现这个方法所用的Java虚拟机指令。
  • method_info 结构可以表示类和接口中定义的所有方法,包括实例方法、类方法、 实例初始化方法和类或接口初始化方法。methods表只描述当前类或接口中声明的方法,不包括从父类或父接口继承的方法。
  • 属性表集合(不同值的集合,它提供了额外的关于这个类的信息,包括任何带有RetentionPolicy.CLASS 或者RetentionPolicy.RUNTIME的注解)
  • attributes_count (属性计数器):attributes_count的值表示当前class文件属性表的成员个数。属性表中每一项都是一个attribute_info结构。
  • attributes [](属性表):属性表的每个项的值必须是attribute_info结构
class结构图标示意
访问标识表
标志名称 标志值 含义
ACC_PUBLIC 0x0001 是否为public类型
ACC_FINAL 0x0010 是否被声明为final,只有类可以设置
ACC_SUPER 0x0020 是否允许使用invokespecial字节码指令的新语义,jdk1.0.2之后编译出来的类这个标志默认为真
ACC_INTERFACE 0x0200 标志这个一个接口
ACC_ABSTRACT 0x0400 是否为abstract类型,对于接口和抽象类来说,此标志值为真,其他的为假
ACC_SYNTHETIC 0x1000 标志这个类并非由用户代码产生
ACC_ANNOTATION 0x2000 标志这是一个注解
ACC_ENUM x4000 标志这是一个枚举
字段表访问标志

JVM-基础知识

方法表访问标志

JVM-基础知识

方法表结构

JVM-基础知识

类的加载过程

JVM-基础知识

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

类模板对象就是Java类在jvm当中的一个快照,jvm将从字节码文件中解析出的常量池,类字段,类方法等信息存储到类模板中,这样jvn在运行期间便能通过类模板获取java类中的任意信息,能够对Java的类成员变量遍历,也能调用方法.
反射的机制就是基于这一基础

jdk1.8之前存储在永久代 1.8以后存储在元空间

二进制流的获取方式
  • 通过文件系统读入class扩展名文件
  • 读入jar,war,zip等归档数据包
  • 数据库中读取类的二进制数据
  • 通过http请求远程的信息
  • 运行时直接生成一段class的二进制信息
数组类的加载

它比较特殊,因为数组类本身并不是由类加载器去创建的,而是由jvm在运行时根据需要而直接创建的,但是数组的元素类型仍然需要依靠类加载器去创建,过程如下:

  • 如果数组的元素类型是引用类型,那么就遵循定义的加载过程递归加载和创建数组的元素类型
  • jvm使用指定的元素类型和数组纬度来创建新的数组类
  • 如果数组类的元素类型是引用类型,数组类的可访问性就由数组元素的可访问性决定,否则数组的可访问性将被缺省定义为public
Linking(链接)阶段
  • 验证(Verify,保字节码是合法合理并且符合规范的)
  • 目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身安全。
  • 主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证。
  • 准备(Prepare):
  • 为类的静态变量分配内存,并将其初始化为默认值.
  • 这里不包含用final修饰的static,因为final在编译的时候就会分配了,准备阶段会显式初始化;
  • 这里不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中。

Java并不支持boolean类型,对于boolean类型,内部实现是int,由于int的默认值是0,所以boolean的默认值就是false

解析(Resolve)阶段
  • 将常量池内的符号引用转换为直接引用的过程。
  • 事实上,解析操作往往会伴随着JVM在执行完初始化之后再执行,符号引用就是一组符号来描述所引用的目标。符号引用的字面量形式明确定义在《java虚拟机规范》的Class文件格式中。在解析阶段,jvm根据字符串的内容找到内存区域中相应的地址,然后把符号引用替换成直接指向目标的指针、句柄、偏移量等,这些直接指向目标的指针、句柄、偏移量就被成为直接引用。
  • 解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等。对应常量池中的CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等。
设置栈的大小

现在默认是1Mb大小(不宜设置的过大),用**-Xss size(即 -XX:ThreadStackSize)**来设置,一般默认为512-1024k,取决于操作系统,栈的大小决定了函数调用的最大可达深度

初始化阶段

简单来说就是给类的静态变量赋予正确的初始值文章来源地址https://www.toymoban.com/news/detail-470987.html

到了这里,关于JVM-基础知识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深度学习 yolov5等结构图

    今天整理文件时看到自己之前用PPT画的一些结构图,可能也许会有人用得上,就上传上来吧哈哈哈别说这些图画起来还挺费时的,放上PPT版链接可以根据自己的需求更改。 如果有时间的话还是自己动手画一画,画的过程也可以加深对网络结构的理解。 PPT版网盘链接:提取码

    2023年04月24日
    浏览(41)
  • 一些HTTP、TCP、IP、以太报文结构图

    都是我在学习时候整理的一些报文结构,单独的各图例如下: 模型、URL HTTP 报文 IP 报文 以太网报文 如果图中有错误或希望更多的图例,评论或私聊告诉我就好,我之后再完善上

    2024年01月17日
    浏览(35)
  • yolov7论文学习——创新点解析、网络结构图

    1、提出了E-ELAN,但是只在yolov7-e6e中使用到。 2、yolov7基于拼接模型的缩放方法,在yolov7x中使用到。 3、将重参数化卷积应用到残差模块中或者用到基于拼接的模块中去。RepConvN 4、提出了两种新的标签分配方法 1、 ELAN yolov7使用大量的ELAN作为基础模块。 这么多堆叠其实对应了

    2024年01月17日
    浏览(33)
  • yolov5s-6.0网络模型结构图

    因为在6.0上做的了一些东西,所以将6.0得网络模型画了出来,之前也画过5.0的网络模型,有兴趣的小伙伴可以看下。 yolov5s-5.0网络模型结构图_zhangdaoliang1的博客-CSDN博客_yolov5s模型结构 看了很多yolov5方面的东西,最近需要yolov5得模型结构图,但是网上的最多的是大白老师的,

    2023年04月09日
    浏览(30)
  • word可以画神经网络图吗,如何画神经网络结构图

    大概试了一下用visio绘制这个图,除了最左面的变形图片外其余基本可以实现(那个图可以考虑用其它图像处理软件比如Photoshop生成后插入visio),visio中主要用到的图形可以在更多形状-常规-具有透视效果的块中找到块图形,拖入绘图区后拉动透视角度调节的小红点进行调整

    2024年02月15日
    浏览(33)
  • YOLOv5/v7 引入 最新 BiFusion Neck | 附详细结构图

    YOLO 社区自前两次发布以来一直情绪高涨!随着中国农历新年2023兔年的到来,美团对YOLOv6进行了许多新的网络架构和训练方案改进。此版本标识为 YOLOv6 v3.0。对于性能,YOLOv6-N在COCO数据集上的AP为37.5%,通过NVIDIA Tesla T4 GPU测试的吞吐量为1187 FPS。YOLOv6-S以484 FPS的速度得到了超过

    2024年02月05日
    浏览(31)
  • YOLOv7-tiny网络结构图及yaml文件 详细备注

    池化层,默认表示两倍下采样, 就是表示Conv+BN+LeakyReLU [-1, 1, Conv, [256, 1, 1, None, 1, nn.LeakyReLU(0.1)]] 结构图 yaml yaml文件中如下表示,直接看最后一层输出通道数,尺寸不会变化,SP模块默认设置卷积Pading为卷积核的一半大小 构建代码 yaml文件中的SP表示如下 结构图 yaml文件表示

    2024年02月03日
    浏览(53)
  • 数据结构图 算法6.1-6.2创建无向网 算法6.4-6.6DFS

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com Time of completion:2022.12.6 Last edited: 2022.12.6 任务描述 本关任务:编写一个能输出无向图邻接矩阵的小程序。 相关知识 为了完成本关任务,你需要掌握:1.创建邻接矩阵 编程要求 根据提示,在右侧编辑器

    2024年02月03日
    浏览(33)
  • 前端Vue uni-app App/小程序/H5 通用tree树形结构图

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。 通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月16日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包