执行Java代码的原则。
对任何语言来说,想要达到精通的程度,就必须研究其执行原理(或称为底层机制),这并不是一个好方法。
这篇文章主要关注java源代码的执行方式,也就是从程序员编写JAVA源代码到最终产品的形成,在这一过程中经历了什么?如何执行每个步骤呢?什么是执行原则呢?
执行Java代码的原则。
编写java源代码。
java源文件:表示用于存储java源码的文件。
首先看一下下面的代码:
MyTest是由public来修饰的,所以存储java源代码的文件名是MyTest。
发布类我测试{
publicstaticvoidmain(字符串[]){
(a)System.out.println(“TestJavaexecuteprocess.”);
}
}
因为MyTest是由public修饰的,所以ClassA不能由public修饰。
类A{}
因为MyTest是由public修饰的,所以ClassB不能由public修饰。
类B{}
java源文件名是public类在源文件中的名称。
执行Java代码的原则。
一个java源文件可以包含多个类,但是只允许有一个public类。
编译java源代码。
在结束java源程序的编码之后,需要编译器编译。
jdk安装完成之后,打开jdk目录,其中包含两个.exe文件:javac.exe(编译源代码,xxx.java)和java.exe(执行字节码,xxx.class)。
下面的图表显示:
执行Java代码的原则。
切换到MyTest.java文件夹。
执行Java代码的原则。
javac.exe编译MyTest.java
执行Java代码的原则。
在编译之后,发现e:Blogs目录中有更多的文件,后缀为class:A.class、B.class和MyTest.class。
执行Java代码的原则。
tip:当javac.exe编译java源代码时,java源代码中有几个类,它们被编译成相应的bytecode文件(.class文件)
在这个类中,字节码文件的文件名就是类的名称。一定要注意,即使没有在源文件中定义类,也会被源文件引用,编译之后,编程相应的字节码文件。
例如,A类引用C类,C类没有定义在A类的源文件中,C类被编译为C.class对应的字节码文件。
tips:关注微信公众号:Java后台,获取每日的技术博客推送。
执行java源代码文件。
在java.exe中执行java源文件。
执行Java代码的原则。
目前,java源程序基本执行了结果并正确打印了预期结果,按照上述步骤,我们可以总结如下:
执行Java代码的原则。
如上文所述,在JVM中的执行是抽象的。下一步,我们将分析字节码文件(.class文件)是如何在虚拟机中逐步执行的。
JVM如何执行字节码文件。
装入字节码文件。
在javac.exe编译器将.java源码编译成.class字节码文件之后,JVM就可以完成接下来的工作了。
首先,JVM通过类加载器(ClassLoader),将class文件和相关的JavaAPI装载到JVM中,以便JVM随后进行处理。
这一阶段包括以下几个基本概念和知识。
JDK、JRE和JVM之间的关系。
jdk(JavaDevelopmentKit),Java开发工具包,主要用于开发,在jdk7之前JDK包含了JRE。
JavaRuntimeEnvironment是运行Java程序的核心环境,包括JVM和一些核心库。
Java虚拟机(VM),VM是一种计算设备的规范,它是一种虚构的计算机,通过在实际计算机上模拟各种不同的计算机功能来实现,VM是JRE的核心模块。
二、JVM。
JVM是一种计算设备的规范,它是一台虚构的计算机,通过在实际计算机上模拟各种计算机功能来实现。
JavaVirtualMachine的主要任务是装载class文件并执行其中的字节码,在不同的JavaVirtualMachine中,执行引擎可能有不同的实现。
发动机大体上有以下几种:
一次解释字节码引擎。
立即编译引擎
适应性最优器。
至于虚拟机的实现方式,就是软件方式、硬件方式和软件硬件结合的方式,这个要根据具体厂商来定。
什么是ClassLoader呢?
虚拟机的主要任务是装入class文件并在其中执行字节码,而class文件是由虚拟机的类装入器(ClassLoader)完成的,在一个Java虚拟机中可能会有多个类装入器。
任意一个java应用程序,都可以使用两种类装入器,即启动类装入器和用户自定义类装入器。
startclassloader是Java虚拟机唯一实现的一部分,它也可以被划分为原始类装载器、系统类装载器或默认类装载器。其主要作用是装载来自操作系统磁盘的对应类,例如JavaAPI类等。
Usercustomloading类,也就是按照用户自定义的方式进行装入。
执行Java代码的原则。
在JVM内存中存储字节码文件。
在JAVA虚拟机运行程序时,它需要有内存来存储很多东西。
例如字节码、由程序创建的对象、传递给方法的参数、返回值、局部变量和操作的中间结果等等,这些相关信息都组织成“运行时数据区”。
在Java虚拟机中,运行时数据区因厂商而异。一些运行时数据区被线程共享,而另一些仅能被特定的线程共享。
运行期数据区大致可以划分为几个区域:方法论区域、堆区、栈区、PC寄存器区域和本地方法栈区。
这一阶段涉及到以下基本概念和知识。
一、方法区。
方法区用于存储有关已加载class文件的解析信息。
在虚拟装入class文件之后,它从该class文件包含的二进制数据中解析类型信息,然后将其存储在方法空间中。
二、堆。
heap用于存储new对象等相关引用类型。在一个程序运行时,这个虚拟机会将它在运行时创建的所有对象放入堆中。
三、电脑登记程序。
个人计算机的寄存器主要用于存储线程。在新建线程时,该线程都会获得自己的PC寄存器(程序计数器)和java栈。
JAVA没有寄存器,它的指令集使用Java栈存储中间数据。
四、栈区
主要用于存储诸如基本数据类型等值类型。一定要注意,String是引用类型,并且存在于堆中。
JavaScript是由多个栈帧组成的,其中一个栈帧包含Java方法调用的状态,当线程调用某个方法时,该虚拟机将进入到该线程的Java栈,当该方法返回时,该栈帧将弹出Java栈。
执行Java代码的原则。
执行引擎与运行时数据区进行交互。
RuntimeData为执行引擎提供了执行环境和相关数据,它通过与RuntimeData交互,从而获得执行所需的相关信息,存储执行的中间结果等等。
执行Java代码的原则。
执行引擎与本地方法进行接口。
执行引擎在执行本地方法时调用本地方法接口,以获得相关的OS本地方法。
必须注意,本地方法与操作系统是强耦合的。
执行Java代码的原则。
JVM是在特定的操作系统上执行的。
JVM通过调用一个本地接口获得一个本地方法,从而实现在一个特定平台上执行。例如,它可以在Linux系统、Window系统和Unix系统上运行。
更多精彩内容:
https://www.yaoruanwen.com/n/477550.html
https://www.yaoruanwen.com/n/477555.html
https://www.yaoruanwen.com/n/477565.html
https://www.yaoruanwen.com/n/477570.html
https://www.yaoruanwen.com/n/477577.html