一 Java虚拟机概述
- Java虚拟机实例是由 类装载器、运行时数据区(堆、Java栈、方法区、PC寄存器、本地方法栈)、执行引擎几部分组成的。
- Java堆和方法区是对所有线程共享的,而每一个线程都由自己的Java栈和PC寄存器,线程之间不能共享Java栈和PC寄存器。
- Java栈是向下生长的,也就是说最下端的是栈顶。
- 在boolean值的处理中,用0来表示false,其他所有非0值表示true。
- 用户自定义的classloader实例也是存放在堆中,而被装载的类的信息是放在方法区中。
- 类装载器的类型包括 启动类装载器、系统类装载器、用户自定义类装载器,其中系统类装载器是在JDK1.2后引入的,它也属于自定义类装载器,专门负责检索和装载classpath下的类文件。
- Java程序运行过程中所有声称的类实例和数组实例都存放在堆(heap)中,每一个Java进程都只有一个堆,不同的Java进程之间不能共享堆,堆中的数据是对同一个Java进程中的所有线程可见的,因此需要考虑同步问题。
- 每一个堆中的对象都有一个对象锁,可以用这种机制实现线程同步问题,某个线程获得对象所有,其他线程必须等待,知道获得对象锁后才能继续执行。一个线程可以堆一个对象多次加锁(追加锁),同理,释放锁也需要多次。
- 对象可能会持有一个等待集合,可以用这种机制实现Java中的wait、notify、notifyAll功能。
- 每一个线程开始执行的时候,都会创建一个PC寄存器,PC寄存器的大小为一个字(word)长,因此它可以持有一个本地指针。并且总是指向下一个被执行的指令。当执行本地方法的时候,PC寄存器的值为“undefined”。
- 正在运行的每一个Java线程都是执行引擎的实例。
二 Class文件