最近学习java虚拟机做了一些整理,会陆续发完。
Java虚拟机
一、概念:当我们谈到java虚拟机的时候,有可能指下面3个方面:
1):抽象java虚拟机的规范。
2):一个java虚拟机具体的实现。------实现是指:实现需要有接口,用类实现接口,并实现接口所有方法。就是说先有一个接口,然后写一个类实现接口中的所定义的方法。
3):一个运行中的java虚拟机实例。
而我们经常说的大多数是第三种。也就是一个正在运行的java虚拟机实例。
java虚拟机之所以被称为“虚拟”的,就是因为它仅仅是有一个规范定义的抽象计算机。因此,运行某个java程序,首先需要一个符合该规范的具体实现。
当运行一个java程序的同时,也就在运行一个java虚拟机实例。每个java程序都运行于某个具体的java虚拟机实现的实例上。它是java编译器和os平台之间的虚拟处理器。负责与操作系统之间的交互
二、java虚拟机生命周期:
Java虚拟机的产生和消亡是伴随java程序的运行和停止。也就是说当java程序运行的时候,相应的java虚拟机也就诞生了,反正消亡。其具体的实现是通过调用内部main方法来实现。
三:jvm执行java程序的顺序是什么呢?
大致如下:
Java(源代码)——>class(字节码)——>类加载器——>字节码校验器——>硬件
具体过程: 1、加载class文件
2、管理分配内存
3、执行垃圾回收
四、Java虚拟机的体系结构:
组成部分:一系列的子系统、内存区域、数据类型和使用指南。这些构成java虚拟机的内部结构。这些组成结构实现了外部行为(java虚拟机与OS之间的实现)和实现内部行为(java虚拟机的内部之间的实现)。
类加载器子系统(class loader subsystem)作用:每个java虚拟机都由类加载器子系统(class loader subsystem)。负责加载程序中类型(类和接口)。
执行引擎(execution engine):负责执行被加载类中的包含的指令。每个java虚拟机都有一个执行引擎(execution engine)。
内存区域:程序的执行需要一定的内存空间。如字节码、被加载的其他额外信息、程序中的对象、方法参数、返回值、本地变量、处理中间变量等等。Java虚拟机将这些的信息统统保存在数据区中(data areas)。虽然每个java虚拟机的实现中都包含数据区,但是java虚拟机规范对数据区的规定却非常的抽象。许多结构上的细节部分都留给了java虚拟机实现者的发挥。不同 的java虚拟机实现上的内存结构千差万别。一部分实现可能占用很多内存,而其他一下可能只占用很少的内存。一些实现可能会使用虚拟内存。
Data areas:数据区中的一部分是整个程序的共有的,有其他部分被单独的线程控制。每个虚拟机都包含方法去(method area)和堆(heap),他们被整个程序的共享的。
方法区(method area):当java虚拟机加载并解析一个类后,将从类文件中解析出来信息保存在方法区中(method area)。
堆(heap):程序执行时的创建的对象保存在堆中。
其他的内存区域:
PC寄存器概念:又叫指令计数器。中央处理机中的一种寄存器,用来保存计算机的执行程序的指令地址。
作用:保存线程执行的下一条指令。这其中包括是否调用本地方法情况:
当不调用本地方法的时候:PC寄存器保存线程执行下一条指令。
当线程调用本地方法的时候,pc寄存器不保存线程的下一条执行指令。
Javastacks(java 堆栈)作用:保存一个线程的调用方法的状态,包括本地变量、调用方法的参数、返回值、处理的中间变量。调用本地方法的时的状态保存在本地方法堆栈中(native method stacks),也可能在寄存器中。
Javastacks是由java堆栈块组成。而堆栈块包含java方法调用的状态。
Java虚拟机不使用寄存器保存中间结果,而是用java堆栈中存放中间结果。
好处:使java虚拟机的指令更紧凑,也更容易在一个没寄存器的设备上实现java虚拟机。
数据类型(data types):每个java虚拟机中使用的数据都有确定的数据类型。
数据类型和操作都在java虚拟机规范中严格定义的。其中数据类型包括原始数据类型和引用数据类型。
引用类型依赖于实际对象,但不是对象本身。
原始数据类型不依赖任何东西,他们就是本身表示的数据。