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 的退出情况
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战