JVM规范阅读摘要(一)


一、jvm

1、jvm是什么?

  1. Java virtual Machine
  2. 软件模拟的运行在完整隔离环境中的具有完整硬件功能的计算机系统;
  3. Jvm通过软件模拟java字节码的指令集, 是Java的运行环境

2、有什么?

在这里插入图片描述

3、平台无关&&语言无关

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


二、JVM规范

1、数据类型

1、原始数据类型
1.1 数值类型
byte: 8位有符号二进制补码整数, 默认0, (-128127)-2^72^7-1;
short: 16位有符号二进制补码整数, 默认0, (-32768~32767) -215~215-1;
int: 32位有符号二进制补码整数, 默认0, (-21亿~21亿 )-231~231-1;
long: 64位有符号二进制补码整数, 默认0, 92亿亿 -263~263-1;
char: 16位无符号整数, Unicode, UTF-16 编码, 默认’\u0000’, 0~65535;
float: 单精度浮点数, 默认0f; (非零值, 正数零, 负数零, 正无穷, 负无穷, NAN)
double: 双精度浮点数, 默认0d;(非零值, 正数零, 负数零, 正无穷, 负无穷, NAN)
NAN(是无序的, 与任何数比较都是false, 包括自身)
1.2 Boolean类型
boolean:true/false, 默认false;
在虚拟中, 无boolean相关的特定指令, Boolean会被编译为int,1:true, 0:false;
boolean数组会被编译成byte数组, 每个元素占8位;
1.3 reuturnAddress类型
是指向某个操作码的指针;
2、引用类型
2.1 类引用:动态创建的类实例;
2.2 数组引用:动态创建的数组实例;
2.3 接口引用:实现了某个接口的类实例或数组实例;
2.4 null:一个不指向任何对象的引用;

在这里插入图片描述

2、运行时数据区

PC寄存器
每个线程独有
保存当前线程当前方法(非native)正在执行的字节码指令的地址
如果当前方法是native, 则pc寄存器的值为undefined
容量至少应该能保存一个returnAddress类型的数据或一个本地相关的指针的值 Java虚拟机栈
每个线程独有 , 与线程同时创建;
栈的内存空间并不需要是连续的空间;
存储栈帧, 包括局部变量, 计算中的结果, 调用对象以及返回对象等
栈的大小可以是固定的,也可以是动态分配的。
如果是固定的, 可能发生“StackOverflowError”;
如果是动态分配的, 可能发生”OutOfMemoryError“;
-Xss 虚拟机栈大小 Java堆
多线程共享
存放所有的类实例、数组对象等被GC所管理的各种对象
所需的空间可以是不连续的
堆的大小可以是固定的,也可以动态分配的, 都可能发生”OutOfMemoeyError“;
-Xms 虚拟机最小堆/-Xmx 虚拟机最大堆 方法区
多线程共享
所需的空间可以是不连续的
存储 类的结构信息:运行时常量池、字段、方法、方法数据、构造函数、普通方法的字节码、还有一些在类,接口,方法初始化时用到的特殊方法
逻辑上是堆的一部分, 实际上还有个别名为”Non-heap“, 1.8之后称为元数据区,不保存在虚拟机内存中, 直接保存在机器内存中 运行时常量池
在方法区中创建
是class文件中每一个类或接口的常量表的运行时表现形式
保存各种变量, 不止代码中的各种原始变量, 还包括代码在运行时才能获取的对象类型和字段引用;
在类或接口加载到虚机中之后, 该区就会建立; 本地方法栈
如果虚机支持运行native方法, 就会使用到本地方法栈,反之,则不提供;

在这里插入图片描述

3、栈帧

存放局部数据和部分过程计算结果,同时也存放动态链接,方法返回值和异常等方法出口 随方法创建,随方法销毁 在Java虚拟机栈中分配空间
每个栈帧都拥有自己的局部变量表、操作数栈 以及 指向当前方法所属类的运行时常量池的引用 局部变量表
通过方法的Code属性保存及提供给栈帧使用
一个局部变量可以保存:Boolean, byte, char, short, int, float, reference , returnAddress 的数据;
两个局部变量可以保存:long , double 的数据, 采用较小位置的index表示,也就是一个long或double表示n和n+1的局部变量;
当类的方法调用时, 其参数将依次添加到局部变量表中;
从0开始, 如果是实例方法,则0位置的局部变量一定表示类对象本身即this; 操作数栈
用来执行指令并保存执行结果的地方
一个double或long占用两个栈深度 动态链接
每个栈帧内部都包含有一个指向当前方法所属类的运行时常量池的引用, 以便对当前方法的代码进行动态链接;
在方法中对其他方法进行调用, 或者访问成员变量,则通过reference来表示;
动态链接的作用就是将这些符号引用转化为对实际方法的直接引用;
类加载的过程中要解析尚未被解析的符号引用, 并将对变量的引用转化为变量在调度运行时位于存储结构中的正确偏移量; 方法调用完成
正常完成
抛出异常

在这里插入图片描述

4、特殊方法

<clinit>
出事化类或接口对象, 创建this; 
<init>
通过invokeSpecial调用类的构造方法,默认传入入参this

在这里插入图片描述

5、类库

Java虚拟机必须对以下等类提供支持, 因为没有虚拟机这些类是无法运行的
反射:java.lang.reflect
加载、创建、链接、初始化 类或接口的类:ClassLoader
安全:java.security
多线程:Thread
弱引用:java.lang.ref
等等
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值