JDK13版jvm系列-1

本内容参考《JV13官方文档》,《ZGC设计与实现》还有一个甲骨文大佬的PPT(忘记名字了)
可能涉及内容
JVM结构–jvm内存模型和java内存模型
JVM编译
类文件详解
加载、链接、初始化
GC算法
JAVA代码与其他语言交互
监控与优化
Java编译java-编译其他语言-编译虚拟机等
Hotspot源码设计原理
G1源码分析
JDK13改进版ZGC源码分析
自己设计简易JVM
如上内容,全部以甲骨文发布最新JVM为基准,拒绝花里胡哨。强迫症,就希望玩最新版本,也可能后面会更改一些系列文章
空闲就更一点,争取,11月以前更完
声明一下,生产环境和学习新知识是两回事
简介
JVM:类似我们电脑或者手机,有内存有cpu,内存相当于jvm的运行时数据区,cpu相当于jvm指令集。
java开发者必备,java语言规范和jvm规范(什么深入理解Java虚拟机,jvm规范是官方定义的)
jvm有很多公司的实现,我们主要为oracle的Hotspot vm
JVM数据类型:
原始类型和引用类型
Java虚拟机支持的原始数据类型是数字类型、boolean类型和returnAddress 类型;
数值类型由整数类型和浮点类型组成。
整数类型为:
byte:值为8位带符号的二进制补码整数,并且其默认值为零
short:值为16位带符号的二进制补码整数,并且其默认值为零
int:值为32位带符号的二进制补码整数,并且其默认值为零
long:值为64位带符号的二进制补码整数,并且其默认值为零
char:值为16位无符号整数,并以UTF-16编码,其默认值为空代码点(’\u0000’)。
浮点类型为:
float:值是float值集的元素,或者(如果支持)float-extended-exponent值集的元素,其默认值为正零
double:值为双精度值集或受支持的双扩展指数值集的元素,并且其默认值是正零
boolean:值为true和false,默认值为false。
第一版的的Java虚拟机规范并不认为 boolean是一个Java虚拟机类型。但是,boolean值在Java虚拟机中的支持确实有限(在Java 虚拟机中没有任何供 boolean 值专用的字节码指令,在 Java 语言之中涉及到 boolean类型值的运算,在编译之后都使用 Java 虚拟机中的 int 数据类型来代替。)。第二版的的Java 虚拟机规范把boolean作为一个类型澄清这个问题。

returnAddress类型的值 是指向Java虚拟机指令的操作码的指针。在原始类型中,只有returnAddress类型不与Java编程语言类型直接相关。
JVM整数类型取值范围:
对于byte,从-128到127(-2 7^到2 7^ - 1)
对于short,从-32768到32767(-2 15^ 2 15^ - 1)
对于int,从-2147483648到2147483647(-2 31^ 2 31^ - 1)
对于long,从-9223372036854775808到9223372036854775807(-2 63^到2 63^ - 1)
浮点类型,值集和值:
浮点类型包含 float 类型和 double 类型两种,它们在概念上与《IEEE Standard for Binary Floating-Point Arithmetic》 ANSI/IEEE Std. 754-1985(IEEE, New York)标准中定义的 32 位单精度和 64 位双精度 IEEE 754 格式取值和操作都是一致的。
IEEE 754标准不仅包括正负号幅度数,还包括正零号和负零号,正负号和负无穷大以及特殊的非数字值(以下简称为“ NaN”)。NaN值用于表示某些无效运算的结果,例如零除零。
Java虚拟机的每个实现都需要支持两个标准的浮点值集,即float值集和double值集。此外,Java虚拟机的实现可以选择支持两个扩展指数浮点值集或两个,即 float-extended-exponent值集和double-extended-exponent值集。在某些情况下,可以使用这些扩展指数值集代替标准值集来表示类型的值 float或double。
浮点数的形式表示:如下,直接贴原文,(比赛开始了)
在这里插入图片描述
浮点值集参数:
JDK13版jvm系列-1_第1张图片
JDK13版jvm系列-1_第2张图片

