本文最后更新于64 天前,如有错误请发送邮件到3270403724@qq.com,欢迎大家纠错
前言
如果直接讲解Java的运行原理,可能会造成概念的局限性,所以,会先以运行原理来对编程语言进行分类,之后在介绍本节的主体内容。
编程语言分类
按运行原理分类,编程语言通常分为编译型、解释型、和混合型,以下进行简单介绍:
- 编译型语言:编译型在程序运行之前,源代码会一次性通过编译器转译成目标平台的机器码,生成可执行文件(例如
.exe
文件)。编译完成后,不需要额外的解释器或虚拟机支持即可直接运行。eg:C、C++、Rust、Go。 - 解释型语言:解释型语言无需编译,代码通过解释器逐行解释并执行。解释器会逐行将源代码转换为机器码并立即执行,因此不生成独立的可执行文件。eg:Python、JavaScript、Ruby。
- 混合型语言:混合型是折中了编译型和解释型。首先将代码编译成中间代码(如字节码),然后通过虚拟机(VM)解释执行中间代码或通过JIT(即时编译)优化执行。eg:Java、C#、Kotlin。
附(给初学者看的):可以这么看,编译型语言就是他人一次性将所学的内容(源码)整理(转成机器码)到一个文档(可执行文件)中,而你只需要查看文档进行学习即可。解释型语言就是传统课堂教学,你需要慢慢的听老师(解释器)讲解,逐步吸收。混合型语言就是现代线上教学,机构往往会先整理出一份PPT(中间代码),之后会让相应的老师(VM)结合PPT进行讲课。(解释器和VM是不同的)
编译型语言直接生成机器码,运行不需要中间商,所以运行速度最高,但编译后的二进制文件与操作系统和硬件相关,所以不同平台上不能直接运行,跨平台需重新编译代码。
解释型语言依赖解释器运行,只要有支持该语言的解释器,程序就能在任何平台上运行。但解释器逐行翻译代码,每次执行都需要解析,性能不如编译型语言。
混合型语言结合了编译型和解释型的优点。代码编译为与平台无关的中间代码,依赖虚拟机实现跨平台能力,同时,虚拟机中的JIT编译器会对热点代码进行编译和优化,使得性能接近编译型语言。这样在保持跨平台性的同时,提升了执行性能。不过需要虚拟机支持,应用程序的启动速度可能稍慢。
类别 | 编译型语言 | 解释型语言 | 混合型语言 |
---|---|---|---|
典型语言 | C, C++, Rust | Python, JavaScript, Ruby | Java, C#, Kotlin |
性能 | 高,直接生成机器码 | 低,逐行解释执行 | 较高,JIT动态优化 |
跨平台 | 缺乏,需重新编译 | 强,依赖解释器支持 | 强,JVM等虚拟机支持跨平台 |
内存管理 | 手动管理 | 解释器自动管理 | 垃圾回收机制 |
启动速度 | 快,直接运行可执行文件 | 较慢,逐行解释 | 初次慢,JIT后加速 |
Java运行流程
Java属于混合型语言,它的运行过程是一个从源代码到可执行程序的复杂流程,运行流程可简化成:编写源代码 ⇒ 编译源代码 ⇒ 运行程序。
- 编写源代码:使用文本编辑器(如Notepad++、Sublime Text)或集成开发环境(IDE,如IntelliJ IDEA、Eclipse)编写Java源代码。Java源代码文件通常以“.java”为扩展名。
- 编译源代码:使用Java编译器(javac)将源代码转换为字节码。编译后的文件以“.class”为扩展名。
- 运行程序:将生成的
.class
文件提交给 JVM 加载、执行,并在程序结束时进行资源回收。
JVM
Java虚拟机JVM是一种虚拟化的执行环境(说白了就是一个运行代码的平台 (゚3゚)~♪ ),用于执行Java字节码,负责将编译后的Java字节码翻译为特定平台的机器代码。作用如下:
- 跨平台性:Java通过编译器将源代码编译为平台无关的字节码,再通过JVM解释或编译成机器码执行。这种设计使得Java具有“一次编写,处处运行”的特性。只要设备上安装了JVM,Java字节码就能运行在任意操作系统上。
- 内存管理:JVM自动管理内存,带有垃圾回收机制,帮助开发者管理和清理内存。
- 安全性:JVM会进行安全检查和管理,避免恶意代码的执行,并提供运行时检查来确保程序的安全性。
JVM的结构和主要组件
JVM主要由类加载子系统、运行时数据区、执行引擎以及一些辅助组件构成。
- 类加载器子系统:负责将Java字节码文件(
.class
文件)加载到内存中准备进行解释和执行。 - 运行时数据区:JVM在执行Java程序时存储数据的内存区域。(方法区、堆区、Java栈、本地方法栈、程序计数器)
- 执行引擎:执行引擎负责将字节码翻译成机器码并执行。它包含两个核心组件:(1)解释器:逐行解释字节码,将其转换为机器码并立即执行。这一方式适合初始执行,但性能较低。 /(2)即时编译器(JIT):在运行时分析程序,识别热点代码(频繁执行的代码),并将它们直接编译为机器码,极大的提高执行效率。
- 垃圾回收器:JVM自动管理内存,通过垃圾回收器来定期回收不再使用的对象。GC会扫描堆区并清除未被引用的对象,回收内存空间,降低内存泄漏的风险。
此外,JVM还包括一些辅助组件,如本地库接口(JNI),它允许Java程序调用其他语言编写的本地库(如C/C++库)。
小结
JVM是Java程序的执行核心。通过解释和即时编译的结合,不仅实现了跨平台性,还通过垃圾回收和自动内存管理提供了良好的运行时性能和开发便利性。JVM的存在使得Java成为一门高效、稳定且安全的编程语言。