JVM 与 Java 体系结构

字节码

1、任何能在 JVM 平台上执行的字节码格式都是一样的,统称为 JVM 字节码

2、不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同的 JVM 上运行

3、JVM 与 Java 语言并没有必然的联系,它只与特定的二进制文件格式:Class 文件格式所关联,Class 文件中包含 JVM 指令集(或者称为字节码、Bytecodes)和符号表,还有一些其他辅助信息

4、在 JVM 中执行的指令称为 Java 字节码指令

 

多语言混合编程

1、Java 平台上的多语言混合编程正成为主流,通过特定领域的语言去解决特定领域的问题,每个应用层都将使用不同的编程语言来完成

2、接口对每一层的开发者都是透明的,各种语言之间的交互不存在任何困难,就像使用语言自带的原生 API 一样方便,因为它们最终都运行在一个虚拟机之上

3、对这些运行在 JVM 之上,Java 之外的语言,来自系统级的、底层的支持正在迅速增强,以 JSR-292 为核心的一系列项目和功能改进,如:Da Vinci Machine 项目、Nashorn 引擎、InvokeDynamic 指令、java.lang.invoke 包等,推动 JVM 从 Java 的虚拟机,向多语言虚拟机的方向发展

 

虚拟机

1、虚拟计算机是一款软件,用来执行一系列虚拟计算机指令

(1)系统虚拟机:完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台,如:Visual Box,Mware

(2)程序虚拟机:专门为执行单个计算机程序而设计,如:JVM

2、不论是系统虚拟机,还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中

 

JVM

1、跨语言的平台

(1)Java 虚拟机是一台执行 Java 字节码的虚拟计算机,它拥有独立的运行机制,其运行的 Java 字节码不全由 Java 语言编译

(2)JVM 平台的各种语言可以共享 JVM 带来的跨平台性、优秀的垃圾回器、可靠的即时编译器

(3)Java 技术的核心就是 Java 虚拟机(JVM,Java Virtual Machine),因为所有的 Java 程序都运行在 Java 虚拟机内部

(4)JVM 设计者们通过 JSR-292 规范,基本实现在 JVM 平台上运行非 Java 语言编写的程序

(5)JVM 根本不关心运行在其内部的程序到底是使用何种编程语言编写的,它只关心字节码文件,即 JVM 拥有语言无关性,只要其他编程语言的编译结果满足并包含 Java 虚拟机的内部指令集、符号表、其他的辅助信息,它就是一个有效的字节码文件,就能够被虚拟机所识别并装载运行

2、作用:二进制字节码的运行环境,负责装载字节码到其内部,解释 / 编译为对应平台上的机器指令执行

3、特点

(1)一次编译,到处运行

(2)自动内存管理

(3)自动垃圾回收功能

4、JVM是运行在操作系统之上的,它与硬件没有直接的交互:用户 -> 字节码文件 -> JVM -> 操作系统 -> 硬件

 

Java 代码执行流程

1、.java(Java 源码)-> Java 编译器 -> .class 字节码

(1)Java 编译器(前端编译器):词法分析 -> 语法分析 -> 语法 / 抽象语法树 -> 语义分析 -> 注解抽象语法树 -> 字节码生成器

2、.class 字节码 -> JVM -> 机器指令 -> 操作系统

(1)JVM:类加载器 -> 字节码校验器 -> 翻译字节码(解析执行)/ JIT编译器(编译执行)

(2)解释器:保证响应时间,逐行解释字节码执行

(3)JIT 编译器(后端编译器):针对热点代码(反复执行的字节码),编译为机器指令,并缓存

 

JVM 三层结构

1、类装载子系统

2、运行时数据区

(1)虚拟机栈

(2)程序计数寄存器

(3)本地方法栈

(4)堆

(5)方法区

3、执行引擎

 

JVM 架构模型

1、Java 编译器输入的指令流

(1)基于栈的指令集架构

(2)基于寄存器的指令集架构

2、基于栈式架构的特点

(1)设计和实现更简单,适用于资源受限的系统

(2)避开了寄存器的分配难题:使用零地址指令方式分配

(3)指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈

(4)指令集更小,编译器容易实现不需要硬件支持,可移植性更好,更好实现跨平台

3、基于寄存器架构的特点

(1)典型应用是 x86 的二进制指令集,比如:传统 PC、Android 的 Davlik 虚拟机

(2)指令集架构则完全依赖硬件,可移植性差

(4)性能优秀、执行更高效

(5)花费更少的指令去完成一项操作

(6)在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令、三地址指令为主

4、由于跨平台性的设计,Java 指令都是根据栈来设计的

(1)不同平台 CPU,架构不同,所以不能设计为基于寄存器的

(2)优点:跨平台,指令集小,编译器容易实现

(3)缺点:性能下降,实现同样的功能需要更多的指令

 

JVM 生命周期

1、虚拟机的启动

(1)引导类加载器(bootstrap class loader),创建一个初始类(initial class)完成启动

(2)初始类由虚拟机的具体实现指定

2、虚拟机的执行

(1)一个运行中的 JVM 有着一个清晰的任务:执行 Java 程序

(2)程序开始执行时,JVM 才运行;程序结束时,JVM 就停止

(3)执行一个 Java 程序时,实质执行 JVM 进程

3、虚拟机的退出

(1)程序正常执行结束

(2)程序在执行过程中,遇到异常或错误而异常终止

(3)由于操作系统用现错误而导致 JVM 进程终止

(4)某线程调用 Runtime 类 / system 类的 exit 方法,或 Runtime 类的 halt 方法,并且 Java 安全管理器也允许这次 exit 或 halt 操作

(5)除此之外,JNI(Java Native Interface)规范描述了用 JNI Invocation API 来加载,或卸载 Java 虚拟机时,JVM 的退出情况

posted @   半条咸鱼  阅读(32)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示