工作过一段时间才发现不用"管他是怎么实现的"这些话都是狗p,以下是看 Java虚拟机规范(Java SE 7) 笔记和思考,个人也觉得先看规范在学习深入理解等系列会更容易,节约篇幅具体定义不抄了
第一章简介
jvm:只与特定的二进制文件格式(class)有关联,java硬件无关性与操作系统无关的关键部分
实现:HotSpot,jrockit,ibmJvm等
简单的说,实现jvm只需要正确读取class文件的指令,并正确执行这些指令所蕴含的操作即可
就三条,标准的基础教材,但相关的东西很多
1.硬件相关性是什么?
首先看一下机器码与字节码:
字节码:字节码通常指的是已经经过编译,但与特定机器码无关,需要直译器转译后才能成为机器码的中间代码。字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列。字节码主要为了实现特定软件运行和软件环境、硬件环境无关。字节码的实现方式是通过编译器和虚拟机器。编译器将源码编译成字节码,特定平台上的虚拟机器将字节码转译为可以直接执行的指令。字节码的典型应用为Java语言。
原生机器码:机器语言是一种指令集的体系。这种指令集,称机器码,是电脑的CPU可直接解读的数据。机器码有时也被称为原生码,这个名词比较强调某种编程语言或库,它与运行平台相关的部份。
说白了电子计算机通过电子信号的有无(0/1)进行操作,其中在cpu有一个区域可以用不同的信号控制其他的信号即指令集(参考《编程奥妙》)
不过这么解释好像又有问题
2.原生机器码又怎么进行运行?
我暂时理解为完全由Cpu和操作系统实现,不同的cpu处理机制不一样,操作系统依赖这些机制且,且需要对机器码规范进行实现,至于机器码规范我没找到,这是我杜撰出来的,等我看完cpu原理在解释
总之看了简介之后就可以一眼看出java的优势(这种图到处都是)
编译型:程序 --> 机器语言 直接编译为机器语言解释性:程序 --> 字节码 --->机器语言 根据具体系统在编译为机器语言增加一个中间层达到平台无关的目的, 操作平台上的机器语言又是一套规范这些都是编程语言,可我们在开发的时候还有脚本语言,那么
3.脚本语言又是什么?
脚本语言: 规则+解释器,一般都是以文本形式存在,类似于一种命令,用以回应他人意图
说白了就是 脚本语言(文本)-->解析器 而解析器可以由程序语言编写(javascript:v8/c++ ,rhino/java...)
第二章java虚拟机结构
1.数据类型
种类:原始类型和引用类型
作用:变量赋值、参数传递、方法返回和运算操作
区别:原始类型的值不需要通过特殊标记或别的额外识别手段来在运行期确定它们的实际数据类型,也无需刻意将它们与引用类型的值区分开来,虚拟机的字节码指令本身就可以确定它的指令操作数的类型是什么,所以可以利用这种特性即可直接确定操作数的数值类型(每条指令具有专属操作类型)
其他:编译器应当在编译期间尽最大努力完成可能的类型检查,使得虚拟机在运行期间无需进行这些操作。
1.1原始类型与值
种类:数值(整数,浮点),布尔,returnAddress
boolean:编译后为int/type
returnAddress:finally相关,忘记它
1.float表示范围为什么比int大?
参照 IEEE 754 规范 (说实话,刚工作的时候我从来没想过这个问题)
其中
2.整数内容的提升?
xx
1.2引用类型与值
种类:类类型(Class Types)、数组类型(Array Types)和接口类型(Interface Types)
均由相关类型动态创建
数组类型:数组类型还包含一个单一维度(即长度不由其类型决定)的组件类型(Component Type),一个数组的组件类型也可以是数组。但从任意一个数组开始,如果发现其组件类型也是数组类型的话,继续重复取这个数组的组件类型,这样操作不断执行,最终一定可以遇到组件类型不是数组的情况,这时就把这种类型成为数组类型的元素类型(Element Type)。数组的元素类型必须是原始类型、类类型或者接口类型之中的一种。(多维数组的解释)
2.运行时数据区
PC寄存器:程序计数器
Java虚拟机栈:栈帧可以在堆中分配,Java虚拟机栈所使用的内存不需要保证是连续的(曾今叫java栈)
堆:可供各条线程共享的运行时内存区域,也是供所有类实例和数组对象分配内存的区域,被垃圾收集器强制管理(传说中的垃圾堆- -)
方法区:可供各条线程共享的运行时内存区域。方法区与传统语言中的编译代码储存区或者操作系统进程的正文段的作用非常类似,它存储了每一个类的结构信息,例如运行时常量池、字段和方法数据、构造函数和普通方法的字节码内容、还包括一些在类、实例、接口初始化时用到的特殊方法。方法区是堆的逻辑组成部分,但gc不强制处理
什么是堆和栈?
看书多了就觉得堆跟栈总是重名,是命名的原因还是翻译有问题有机会的看看
首先数据结构中有堆跟栈,其中
堆:满足一定性质的完全二叉树(二叉树中任一非叶子结点关键字的值均小于(大于)它的孩子结点的关键字)
栈(堆栈):是限制仅在表的一端进行插入和删除运算的线性表。有顺序栈、链式栈(先进后出)
队:只允许在一端进行插入,而在另一端进行删除的运算受限的线性表(先进先出)
栈和队列是两种特殊的线性表,它们的逻辑结构和线性表相同,只是其运算规则较线性表有更多的限制,故又称它们为运算受限的线性表。
结构只是理论,实际上我们也不怎么用,在java中的实现类没找到- -
而在操作系统中
堆栈是对内存操作的一种机制,可以度娘下 操作系统对内存的管理
所以可以看到jvm既然成为虚拟机,就一定会有对内存的管理机制,将这个名字继承下来就是Java虚拟机栈和堆