1.2 java程序的工作原理(重

从源码到机器是怎样的过程

在整个 Java 程序的开发流程中,程序员最初是将代码写在后缀为 .java 的文件中,之后再通过编译工具将 .java 文件转换 .class 文件(也称为字节码文件)。这个“转换”过程中,又可以细分为以下四个阶段:

**词汇和语法分析:**分析源码的执行逻辑,并将其绘制成一个抽象的语法树。
**填写符号表:**复杂的程序之间会彼此引用,而此阶段就会对这些引用关系做一些预处理工作。可以理解为,在此阶段会用一些符号来表示各个程序之间的关系。
**注释处理:**几乎所有的编程语言都包含程序和注释两部分,此阶段会对注释进行分析和归类。
**生成字节码:**根据前三个阶段的结果,最终将 .java 文件转换为 .class 文件。
字节码 .class 文件会被解释为机器码,进而在具体的系统平台上执行。以上过程如下所示。

在这里插入图片描述

JDK、JRE 与 JVM 分别是干什么的

JDK(Java Development Kit,Java 开发工具包)是整个 Java 的核心。一个程序从源码到字节码需要编译,在 Java 中,这个编译动作由 JDK 提供的 javac 程序(或命令)来完成。JDK 还提供了执行程序 java、文档工具 javadoc 和反编译工具 javap 等使用工具。JDK 实际就是这些工具和 JRE 的合集。

JDK 提供的 javac 命令可以编译 Java 源文件,提供的 java 命令可以执行 Java 字节码文件、javadoc 命令可以创建 Java文档文件,javap 命令可以反编译 Java字节码文件。

什么是 JRE 呢?**JRE(Java Runtime Environment,Java 运行环境)**是 **JVM(Java Virtual Machine,Java 虚拟机)**和一些常用 **API(Application Programming Interface,应用程序接口)**的合集。

JVM 负责前文提到的解释并执行字节码。那什么是 API 呢?可以将 API 理解为是一些已经写好的、可以供我们直接使用的代码。举个例子,如果要编写一个排序算法该怎么办?除了自己一行一行的编写代码以外,还可以直接使用 JDK 中已经提供好的排序 API,直接使用 API 里的某一行代码就能帮助我们实现排序功能,是不是很方便呢?并且为了归类,API 通常是以“包”的形式体现的,例如 java.io 就是一个汇集了很多文件操作的包,而 java.lang 是一个汇集了很多程序基础操作的包。

综上,可以发现 JDK 包含了开发工具和 JRE,而 JRE 又包含了 JVM 和常用 API,如下图所示。因此,对于开发者而言,就只需要下载并安装 JDK,然后就可以开发并运行 Java 程序了。

在这里插入图片描述

在这里插入图片描述

字节码是什么

ava 的字节码是 Java 虚拟机执行的一种指令格式。

字节码解释过程
如下图所示,Java 字节码文件先后经过 JVM 的类装载器、字节码校验器和解释器,最终在操作系统平台上运行。具体各部分的主要功能描述如下。

  1. 类装载器。其主要功能是为执行程序寻找和装载所需要的类,就是把字节码文件装到 Java 虚拟机中。
  2. 字节码校验器。其功能是对字节码文件进行校验,保证代码的安全性。字节码校验器负责测试代码段格式并进行规则检查,检查伪造指针、违反对象访问权限或试图改变对象类型的非法代码。
  3. 解释器。具体的平台并不认识字节码文件,最终起作用的还是这个最重要的解释器,它将字节码文件翻译成所在平台能识别的东西。
    在这里插入图片描述

什么是即时编译技术

JVM 可判断某段字节码其是否属于使用频率较高的热点代码。如果是,就会将字节码文件转换出的本地机器码保存,以便下次直接执行机器码文件。这使得 Java 程序的执行效率得到很大的提高。

java是如何做到跨平台的

Java 能够拥有如此优秀的跨平台机制,主要归功于 JVM。

JVM 与跨平台机制
JVM 不是一台真实的机器,而是想象中的机器,通过模拟真实机器来运行 Java 程序。 既然是模拟出来的机器,JVM 看起来同样有硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java 程序运行在这个抽象的 Java 虚拟机上,它是 Java 程序的运行环境,也是 Java 最具吸引力的特性之一。

前面提到过,Java 语言的一个重要特点就是平台无关性,接下来将从原理上进一步说明为什么 Java 语言具有这样的平台无关性。实现 Java “一次编译,处处运行” 的关键就是使用了 Java 虚拟机。

例如,使用 C 语言开发一个类似计算器的软件,如果想要使这个软件在 Windows 平台上运行,则需要在 Windows 平台下编译成目标代码,这个计算器的目标代码只能在 Windows 平台上运行。而如果想让这个计算器软件能在 Linux 平台上运行,则必须在对应的平台下编译,产生针对该平台的目标代码,才可以运行。

但对于 Java 而言,则完全不是这样。用 Java 编写的计算器程序(.java 后缀)经过编译器编译成字节码文件,这个字节码文件不是针对具体平台的,而是针对抽象的 Java 虚拟机的,在 Java 虚拟机上运行。而在不同的平台上,会安装不同的 Java 虚拟机,这些不同的 Java 虚拟机屏蔽了各个不同平台的差异,从而使 Java 程序(字节码文件)具有平台无关性。也就是说,Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行,具体原理如下图所示。

在这里插入图片描述

垃圾是什么,怎样进行回收?

垃圾回收机制
在 C++ 中,程序结束运行之前,对象会一直占用内存,并在程序员明确释放之前不能将其所占内存分配给其他对象。

而 Java 的处理方式不同,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。作为初学者,可以简单的理解为,当一个对象不再被其他对象使用时,该对象就会成为一个等待被回收的垃圾对象。

Java 虚拟机提供了一个系统级线程(垃圾回收器线程),它自动跟踪每块被分配出去的内存空间,自动释放被定义成垃圾的内存。在一些书籍或文献中,垃圾回收器通常被称为 GC(Garbage Collection)。

垃圾回收机制能自动释放内存空间,减轻程序员编程的负担,这是 Java 虚拟机具有的一个显著优点。

搭建环境时各路径含义

path:java提供可执行文件的目录,比如:编译java的javac,执行java的java命令
java_home:安装jdk的根目录
class_path:放置java的内路径,也就是配置程序中使用到的字节码class文件的位置,我们写的当前代码用点表示,一部分是jdk提供给我们的代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值