Lesson 3,JVM Architecture
(Java虚拟机体系结构 )
LiFan(李凡)
Chengdu University of Information Technology
The Department Of Computer Science
2005
冯 ·诺依曼体系结构
? 计算机之父 —— 约翰 ·冯 ·诺依曼
John Von Neumann (1903-1957)
20世纪科学界最著名的全
才大师,在数学、物理学、经
济学等方面都有极高的成就,
一生会七种语言,而其在计算
机发展历史中的地位无人能及
,被誉为,计算机之父,,他
所提出的计算机体系结构被称
为,冯 ·诺依曼”体系结构,
今天绝大多数的计算机都是按
照这一体系结构设计实现的。
冯 ·诺依曼体系结构
? 冯 ·诺依曼机包括五大组成部分,
- 运算器 C
- 逻辑控制器 LC
- 存储器 M
- 输入设备 I
- 输出设备 O
什么是虚拟机?
? 虚拟机是一种对计算机物理硬件计算环境的
软件实现
? 虚拟机是一种抽象机器,内部包含一个解释
器 (Interpreter),可以将其它高级语言编译为
虚拟机的解释器可以执行的代码 (称这种代
码为中间语言 Intermediate Language),实现
高级语言程序的可移植性
虚拟机的优点
? 平台无关性 (System Independence)
? 安全 (Security)
无论是运行在嵌入式设备还是多个处理器的服
务器上,虚拟机都执行相同的指令,所使用的支持
库也具有标准的 API和完全相同或相似的行为。
虚拟机可以根据要求对其中执行的程序进行控
制,使其无法访问虚拟机运行的操作系统的其它资
源。
什么是 Java虚拟机 (JVM)?
? Java虚拟机 (JVM)是专门针对 Java语言设计
的一种虚拟机实现,有自己的指令系统 (字
节码 ),用软件模拟了处理器、堆栈、寄存
器等计算机物理组件,可以运行 Java语言编
译后得到的字节码程序,实现了 Java程序的
可移植性
理解 Java程序可移植性
? 一经编写,随处运行?
? JVM规范的一严一宽
? 更好的理解 — WOCRAC
- JVM规范对可移植代码的严格性
- JVM规范对虚拟机实现的宽松性
Write Once Carefully,Run Anywhere Conditionally,
(精心编写一次就可以有条件的到处运行 )
JVM的体系结构
? JVM由多个组件构成,包括,
- 类装载器 (Class Loader)
- 字节码解释器 (Bytecode Interpreter)
- 安全管理器 (Security Manager)
- 垃圾收集器 (Garbage Collector)
- 线程管理 (Thread Management)
- 图形 (Graphics)
JVM体系结构图




字节码
解释器
安全管理器
垃圾收集器
线程管理
图形
Java Virtual Machine
Operating System


码 *.
cla
ss


类装载器 (Class Loader)
? 类装载器负责加载 (load)类的字节码文
件,并完成类的链接和初始化工作
类的加载步骤
? 把要加载的类名转换为类的字节码文件名,并在环
境变量 CLASSPATH指定的每个目录搜索该文件
? 把字节码文件读入缓冲区
? 将类转换为 JVM内部的数据结构
? 使用校验器检查类的合法性
? 如何类是第一次被加载,则对类中的静态数据进行
初始化
? 加载类中所引用的其它类
? 把类中的某些方法编译为本地代码
字节码解释器 (Bytecode Interpreter)
? JVM使用单字节长度的操作码,被称为“字
节码”
? 字节码可以看作是 JVM的汇编语言
? JVM定义了 14类 200多个单字节指令
? 字节码解释器是整个 JVM的核心组件,负责
解释执行由类装载器加载的字节码文件中的
字节码指令集合,并通过 Java运行时环境
(JRE)由底层的操作系统实现操作
优化字节码解释器
? 使用汇编语言编写解释器
? 重组指令流,提高处理器的吞吐量
? 最大程度的使用高速缓存
? 最大程度的使用寄存器
安全管理器 (Security Manager)
? 安全管理器根据一定的安全策略 (security
policy)对 JVM中指令的执行进行控制,主要
包括那些可能影响下层操作系统的安全性或
者完整性的 Java服务调用
? 每个类装载器都与某个安全管理器相关,安
全管理器负责保护系统不受由加载器载入系
统的类企图执行的违法操作所侵害
? 默认的类转载器使用信任型安全管理器
垃圾收集器 (Garbage Collector)
? 垃圾收集器用于检测不再使用的对象,并将
它们所占用的内存回收
? Java语言并不是第一个使用垃圾收集技术的
语言,垃圾收集是一种成熟的技术,早期的
面向对象语言 LISP,SmallTalk等已经提供
了垃圾收集机制
? 理想的垃圾收集应该回收所有形式的垃圾,
如网络连接,I/O路径等
JVM中垃圾收集的启动方式
? 请求式:调用 System.gc()方法请求 JVM进行
垃圾收集
? 要求式:使用 new方法创建对象时,如果内
存资源不足,则 JVM进行垃圾收集
? 后台式:通过一个独立的线程检测系统的空
闲状态,如果发现系统空闲了多个指令周期,
则进行垃圾收集
终结器方法 (finalize)
? 终结器方法是对垃圾收集的补充,JVM保证
在对象回收以前调用对象的 finalize()方法
? finalize方法的声明形式,
protected void finalize() {…}
? finalize方法的设计缺陷
垃圾收集的不可预期性、对象复活问题
? 应该尽量避免使用 finalize方法,如果必须使
用,应使该方法的执行时间尽量短
线程管理 (Thread Management)
? 线程的概念
? Java在语言级别提供了对线程的支持,Java
语言提供了专门 API来启动、停止线程,改
变线程的优先级以及处理线程执行过程中发
生的中断
? 线程管理组件中的 分派器 (Dispatcher)负责控
制线程的切换,调度器 (Scheduler)负责决定
线程的运行
多线程的实现机制
? 使用内核线程 (Kernel Threads)
? 使用内核线程的优点
内核线程是由操作系统的内核提供的基本服务。
- 很容易扩展到多个处理器
- 线程在创建它的进程外可见
- JVM可以利用操作系统提供的优秀的调度机制
多线程的实现机制
? 使用库线程 (Library Threads)
? Sun的绿色线程库 (Greenthreads Library)
? 使用库线程的优点
如果操作系统不提供内核线程的服务,或者操
作系统支持的内核线程不满足 JVM的需要,JVM则
通过自己提供的线程库来支持多线程
- 线程在不同的平台上具有一致的行为
- 线程的优先级仅在一个进程中有意义
输入 /输出 (Input/Output)
? Java提供了两种访问 I/O设备的途径,
- 直接调用操作系统提供的与 I/O相关的库
函数
- 通过 AWT支持异步的用户界面 I/O,通过
网络包支持异步的网络 I/O
? 用纯的 Java语言不能编写设备驱动程序
图象 (Graphics)
? 抽象窗口工具包 (AWT)
? AWT的实现机制与不足
? 更强的图形表现能力 Swing
? 触摸屏界面的支持 Truffles
Assignment (作业 )
? 根据你对虚拟机的理解,谈谈你认为虚
拟机最有可能的两种用途,并说明理由
? 请分别分析使用内核线程和使用库线程
实现多线程的缺点
? 编写程序观察 finalize方法和请求式、要
求是垃圾收集的执行效果 (提示:可以
使用 System类和 Runtime类 )