java虚拟机
Java虚拟机的概念 :JVM是Java Virtual Machine的简称。意为Java虚拟机
虚拟机 :指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统
JVM使用软件模拟Java 字节码的指令集
使用最为广泛的JVM为HotSpot
JVM规范
- 整数的表达
原码:第一位为符号位(0为正数,1为负数)一直除以2直到除不尽
反码:符号位不动,原码取反
负数补码:符号位不动,反码加1
正数补码:和原码相同
原因:
1:用补码可以解决0和-0的问题,使用反码使得0和-0的表示二进制显示结果一样
2:用于运算,当两个数进行运算时,用两个数补码进行运算即可得到结果
扩展:来自于网友的补充
补码主要要解决的问题就是负数的表示,而众所周知,绝对值相等的两个正负数之和为0。
假设我们有正数 0000 0000 0000 1111,我们如何表示其相反数呢?一般我们的思路是,找一个数,跟它相加的结果等于0,但是我们发现,要找出一个与它相加后结果等于0的数还是要略加思考一下的(因为要计算进位),所以,为何不找出一个与它相加后结果是1111 1111 1111 1111的数,然后该数+1即是我们所要的答案啦。
于是,很容易的, 0000 0000 0000 1111 + 1111 1111 1111 0000 + 1 = 1111 1111 1111 1111 + 1 = (1)0000 0000 0000 0000
一目了然,1111 1111 1111 0001 就是我们想要的答案了,那么我们是怎么得到这个相反数的呢?
首先,找出一个数与它加起来结果是全1的,这个数便是它的反码,然后这个数再加1,这便是它的相反数了,也是我们说的补码。
我们检验一下0的情况,0000 + 1111 + 1 =(1)0000,其中1111 + 1 = (1)0000 = 0000,即+0和-0的二进制表示均为0000。
一个小小的例子解释了为何补码需要原码取反之后再加1,是不是很神奇?
- Float的表示和定义(看看就行)
3 VM指令集
类型转化 l2i
出栈入栈操作 aload astore
运算iadd isub
流程控制 ifeq ifne
函数调用 invokevirtual invokeinterface invokespecial invokestatic
4 JVM需要对Java Library 提供以下支持:
反射 java.lang.reflect
ClassLoader
初始化 class和interface
安全相关 java.security
多线程
弱引用
5JVM的编译
源码到JVM指令的对应格式
Javap(JDK自带的反汇编器)
JVM反汇编的格式
<index> <opcode> [ <operand1> [ <operand2>... ]] [<comment>]