目录
虚拟机
所谓虚拟机,指的是一台虚拟的计算机。它是一款软件,用来执行一系列的虚拟计算机命令。虚拟机可以分为系统虚拟机和程序虚拟机。
系统虚拟机:对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台
程序虚拟机:专门为了执行单个计算机程序而设计,在Java虚拟机中执行指令
java虚拟机
Java是目前最广泛的软件开发平台之一,拥有完善且不断壮大的社区,作为一个平台Java虚拟机扮演者举足轻重的作用
每个语言都需要转换成字节码文件,最后转换的字节码文件能通过Java虚拟机进行运行和处理
简介
Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成
JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回器,以及可靠的即时编译器
Java技术的核心就是Java虚拟机,因为所有的Java程序都运行在Java虚拟机内部
特点
1.一次编译,到处运行
2.自动内存管理
3.自动垃圾回收机制
作用
Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令。
位置
JVM是运行在操作系统之上的,它与硬件没有直接的交互
整体结构
JVM由类装载子系统、运行时数据区、java执行引擎三部分组成;三部分相辅相成共同工作,不能单纯的说只有执行完某一个部分才由下一个部分来工作,从JVM运行开始,三个类加载器就要开始创建,并且类加载器的一些信息也要放在运行时数据区
类装载子系统
.class文件通过类装载系统进行加载,验证等一系列操作,在这个过程中将需要存储到内存的数据放到运行时数据区
运行时数据区
java栈:线程独享;每个线程栈存放执行的方法,每个方法为一个栈帧
本地方法栈:线程独享;类似于虚拟机栈,这里调用的是native的方法
程序计数器:线程独享;存放每个线程中指令执行到哪一个
方法区:线程独享;类信息,常量,静态变量等
堆:线程独享;对象存放位置
java执行引擎
用于执行栈中指令,一条一条的指令读取,类似一个cpu,我们的虚拟机栈中操作数栈弹栈进行运算的运算就是由执行引擎进一步完成的
Java代码执行流程
1.Java代码通过编译器,转化生成为字节码文件
2.字节码文件在虚拟机上进行解析
3.操作系统执行
jvm架构模型
Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构
基于栈式架构
1.设计和实现更简单,适用于资源受限的系统
2.避开了寄存器的分配难题,使用零地址指令方式分配
3.指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。
4.不需要硬件支持,可移植性更好,更好的实现跨平台
零地址指令:是机器指令的一种,是指令系统中的一种不设地址字段的指令,只有操作码,没有操作数。这种指令有两种情况:一是无需操作数,另一种是操作数为默认的(隐含的),默认为操作数在寄存器中,指令可直接访问寄存器。
机器指令:机器语言的语句称为机器指令。又将全部机器指令的集合称为机器的指令系统
基于寄存器架构
1.指令集架构则完全依赖硬件,可移植性差
2.性能优秀和执行力更高效
3.花费更少的指令去完成一项操作
4.在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主
总结
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。
jvm的生命周期
分为:启动、执行、退出,三个阶段
1.启动
通过引导类加载器创建一个初始类来完成,这个类是由虚拟机的具体实现指定的
2.执行
一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序
程序开始执行时他才运行,程序结束时他就停止
执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程
3.退出
退出的情况:
1.程序正常结束
2.程序在执行过程中遇到了异常或者错误而终止
3.操作系统出现错误而导致jvm进程终止
4.某线程调用 Runtime 类或System 类 的exit 方法, 或 Runtime 类的 halt 方法,并且 Java 安全管理器也允许这次 exit 或 half 操作
5.卸载虚拟机
JVM的发展历程
1.Sun Classic VM:世界上第一款商用Java虚拟机
2.Exact VM:具备现代高性能虚拟机的雏形
3.HotSpot VM:目前Hotspot占有绝对的市场地位,称霸武林
4.JRockit:专注于服务器端应用,是世界上最快的JVM
5.IBM的J9:市场定位与HotSpot接近,服务器端、桌面应用、嵌入式等多用途VM
6.CLDC Hotspot:简单、轻量、高度可移植,面向更低端的设备上还维持自己的一片市场
7.Azul VM:与特定硬件平台绑定、软硬件配合的专有虚拟机
8.Liquid VM:不需要操作系统的支持,或者说它自己本身实现了一个专用操作系统的必要功能,如线程调度、文件系统、网络支持等
9.Apache Harmony:IBM和Intel联合开发的开源JVM,受到同样开源的OpenJDK的压制,Sun坚决不让Harmony获得JCP认证,最终于2011年退役
10.Micorsoft JVM:只能在Windows平台下运行。但确是当时Windows下性能最好的Java VM
11.Taobao JVM:基于OpenJDK 开发了自己的定制版本AlibabaJDK,简称AJDK。是整个阿里Java体系的基石。国内第一个优化、深度定制且开源的高性能服务器版Java虚拟机
12.Dalvik VM:只能称作虚拟机,而不能称作"Java虚拟机",它没有遵循 Java虚拟机规范,不能直接执行Java的Class文件
13.Graal VM:在HotSpot VM基础上增强而成的跨语言全栈虚拟机,可以作为"任何语言" 的运行平台使用
具体JVM的内存结构,其实取决于其实现,不同厂商的JVM,或者同一厂商发布的不同版本,都有可能存在一定差异。主要以Oracle HotSpot VM为默认虚拟机。