Java Virtual Machine结构

第一章. 介绍
Java 虚拟机
虚拟机是java的核心。其实字节码并不是解释执行,可以编译成任何一种特定CPU指令。
JVM根本不知道java语言本身,它只了解class文件这种二进制格式。class文件包含JVM指令(字节码),符号表和其他辅助信息。为了安全起见,JVM对class文件内的字节码施加了强句法和结构限制。任何能编译成class字节码的语言都可以在JVM里面运行。

第二章
Java Virtual Machine结构
为了正确实现JVM,你只要能够解读class文件格式并且正确执行其内的指令即可。具体实现细节都可以自由发挥。譬如运行时内存结构,JVM指令的内部优化。
JVM也是支持primitive和reference两种类型。
returnAddress类型被这些JVM指令使用:jsr, ret, and jsr_w. returnAddress类型的值是指向JVM opcodes的指针。Unlike the numeric primitive types, the returnAddress type does not correspond to any Java programming language type and cannot be modified by the running program.
JVM boolean类型相对较弱;JAVA的boolean类型最终被映射为1和0.

2.5 Run-Time Data Areas
JVM定义了多种运行时数据区域.有些是在JVM启动时创建的,有些是基于线程的。基于线程的数据区在创建线程时同时被创建,随着线程退出而销毁。

The pc Register
每一个线程都有其pc (program counter) register. 如果JVM线程当前运行非native方法,那么pc register就是当前被执行的JVM指令地址;如果是native方法,则为undefined。

-JVM Stack栈
每一个JVM线程都有私有的JVM堆栈,在线程创建时声称。JVM堆栈用来存储frame;和C语言的堆栈类似,存放局部变量和临时结果,同时参与方法调用和返回。因为JVM堆栈除了出入frame,不会被直接操作,所以frame可以再堆上分配。栈内存不需要连续。
栈可以是固定大小也可以是可伸缩的。如果一个线程中的运算需要比当前允许的更大栈,JVM会抛出StackOverflowError。
如果JVM栈可以动态扩展,扩展被尝试但是没有足够的内存,那么JVM会抛出OutOfMemoryError。

JVM Heap堆
堆是有所有JVM线程共享的。所有的运行时类实例和数组都是从堆分配的。
堆是在JVM启动时创建的。堆存储中的对象可以归自动回收而不用显式释放。对可以使固定大小或者根据需要扩展。堆内存不需要连续。
如果堆用完并且自动GC也无法提供,会抛出OutOfMemoryError。

方法区Method Area
JVM方法区是有所有线程共享的。用来存储每个类的数据结构,例如运行时常量池,方法和构造函数代码和其他类和接口初始化方法。
方法区是在JVM启动时创建的。大小无需固定,可以GC或不。

运行时常量池Run-Time Constant Pool
运行时常量池是每个类或接口专有,代表了class文件中的constant_pool表。包括编译期常数和需要运行时解析的方法和fields。运行时常量池当JVM创建类或接口是被创建。

原生方法栈Native Method Stack
用来和原生方法交互

2.6 Frames
Frame用来存储数据和临时结果,还有动态链接,函数返回值和发送异常。
当方法调用时会生成frame,方法调用结束会销毁。frame从方法调用线程的栈中分配。每一个frame都有自己的局部变量,操作数栈和对于方法所属类常量池的引用。
frame大小由JVM实现决定。
任何时候,只有一个frame,也就是当前运行方法的Frame,能够处于active状态。这个Frame就叫做当前Frame,其方法叫做当前方法。定义方法的类就是当前类。对于局部变量和操作数栈的操作也都是对于当前frame的引用。
一个当前frame不再是当前状态如果其方法结束或者调用了其他方法。当一个方法被调用时,一个的新的Frame生成并成为当前frame。方法返回时,当前frame把方法调用结果返回给前一个active frame;然后当前frame被丢弃,之前frame成为active frame。
线程生成的frame只有当前线程可见。
每个frame都饱和一组局部变量。局部变量数组长度在编译期决定。单个局部变量可以容纳最大float,两个可以容纳double和long。局部变量用索引寻址。JVM使用局部变量为方法调用穿参数。对于类方法,从局部变量0开始都是参数;对于实例方法,局部变量0是对象引用,this,参数从索引1开始。
Operand Stacks
就是通常的操作栈。两数相加时,现将两个int出栈,相加结果入栈。

Dynamic Linking
每个frame都包含有对于运行时常量池的引用,用来支持方法代码的动态链接。Class文件方法代码通过符号引用来引用要调用的代码和使用的变量。动态链接把这些符号方法引用翻译成具体的方法引用,按需载入类来解析未定义的符号,并且把变量翻译成相应的存储区位移。
方法和变量的迟绑定使得在其他类中的变化不至于让我们的代码崩溃。

Normal Method Invocation Completion
如果没有异常发生,通过调用return,方法把返回值返回给调用方法。当前frame需要保存调用方法的一些信息,用来正确顺序执行指令。
2.7. Representation of Objects
JVM没有要求任何特别的对象内部结构。

2.8. Floating-Point Arithmetic
略过

2.9. Special Methods特殊函数
2.9.1. Instance Initialization Methods实例初始方法
类有0或者多个实例初始化方法,每个都和构造函数相对应。

一个方法是实例初始化方法如果满足以下全部条件:
定义在类里面(不是接口)
有特殊的名字
void类型