关于浮点数的内容,其实看起来会非常晕。所以暂时可以大致看一下就可以。
returnAddress类型和值
returnAddress类型是使用Java虚拟机的JSR,RET和jsr_w指令(第JSR,§ RET, 第jsr_w)。该returnAddress 类型的值是指向Java虚拟机指令的操作码的指针。与数字原始类型不同,该returnAddress类型不与任何Java编程语言类型相对应,并且不能由正在运行的程序进行修改。这个内容差不多已经被抛弃了,了解一下就行。
boolean类型:
尽管Java虚拟机定义了一种 boolean类型,但它仅提供对它的非常有限的支持。没有Java虚拟机指令专门用于boolean 值的操作。相反,将对boolean值进行运算的Java编程语言中的表达式 编译为使用Java虚拟机int数据类型的值。
Java虚拟机确实直接支持boolean数组。它newarray指令(第newarray),能够创建boolean数组。boolean的数组被访问并且使用经修改的 byte数组指令baload和bastore (§ baload, § bastore)。
在Oracle的Java虚拟机实现中,boolean将Java编程语言中的byte数组编码为Java虚拟机数组,每个boolean元素使用8位 。
Java虚拟机boolean 使用1表示true和0表示对数组组件进行编码false。如果boolean编译器将Java编程语言值映射到Java虚拟机类型的值int,则编译器必须使用相同的编码。
引用类型和值
Java虚拟机中有三种引用类型,类类型(Class Types)、数组类型(Array Types)和接口类型(Interface Types)。这些引用类型的值分别由类实例、数组实例和实现了某个接口的类实例或数组实例动态创建。
reference值也可以是空引用的,没有对象的引用,这将在这里通过null表示。该null引用最初没有运行时类型,但可以强制转换为任何类型。reference类型的默认值是null。
Java 虚拟机规范并没有规定 null 在虚拟机实现中应当怎样编码表示。

接下来开始进入即将开始讲的主要系列
先讲一下java内存模型和jvm运行时数据区的区别,很多人对这个都有误解
Java内存模型:
面试官问:讲一下Java内存模型;
错误示例:Java虚拟机栈、Java堆、方法区、运行时常量池、本地方法栈等等
面试官:回去等通知吧
你:…
正确回答:
面试官问:讲一下Java内存模型;
正确示例:Java 内存模型是通过各种操作来定义的,包括对变量的读/写操作,监视器的加锁喝释放操作,以及线程的启动和合并操作。JMM为程序中的所有操作定义了一个偏序关系,称之为Happens-Before。如果两个操作之间缺乏Happens-Before关系,那么JVM可以对他们任意地重排序。
面试官:那你讲一下Happens-Before
我:Happens-Before 规则:
程序顺序规则。如果程序中操作A在操作B之前,那么线程中A操作将在B操作之前执行。
监视器锁规则。在监视器锁上的解锁操作必须在同一个监视器锁上的加锁操作之前执行。
volatile 变量规则。对volatile 变量的写入操作必须在对该变量的读操作之前执行。
线程启动规则。在线程上对Thread.Start的调用必须在该线程中执行任何操作之前执行。
线程结束规则。在线程中的任何操作都必须在其他线程检测到该线程已经结束之前执行。或者从Thread.join 中成功返回,或者在调用Thread.isAlive时返回false。
中断规则。当一个线程在另一个线程上调用 interrupt 时,必须在被中断线程检测到 interrupt 调用之前执行(通过抛出InterruptedException,或者调用 isInterrupted和 interrupted )。
终结器规则。对象的构造函数必须在启动该对象的终结器之前执行完成。
传递性。如果操作A 在操作B 之前执行,并且操作B 在操作C 之前执行,那么操作A必须在操作C之前执行。
面试官:行,你说话多,你对,那讲讲JVM运行时数据区吧
我:主要分为线程共享和私有两部分
线程共享:方法区,Java堆,运行时常量池
线程私有:Java虚拟机栈、本地方法栈、pc寄存器
面试官:新生代和老年代属不属于jvm规范
我:不属于,他们应该属于jvm的实现,jvm规范,因为jvm规范是一种抽象的描述,而不是具体java虚拟机的实现。
面试官:那讲一怎么判断对象死亡
我:引用计数法和可达性分析巴拉巴拉,(下次gc再提)
面试官:你的情况大概了解了,回去等通知吧
我:…又凉了一家
虚拟机的结构,明天详细较深入的描述,今天只做介绍
没有jvm13的老哥,可以先看下这份文档 https://docs.oracle.com/javase/specs/jvms/se13/jvms13.pdf

你可能感兴趣的:(JDK13版jvm系列-1)