第五章 java虚拟机
一. 什么是java虚拟机?
1、抽象的Java虚拟机规范
2、一个具体的Java虚拟机实现
3、一个运行的Java虚拟机实例
二.Java虚拟机的生命周期?
l java虚拟机内部的两种线程:守护线程和非守护线程
l 守护线程通常都是由java虚拟机自己创建的,比如垃圾收集任务的线程
l java程序也可以创建守护线程
l Java程序的初始线程——从main()开始的线程为非守护线程
l 只要有任何的非守护线程在运行,那么程序就继续运行
总之:java虚拟机的生命周期就是从java程序启动开始到所有的非守护线程终止的这个过程。
三.Java虚拟机的体系机构:
1. 每一个java虚拟机都有一个类加载子系统,负责装载类型(类和接口);
2. 每一个java虚拟机都有一个执行引擎,负责执行被装载类中方法的指令;
3. 某些运行时数据由所有线程共享,某些只能由一个线程拥有;
4. 每一个java虚拟机实例都拥有一个方法区以及一个堆;
5. 虚拟机加载class文件(其中的二进制数据),将类型信息存放到方法区中,运行时创建的对象存放在堆中;
6. 每一个新的线程被创建都将会有得到它自己的PC寄存器(程序计数器)以及一个java栈;
7. PC寄存器是用于存放下一条被执行的JVM指令的地址(如果即将执行的方法是native方法,则PC寄存器值没有定义);
8. Java栈是存储该线程中Java方法的调用状态(局部变量、参数、返回值以及中间结果);
9. 如果是本地方法调用的状态,则则是以依赖于具体实现的方式存储在本地方法栈、或是寄存器或是其它内存区中;
10. Java栈是由许多栈桢组成的,一个栈桢包含一个方法的调用状态;当线程调用一个Java方法时,虚拟机压入一个新的栈桢到该线程的Java栈中;当该方法返回时,这个栈桢将从Java栈中弹出;
四.数据类型
1. 虚拟机有两种数据类型:基本类型和引用类型。Java 语言中的所有基本类型同样也都是Java虚拟机中的基本类型,但boolean有点特别,虽然Java虚拟机也把boolean当作基本类型,但是指令集对boolean,只有很有限的支持:当编译器把Java源码编译为字节码时,它会用int或byte来表示boolean。在Java虚拟机中,false是由整数零表示的,所有非零整数都表示true。涉及boolean的值的操作则会使用int。另外,boolean数据是当做byte数组来访问的,但是在堆区,它也可以被表示为位域;
2. Java虚拟机中还有一个只在内部使用的基本类型:returnAddress,不能在程序开发时使用这个类型,它被用来实现Java程序中的finally子句;
3. Java虚拟机有三种引用类型:
l 类类型:对类实例的引用;
l 接口类型:对实现了该接口的某个类实例的引用;
l 数组类型:对数组对象的引用;在Java虚拟机中,数组是个真正的对象;