第一章 JVM 与 Java 体系结构

一、虚拟机与Java 虚拟机

1.1 虚拟机

所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机程序虚拟机

  • 大名鼎鼎的 Visual Box,VMware 就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。
  • 程序虚拟机的典型代表就是 Java 虚拟机,它专门为执行单个计算机程序而设计,在 Java 虚拟机中执行的指令我们称为 Java 字节码指令。

1.2 Java 虚拟机

1.2.1 介绍

Java 虚拟机是一台执行 Java 字节码的虚拟计算机,它拥有独立的运行机制,其运行的 Java 字节码也未必由 Java 语言编译而成。
JVM 平台的各种语言可以共享 Java 虚拟机带来的跨平台性、优秀的垃圾回收器,以及可靠的即时编译器。
Java 技术的核心就是 Java 虚拟机(JVM,Java Virtual Machine),因为所有的 Java 程序都运行在 Java 虚拟机内部。

1.2.2 作用

Java 虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条 Java 指令,Java 虚拟机规范中都有详细定义,如怎么去操作数,怎么处理操作数,处理结果放在哪里。

1.2.3 特点

  • 一次编译,到处运行
  • 自动内存管理
  • 自动垃圾回收功能

二、JVM 的位置

image.png
JVM 是运行在操作系统之上的,它与硬件没有直接的交互

image.png

三、JVM 的整体结构(以 HotSpot VM 为例)

image.png

  • HotSpot VM 是目前市面上高性能虚拟机的代表作之一,它采用解释器与即时编译器并存的架构。
  • 类加载子系统将字节码文件加载进内存,生成大的 Class 对象,该过程会涉及到加载、链接、初始化等过程
  • 数据经过类加载子系统加载到内存后,会被存放到方法区中
  • 多线程共享堆和方法区
  • 虚拟机栈和本地方法栈以及程序计数器是每个线程独有一份
  • 执行引擎分为三个部分:解释器、即时编译器、垃圾回收器
  • 执行引擎会将高级语言翻译成机器语言

四、Java 的代码的执行流程

image.png

image.png
Java 编译器用于将源文件编译成字节码文件,而 JIT 编译器则是将字节码指令编译成机器指令

五、JVM 的架构模型

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

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

基于寄存器架构的特点:

  • 典型的应用是 x86 的二进制指令集:比如传统的 PC 以及 Android 的 Davlik 虚拟机
  • 指令集架构则完全依赖硬件,可移植性差
  • 性能优秀和执行更高效
  • 花费更少的指令去完成一项操作
  • 在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主,而基于栈式架构的指令集却是以零地址指令为主

总结:
由于跨平台性的设计,Java 的指令都是根据栈来设计的。不同平台 CPU 架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。

六、JVM 的生命周期

6.1 虚拟机的启动

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

6.2 虚拟机的执行

  • 一个运行中的 Java 虚拟机有着一个清晰的任务:执行 Java 程序
  • 程序开始执行时它才运行,程序结束时它就停止
  • 执行一个所谓的 Java 程序的时候,真真正正在执行的是一个叫做 Java 虚拟机的进程

6.3 虚拟机的退出

有如下的几种情况:

  • 程序正常执行结束
  • 程序执行过程中遇到了异常或错误而异常终止
  • 由于操作系统出现错误而导致 Java 虚拟机进程终止
  • 某线程调用 Runtime 类或 System 类的 exit 方法,或 Runtime 类的 halt 方法,并且 Java 安全管理器也允许这次 exit 或 halt 操作
  • 除此之外,JNI(Java Native Interface)规范描述了用 JNI Invocation API 来加载或卸载 Java 虚拟机是,Java 虚拟机的退出情况
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值