0x01.JVM 架构模型

1.JVM 架构模型

目录

1.1.JVM 整体结构

对于JAVA虚拟机来的运行原理来说,首先需要知道JAVA虚拟机的架构模型,全文使用Orcale的hotspot 虚拟机进行对应说明,首先我们先看下对应的整体虚拟机的架构模型架构:

在这里插入图片描述

由上可以看出JAVA虚拟机有以下几部分组成:

  • 类加载子系统
  • 运行时数据区
  • 执行引擎
  • 本地方法接口与本地方法库

1.2.JVM的架构模型

Java编译器输入的指令流程基本上是一种基于栈的指令集架构,另外一种是基于寄存器的指令集架构。具体来说这两种架构之间区别:

基于栈的指令集架构

基于栈式架构的特点:

  1. 设计和实现更加简单,适用于资源受限的系统
  2. 避开了寄存器分配的难题:使用零地址方式分配
  3. 指令流中指令大部分是零地址指令,执行过程依赖栈。指令集更小,编译器更容易实现
  4. 不需要硬件支持,可移植性更好,更容易进行跨平台

基于寄存器的指令集架构

基于寄存器架构的特点:

  1. 二进制指令集,传统的PC与安卓虚拟机
  2. 对于硬件依赖,与硬件耦合度高,可移植性差
  3. 更高效的执行与更优秀的性能
  4. 花费更少的指令完成一个动作
  5. 大部分场景下基于寄存器的指令集都是一地址指令、二地址指令和三地址指令为主,与栈式指令集架构不同,栈式指令集都是零地址为主

架构举例

比如执行 2+2这个动作,指令集如下:

  • 基于栈式指令集架构的计算指令(JVM为例)
iconst_2  // 常量 2 入栈
istore_1
iconst_2  // 常量 2 入栈
istore_2
iload_1
iload_2
iadd      // 相加 2+2
istore_0  // 结果入栈
  • 基于寄存器指令集架构的计算指令
mov eax,2
add eax,2

基于以上例子发现,基于寄存器的指令集架构使用的指令更少,基于栈式的指令集架构所需要的操作更多。

JVM架构总结

  1. 由于跨平台特性的设计,Java指令集都是根据栈来设计的。不同的CPU平台架构不同,所以不能基于寄存器设计。栈的优点:跨平台,指令集小,编译器容易实现。缺点:性能比寄存器差。
  2. 时至今日,尽管嵌入式平台已经不是Java程序的主流运行平台了(准确来说应该是HotSpot VM的宿主环境已经不局限于嵌入式平台了),那么为什么不将架构更换为基于寄存器的架构呢?因为基于栈的指令集架构跨平台性更好、指令集小(相对于基于寄存器架构来说),跨平台性更好。

1.3 JVM的生命周期

虚拟机的启动

Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。

虚拟机的执行
  1. 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序
  2. 程序开始执行时他才运行,程序结束时他就停止
  3. 执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程
虚拟机的退出
  1. 程序正常执行结束
  2. 程序在执行过程中遇到了异常或错误而异常终止
  3. 由于操作系统用现错误而导致Java虚拟机进程终止
  4. 某线程调用Runtime类或System类的exit()方法,或Runtime类的halt()方法,并且Java安全管理器也允许这次exit()或halt()操作。
  5. 除此之外,JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载 Java虚拟机时,Java虚拟机的退出情况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值