2.9.2. Class Initialization Methods类初始化函数
一个类或接口有至多一个类/接口初始化函数并且被JVM调用。

一个方法是类初始化方法如果满足以下全部条件:
有特殊的名字
void类型
在高于51.0版本的class文件中,函数有ACC_STATIC标记并且没有参数。

2.9.3. Signature Polymorphic Methods

2.10. Exceptions异常
JVM异常都是Throwable或者其子类型。
异常由于以下原因产生:
athrow指令被调用
JVM同步侦测到异常执行状态
指令违背了java语言语义
载入或者链接程序出错
遇到资源瓶颈
异步异常
线程stop被调用
JVM内部实现出现错误

当异常发生时,事发点之前的代码都要求已经执行,事发点之后的代码不可以执行。
每一个JVM函数有可能和0或多个异常处理相关联。异常处理者规定了异常发生理函数的位置,哪些种类的异常是可以被处理的,以及异常处理函数的位置。异常与异常处理者匹配,如果导致异常的指令在异常处理者的范围内,并且异常类型匹配。当异常被抛出的时候,JVM在当前的函数寻找异常处理者。如果找到,那么系统执行转移到异常处理代码。
如果当前函数没有找到handler,那么当前函数意外结束。在意外结束情况下,当前函数操作数栈和局部变量被抛弃,frame出栈,调用函数的Frame成为当前frame。然后异常在当前调用者frame环境中被再次抛出,沿着调用栈继续。如果最终没有
异常handler,抛出异常的线程将被终止。
函数的异常handler被查找的顺序很重要。在class文件里,每个函数的异常handler存在一个表中。运行时,当异常被抛出,JVM在表内按顺序寻找当前函数的异常handler。

2.11. Instruction Set Summary指令集概要

2.11.9. Throwing Exceptions
athrow指令用来抛出异常. JVM如果探测到异常情况一会抛出异常。

2.11.10. Synchronization同步
JVM通过monitor来支持函数间以及函数内指令序列的同步。函数级的同步是通过调用和返回隐式实现的。一个同步的函数在运行时常量池的method_info结构里有ACC_SYNCHRONIZED标记,函数调用指令需要检查识别。当调用一个有 ACC_SYNCHRONIZED标记的函数时,执行线程进入一个monitor,调用函数,然后离开monitor,无论函数调用成功结束与否。即使出现无法处理的异常,也会先退出monitor然后再重新抛出异常。

Synchronization of sequences of instructions is typically used to encode the synchronized block of the Java programming language. The Java Virtual Machine supplies the monitorenter and monitorexit instructions to support such language constructs. Proper implementation of synchronized blocks requires cooperation from a compiler targeting the Java Virtual Machine (§3.14).

Structured locking is the situation when, during a method invocation, every exit on a given monitor matches a preceding entry on that monitor. Since there is no assurance that all code submitted to the Java Virtual Machine will perform structured locking, implementations of the Java Virtual Machine are permitted but not required to enforce both of the following two rules guaranteeing structured locking. Let T be a thread and M be a monitor. Then:

The number of monitor entries performed by T on M during a method invocation must equal the number of monitor exits performed by T on M during the method invocation whether the method invocation completes normally or abruptly.

At no point during a method invocation may the number of monitor exits performed by T on M since the method invocation exceed the number of monitor entries performed by T on M since the method invocation.

Note that the monitor entry and exit automatically performed by the Java Virtual Machine when invoking a synchronized method are considered to occur during the calling method’s invocation.

2.12. Class Libraries
JVM需要提供对于类库实现的支持。
需要JVM支持的类库:

Reflection, such as the classes in the package java.lang.reflect and the class Class.

Loading and creation of a class or interface. The most obvious example is the class ClassLoader.

Linking and initialization of a class or interface. The example classes cited above fall into this category as well.

Security, such as the classes in the package java.security and other classes such as SecurityManager.

Multithreading, such as the class Thread.

Weak references, such as the classes in the package java.lang.ref.

2.13. Public Design, Private Implementation

虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统 定义   虚拟机指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。 编辑本段用途   通过虚拟机软件,你可以在一台物理计算机上模拟出一台或多台虚拟的计算机,这些虚拟机完全就像真正的计算机那样进行工作,例如你可以安装操作系统、安装应用程序、访问网络资源等等。对于你而言,它只是运行在你物理计算机上的一个应用程序,但是对于在虚拟机中运行的应用程序而言,它就是一台真正的计算机。因此,当我在虚拟机中进行软件评测时,可能系统一样会崩溃,但是,崩溃的只是虚拟机上的操作系统,而不是物理计算机上的操作系统,并且,使用虚拟机的“Undo”(恢复)功能,我可以马上恢复虚拟机到安装软件之前的状态。 编辑本段虚拟系统与虚拟机区别   虚拟系统其实以Prayaya迅影V3虚拟系统为代表的,通过生成现有操作系统的全新虚拟镜像,它具有真实windows系统完全一样的功能,进入虚拟系统后,所有操作都是在这个全新的独立的虚拟系统里面进行,可以独立安装运行软件,保存数据,拥有自己的独立桌面,不会对真正的系统产生任何影响 ,而且具有能够在现有系统与虚拟镜像之间灵活切换的一类操作系统。虚拟系统和传统的虚拟机(Vmware,VirtualBox,Virtual pc)不同,虚拟系统不会降低电脑的性能,启动虚拟系统不需要像启动windows系统那样耗费时间,运行程序更加方便快捷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值