什么是JVM
JVM(Java Virtual Machine)是一个抽象的计算机,和实际的计算机一样,它具有指令集并使用不同的存储区域,它负责执行指令,还要管理数据、内存和寄存器。
简单来说,JVM就是一个虚拟计算机。我们都知道Java语言其中的一个特性就是跨平台的,而
JVM就是Java程序实现跨平台的关键部分。Java编译器编译Java程序时,生成的是与平台无关
的字节码(也就是*.class文件),所谓的平台无关是指编译生成的字节码无论是在Window、
Linux、Mac系统都是可执行。也就是说Java编译生成的*.class文件不是面向平台的,而是面
向JVM的。不同平台上的JVM都是不同的,但是他们都是提供了相同的接口。图一为Java的大
致运行步骤:
java虚拟机有以下几个特点
(1)
java虚拟机只和class文件关联,所以只要你编写程序的语言能够编译成class文件,那么都能够在Java虚拟机上运行。
(2)
它可以跨平台
也就是说Java是一个跨平台的语言,那么Java是如何实现跨平台的呢?
其实Java之所以跨平台是因为Java虚拟机的适配,不同的系统实现不同的Java虚拟机。Java虚拟机就相当于操作系统和应用程序之间的中介,每种平台安装适应该平台的Java虚拟机,那么我们编写的程序自然能够在任意平台运行。
其实java提供一个完美的解决方案来解决跨平台的问,那就是针对不同的版本信息提供几个主流系统的java虚拟机来解决这个跨平台的问题下面一张图来简单的概括一下
java虚拟机体系结构
java虚拟机由五个部分组成:一组指令集、一组寄存器、一个栈、一个无用单元收集堆一个方法区域。
寄存器
寄存器的话有一下四种
程序记数寄存器:跟踪程序执行的准确位置
堆栈指针寄存器:指示操作栈项
框架寄存器:指向当前执行的环境
变量寄存器:指向当前执行环境中第一个本地变量
栈
Java虚拟机的栈有三个区域:局部变量区、本地方法区、操作数区。
局部变量区
局部变量表存放了编译器可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(引用指针,并非对象本身),
本地方法区
本地方法栈用于支持本地方法(native标识的方法,即非Java语言实现的方法)。
虚拟机栈和本地方法栈,当线程请求分配的栈容量超过JVM允许的最大容量时抛出StackOverflowError异常。