首页 > 后端开发 > 正文

什么是java虚拟机,简述其工作机制

2024-06-28 13:48:00 | 我爱编程网

最近经常有小伙伴私信询问什么是java虚拟机,简述其工作机制相关的问题,今天,我爱编程网小编整理了以下内容,希望可以对大家有所帮助。

本文目录一览:

什么是java虚拟机,简述其工作机制

什么是java虚拟机,简述其工作机制

Java虚拟机处于机器和编译程序之间,在任何平台上都提供给编译程序一个共同的接口。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。 Java虚拟机的主要任务是装载class文件并且执行其中的字节码。Java虚拟机包含一个类装载器,它可以从程序和API中装载class文件。字节码由执行引擎来执行。 Java虚拟机结构   类装载器的体系结构是Java虚拟机在安全性和网络移动性上发挥重要作用的一个方面,图中所示的类装载器可以包含多个类装载器的子系统, Java应用程序能够在运行时决定需要安装的类,并且将被不同的类装载器装载的类存放在不同的命名空间。   执行引擎处于Java虚拟机的核心位置,它的行为由指令集所决定,其主要作用就是解释字节码(即运行经过编译后的Java程序的class文件) ,不同的执行引擎实现可能非常不同。由软件实现的虚拟机的执行引擎分为一次性解释字节码、即时编译器和自适应优化器,由硬件芯片构成的虚拟机用本地方法执行Java字节码,它的执行引擎是内嵌在芯片里。   Java虚拟机相当于一个堆栈计算机,它在指令间传送信息时不使用任何物理寄存器,而使用堆栈的帧来表示方法的状态、字节码的操作对象、方法的参数空间及局部变量的空间,它的“程序计数器”为一个伪寄存器,是当前所执行指令的字节码数组的一个指针。   Java实现方法   Java有两种实现方法:Java方法和本地方法。Java方法是由Java 语言编写,编译成字节码,存储在class文件中。本地方法是由其他语言(比如C,C++,或者汇编语言)编写的,编译成和处理器相关的机器代码,保存在动态连接库中,格式是各个平台专有的,它是联系Java程序和底层主机操作系统的连接方法。Java方法与平台无关,但是本地方法却不是,运行中的 Java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。通过本地方法, Java程序可以直接访问底层操作系统的资源,使程序和特定的平台相关,一个本地方法接口——Java本地接口(JNI)使得本地方法可以在特定的主机系统的任何一个Java平台上运行。

什么是java虚拟机,简述其工作机制

java工作原理

Java工作原理

由四方面组成:

(1)Java编程语言

(2)Java类文件格式

(3)Java虚拟机

(4)Java应用程序接口

当编辑并运行一个Java程序时,需要同时涉及到这四种方面。使用文字编辑软件(例如记事本、写字板、UltraEdit等)或集成开发环境(Eclipse、MyEclipse等)在Java源文件中定义不同的类 ,通过调用类(这些类实现了Java API)中的方法来访问资源系统,把源文件编译生成一种二进制中间码,存储在class文件中,然后再通过运行与操作系统平台环境相对应的Java虚拟机来运行class文件,执行编译产生的字节码,调用class文件中实现的方法来满足程序的Java API调用 。

什么是java虚拟机,简述其工作机制

Java运行机制。

我爱编程网(https://www.52biancheng.com)小编还为大家带来Java运行机制。的相关内容。

java的运行流程

一,我们所看不到的:

1,如果java文件没有package,就默认给文件加上"无名"package;

2,默认导入java.lang包,所以我们的java程序中可以使用Sting,Math,Integer等类,包括一些异常类;

3,如果生成的类没有父类,则为这个类隐式加上父类:Object;因此,包括Object中的许多方法可以使用;

4,字段的初始化;

二,我们所看的到的:

既然看的到,就先看程序运行结果:

public class JRun1 {

public JRun1() {

System.out.println(" 构造函数");

}我爱编程网

static

{

System.out.println("static{}");

}

{

System.out.println("{}");

}

public static void main(String[] args) {

System.out.println("main()");

}

}

运行结果:

static{}

main()

显然,程序运行时,先运行:

static

{

System.out.println("static{}");

}

再调用main();

注意: 我们可以得到一个副产品:不用main方法也能运行的程序:

public class JRun1 {

static

{

System.out.println("no main()");

System.exit(0);

}

}

如果我们在类中建立一个对象:

public class JRun1 {

public JRun1() {

System.out.println(" 构造函数");

}

static

{

System.out.println("static{}");

}

{

System.out.println("{}");

}

public static void main(String[] args) {

System.out.println("main()");

new JRun1();

}

}

运行结果:

static{}

main()

{}

构造函数

从而,我们得出:

建立一个非主类对象,顺序为:静态初始化块static{}-->初始化块{}-->构造函数constructor;

那么,牵涉到继承,运行流程又如何?

看程序:

class JRun1Father{

JRun1Father(){

System.out.println("父类构造函数");

}

static{

System.out.println("父类静态初始化块");

}

{

System.out.println("父类初始化块");

}

}

public class JRun1 extends JRun1Father{

public JRun1() {

System.out.println("子类构造函数");

}

static

{

System.out.println("子类静态初始化块");

}

{

System.out.println("子类初始化块");

}

public static void main(String[] args) {

//System.out.println("主方法)");

new JRun1();

}

}

运行结果:

父类静态初始化块

子类静态初始化块

父类初始化块

父类构造函数

子类初始化块

子类构造函数

所以,牵涉到父类:父静态-->子静态-->父初始化及构造-->子初始化及构造;

注意:初始化块和构造是接连运行的,不会父类子类交替.

以上就是我爱编程网小编整理的内容,想要了解更多相关资讯内容敬请关注我爱编程网。更多相关文章关注我爱编程网:www.52biancheng.com

免责声明:文章内容来自网络,如有侵权请及时联系删除。
与“什么是java虚拟机,简述其工作机制”相关推荐