Java 程序的工作原理

从源码到机器码

把代码写在.java文件中,之后在通过编译工具将.java文件转换为.class文件(也称为字节码文件)细分四个阶段。

1.词汇和语法分析:分析源码的执行逻辑,并将其绘制成一个抽象的语法树。

2.填写符号表:复杂的程序之间会彼此引用,而此阶段就会对这些引用关系做一些预处理。可以理解为,在此阶段会用一些特殊的符号来表示他们之间的关系。

3.注释的处理:所有语言会包含程序与注释,会对注释进行分析和归类。

4.生成字节码:根据前面三个阶段的结果,最终将.java文件转换为.class文件。

.java-->词汇和语法分析-->填写符号表-->注释处理-->生成字节码-->机器码-->操作系统

JDK,JRE,JVM

JDK:Java开发工具包。一个程序从源码到字码需要编译,JDK就提供了这个Javac程序来完成,还包含其工具,如执行程序java,文档工具javadoc和反编译工具javap。实际上JDK就是这些工具加JRE的合集。

JRE:Java运行环境是JVM(Java虚拟机)和一些常用的API(应用程序接口)的合集。

JVM:Java虚拟机,解释并执行字节码。

API(应用程序接口):可以理解为一些已经写好的代码,供我们使用,比如,我们想给一堆数据排序,我们需要一行一行写代码,但我们可以直接使用JDK里面的已经提供好的排序API,直接使用API里某一行的代码就可以。并且为了归类,API以包的形式出现,例如,java.io就是一个汇集了很多文件操作的包,java.lang是汇集了很多程序基础操作的包。

JDK包含JRE与开发工具,JRE包含JVM与API。

Java字节码

Java字节码是Java虚拟机的一种指令格式,先后经过JVM中的类装载器,字节码校验器,解释器。

类装载器:主要功能是寻找和装载程序执行所需要的类,就是把字节文件装到JVM中。

字节码校验器:对字码文件进行校验,保证代码的安全性,负责测试代码段格式并进行规则检查,检查伪造指针,违反对象访问权限,或试图改变权限类型的非法代码。

解释器:具体的平台不认识字节码文件,解释器就把字节码解释成具体平台能认识的东西。

即时编译

JVM可以判断某段字节码是否为高频词使用,如果是,就会把它转换到本地机器码保存,以便下一次直接执行机器码,加快效率

Java跨平台原理

在不同的平台上,按装了不同的Java虚拟机,这些不同的Java虚拟机屏蔽了各个不同平台的差异,从而使用Java程序(字节码文件)具体平台无关性。

JVM与跨平台机制

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

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

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

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

Java跨平台的原因是有适用于不同系统的JRE(Java官方代码:有部分代码(native)会因为不同的操作系统存在差异)

 垃圾回收机制

垃圾回收机制自动释放不再使用的内存空间

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

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

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RiderRole

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值