当前位置: 首页 > Web前端 > HTML5

精通Java,先研究它的执行原理

时间:2023-04-05 21:32:47 HTML5

对于任何一门语言,要想达到精通的程度,研究它的执行原理(或者叫底层机制)都是一个不错的途径。在本文中,我们将重点关注java源码的执行原理,即程序员从编写JAVA源码到最终产品形成的整个过程都经历了什么?每个步骤是如何执行的?执行的原则是什么?1、编写java源程序Java源文件:指存放java源代码的文件。在这里,小编建了一个前端学习交流按钮群:132667127,自己整理的最新前端资料和进阶开发教程。有需要的可以加群一起学习交流。我们先看下面的代码://MyTest被public修饰,所以存放java源码的文件名为MyTestpublicclassMyTest{publicstaticvoidmain(String[]args){System.out.println("TestJava执行过程.");}}//因为MyTest是public修饰的,所以A类不能用public修饰classA{}//因为MyTest是public修饰的,所以B类不能用public修饰classB{}1.名称java源文件的类名就是源文件中public类的名字2.一个java源文件可以包含多个类,但是只允许一个类是public2.编译java源代码当java源程序是coded,它需要由编译器编译。安装好jdk后,我们打开jdk目录,里面有两个.exe文件,分别是javac.exe(编译源代码,xxx.java文件)和java.exe(执行字节码,xxx.class文件)。如下图显示:1、切换到MyTest.java文件夹下2、用javac.exe编译MyTest.java后,发现e:\Blogs目录下多了以class为后缀的文件:A.class,B.classandMyTest.classTip:javac.exe编译java源码的时候,java源码有几个类,会编译成对应的字节码文件(.class文件)。其中,字节码文件的文件名就是各个类的类名。需要注意的是,即使类没有在源文件中定义,但是被源文件引用了,编译后也会编程对应的字节码文件。比如A类引用了C类,但是A类的源文件中并没有定义C类,C类编译后也被编译成对应的字节码文件C。每天访问技术博文推送。3、执行java源文件执行java源文件,用java.exe执行到现在。java源程序基本上是执行结果,正确打印预期结果。那么,上面的步骤可以总结如下:综上所述,JVM中的Execution已经抽象出来了。接下来我们就来分析字节码文件(.class文件)在虚拟机中是如何一步步执行的。四、JVM如何执行字节码文件1.加载字节码文件。.java源代码被javac.exe编译器编译成.class字节码文件后,接下来的工作就交给了JVM。JVM首先通过类加载器(ClassLoader)将类文件和相关的JavaAPI加载到JVM中,供JVM进行后续处理。该阶段涉及以下基本概念和知识。1)JDK、JRE和JVM的关系JDK(JavaDevelopmentKit),Java开发工具包,主要用于开发,在JDK7之前,JDK包括JREJRE(JavaRuntimeEnvironment),Java程序运行的核心环境,包括JVM和一些核心库JVM(JavaVirtualMachine),VM是计算设备的一种规范,是一种虚拟的计算机,是在实际计算机上模拟各种计算机功能来实现的,是JRE的核心模块。2)JVMJVM是计算设备的规范。它是在实际计算机上模拟各种计算机功能而实现的虚拟计算机。Java虚拟机的主要任务是加载类文件并执行其中的字节码。在不同的Java虚拟机中,执行引擎可能有不同的实现。引擎大致有以下几类:一次性字节码解释引擎、实时编译引擎、自适应优化器、虚拟机实现方式,使用软件、硬件、软硬件组合,具体要看具体厂商。3)什么是ClassLoader虚拟机的主要任务是加载class文件并执行其中的字节码,class文件是由虚拟机的类加载器(ClassLoader)完成的。可能有多个类加载器。任何java应用程序都可能使用两种类加载器,即启动类加载器(bootstrap)和用户自定义类加载器。启动类加载器是Java虚拟机唯一实现的一部分,分为原始类加载器、系统类加载器或默认类加载器。它的主要功能是从操作系统的磁盘中加载相应的类,比如JavaAPI类。User-definedloadingclasses,即以用户自定义的方式加载类。2.将字节码文件存放在JVM内存区JAVA虚拟机运行程序的时候,需要内存来存放很多东西。例如字节码、程序创建的对象、传递给方法的参数、返回值、局部变量、操作的中间结果等,这些相关信息被组织到“运行时数据区”中。根据制造商的不同,在Java虚拟机中,运行时数据区也不同。有些运行时数据区由线程共享,有些只能由特定线程共享。运行时数据区大致可以分为几个区域:方法区、堆区、栈区、PC寄存器区和本地方法栈区。该阶段涉及以下基本概念和知识。1)方法区方法区用于存放解析加载类文件的相关信息。当一个类文件被虚拟加载时,它会从类文件中包含的二进制数据中解析出类型信息,然后将相关信息存储在方法区中。2)堆堆用来存放相关的引用类型,比如新建的对象。程序运行时,虚拟机将程序在运行时创建的所有对象都放入堆中。3)PC寄存器PC寄存器主要用于存放线程。当一个新的线程被创建时,该线程会得到自己的PC寄存器(程序计数器)和一个java栈。Java虚拟机没有寄存器,其指令集使用Java栈来存储中间数据。4)栈区栈区主要用来存放值类型,比如基本数据类型。需要注意的是,String是引用类型,存储在堆中。Java堆栈由许多堆栈帧组成。堆栈帧包含Java方法调用的状态。当一个线程调用一个方法时,虚拟机将一个新的栈帧压入该线程的Java栈中。当方法返回时,这个堆栈帧从Java堆栈中弹出。3.执行引擎与运行时数据区交互。运行时数据区为执行引擎提供执行环境和相关数据。执行引擎与运行时数据区进行交互,获取执行所需的相关信息,存储执行的中间结果等。4.执行引擎与native方法接口当要执行native方法时,执行引擎会调用nativemethod接口获取相关的OSnative方法。请注意,本机方法与操作系统紧密耦合。5.JVM在特定操作系统上执行。JVM通过调用本地接口获取本地方法,从而实现在特定平台上执行。比如在Linux系统上执行,在Windows系统上执行,在Unix系统上执行。

猜你喜欢