程序员潇然 发表于 2022-8-30 10:25:17

java运行基础jvm简介 (一)

Java虚拟机规范官方文档

`https://docs.oracle.com/javase/specs/index.html`

其中以java8的为

`https://docs.oracle.com/javase/specs/jvms/se8/html/index.html`

看下官方的介绍的一节

> **The Java Virtual Machine**
>
> Java虚拟机是Java平台的基石。是java实现硬件和操作系统的独立性(也就是无关性),生成极小体积的编译代码,以及保护用户免受恶意程序攻击的的关键技术组成部分。
>
> Java虚拟机是一种抽象计算机器。像真正的计算机一样,它有一个指令集以及在运行时各种内存区域。
> 使用虚拟机实现编程语言是相当普遍的;
> 最著名的虚拟机可能是 P-Code machine of UCSD Pascal.
>
> Java虚拟机的第一个原型实现是在Sun Microsystems inc.完成的,它在手持设备上仿真实现了Java虚拟机指令集,该设备类似于现在的个人数字助理(PDA)。Oracle现在已经将许多java虚拟机实现应用于 移动设备 pc 服务器等领域,但是Java虚拟机不局限于任何特定的实现技术、主机硬件或主机操作系统。也不局限于特定的代码执行方式,虽然不强求使用解释器来执行程序,但是也可以通过将它的指令集编译成一个实际的CPU来实现。它也可以在微代码microcode实现,也可以直接在CPU中实现。
>
> Java虚拟机对Java编程语言一无所知,只知道一种特定的二进制格式,class文件格式。一个class文件包含Java虚拟机指令集(或者称之为字节码bytecode)和符号表,以及其他辅助信息。
>
> 基于安全方面的考虑,Java虚拟机在class文件中施加了许多强制性的语法和结构化约束,凡是能用class文件正确表达出来的编程语言,都可以放在Java虚拟机里面执行。由于它是一个通用的、机器无关的执行平台,所以其他语言的实现者都可以考虑将Java虚拟机作为那些语言的交付媒介。

### **java的组成部分**

* Java语言规范
* Java 应用程序编程接口 API
* Java class文件格式规范
* Java虚拟机

**java语言规范**

java语言规范决定了你要怎么书写你的源代码

也就是java的语法句法词法结构组成,数据类型长度等,对于java语言本身的描述

比如主函数需要时public static void main(String[] args){ 为什么使用public而不是common表示公用?这就是java语言规范的作用

**java应用程序编程接口**

Java应用程序API 也就是java设计者提供的基本的功能方法,比如访系统资源

API之主要目的是提供应用程序与开发人员以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

提供API所定义的功能的软件称作此API的实现。API是一种接口,故而是一种抽象。

应用程序接口为:"电脑操作系统(Operating system)’或‘程序库’提供给应用程序调用使用的代码

其实所有的功能也都是依赖操作系统本身的,比如读取文件,获取文件的属性

如果一个操作系统,本身就没有网络通信的功能,你是不可能在上面完成网络通信程序的开发的

**Java class文件格式规范**

编译后被Java虚拟机执行的一种二进制文件格式

这是一种统一的明确的格式 一般以文件的形式存储

其实就是java虚拟机的"机器语言"

**Java虚拟机**

读取class文件,解析class文件并执行,实际运行java的机器

一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。

编写任何一个程序你都会用到这四个技术领域

### 无关与相关的辩证关系

JVM是平台相关的,不同的平台有不同的虚拟机
但是她在不同的平台上提供统一一致的JVM虚拟指令集,对具体的平台进行抽象封装
不管运行在何种平台,他们提供一致性的操作与访问形式
从JVM本身的平台相关性,转变成为JAVA语言的平台无关性

class文件是源代码编译后的平台无关的二进制文件格式,
不依赖于特定的硬件与操作系统表示形式
是JVM可以识别执行的语言,相当于JVM的机器语言
也就是说,不管何种语言,如果一旦能够编译成为符合规范的class文件格式
就能够被JVM进行执行! 这就相当于实现了语言无关性

可以说,java设计者的野心很大, class文件 与JVM的结合,语言无关加上平台无关

!(data/attachment/forum/202208/30/102034yp9xxbdbaxiicrfo.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

### java语言实现与运行原理

!(data/attachment/forum/202211/08/163829quy3nnnyk3xf2n2u.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

上图以做菜为例,简单描述下Java基础的运行过程

再回头看下java技术体系,可以很清晰的看得出来
java的语言实现与运行原理
Java语言规范 和 Java 应用程序编程接口 API 提供了使用Java语言解决问题的方式
Java class文件格式规范 和Java虚拟机 则约定了Java的运行原理

class文件是对源代码的编译,不仅仅具有语言无关性的好处
源代码是以对人友好的方式,class文件是机器友好的,通过对原始文件进行特殊的处理与转换,能够提高运行的性能,将一部分工作前置
class文件既然是对于源代码的转换描述
自然是会涉及到java中的各种数据类型,方法调用,常量等等的描述与表示
JVM既然是解析class文件进行解析执行,自然是需要解析class文件,并且能够读取验证文件的格式以及语法格式,然后进行装载运行

所以说想要了解Java的运行原理
最基本的两个部分就是class文件的结构组成以及JVM的运行区域内存的管理
Java语法中所有的一切都要能够表示出来
比如数据类型 引用类型还是基本类型 字段属性 方法 公有私有 静态 非静态 如何表示描述
以及必要的信息,比如当前对象的this等等
某种程度上来说 class文件就是源代码针对于java虚拟机的"注解版" ,将你知道的语法表示出来
然后还有潜在的隐藏的信息,比如父类信息等

对于一个已经定义好的class文件,JVM需要进行一系列严格的验证
因为一个class文件可能不是由一个标准的编译器生成的也可能被别人恶意篡改过
所以JVM必须验证
验证之后还需要进行装载把数据信息装载到内存中,然后进行初始化等等
这就是JVM涉及到的部分
所以说想要弄明白java的运行原理需要了解清楚class文件的结构以及JVM的运行内存划分

### 使用javap查看编译后的文件

!(data/attachment/forum/202208/30/102114tl1kbg1qjjvvgk52.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

**javap -v HelloWolrd.class查看**

!(data/attachment/forum/202208/30/102215oxbftrlwlkwmlkxd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

上图中的信息不必较真,我也是随便标注了个别比较好辨别的点
但是你完全可以发现
class文件对于源文件的完整表述,类信息,字段信息 方法信息 涉及到的常量与其他类的调用等等
class文件是一张巨大的表
信息是单独存放的,可以把行号#XXX 理解成地址,
如下图所示,从头不断地根据地址信息串联起来,知道最终的叶子数据信息,形成一张巨大的信息表

!(data/attachment/forum/202208/30/102230lfpw4ciqrzrcoak5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

比如

!(data/attachment/forum/202208/30/102249gypnxoanla49ni8o.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

!(data/attachment/forum/202208/30/102256ll5uzo5ovn1x6bjf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

再次重申,这些就相当于JVM的机器语言了,有数据,有指令,JVM要做的就是解析执行了
当然,是一项很复杂的工作

另外javap还有很多其他命令

!(data/attachment/forum/202208/30/102317kk9rqjxvyvzxfex9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

!(data/attachment/forum/202206/16/141330jha7st9soow8772i.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "common_log.png")
`转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-182-1-1.html `
页: [1]
查看完整版本: java运行基础jvm简介 (一)