当前位置:首页 > 虚拟机 > 正文

java虚拟机运行过程


一、java程序运行的五个步骤

程序从创建源文件到执行程序要经历两个主要步骤:1.源文件被编译器编译成字节码2.字节码被Java虚拟机解释并运行。由于Java程序必须由JVM编译、解释和运行,因此Java被称为“半解释型”语言。

第一步(编译):生成源文件后,程序首先被编译成.class文件。Java编译类时,如果该类所依赖的类还没有被编译过,编译器会先编译依赖的类,然后再引用它,否则直接引用它。如果Java编译器在指定目录中找不到该类所依赖的类的.class文件或.java源文件,编译器将报告“cantfindsymbol”错误。

编译后的字节码文件格式主要分为两部分:静态汇编和方法字节码。静态编译器记录代码中出现的所有标记(类名、成员变量名等)和标记引用(方法引用、成员变量引用等);方法字节码存储类中每个方法的字节码。

第二步(运行):运行Java类的过程大致可以分为两个过程:1.加载类2.执行类。需要注意的是,只有当程序第一次主动使用该类时,JVM才会加载该类。也就是说,JVM一开始并不会把所有的程序类都加载到内存中,而是只在需要使用的时候才加载它们,而且只加载一次。

2.下面是运行程序的详细步骤:

编译Java程序并得到文件后,在命令行中输入javaMain。系统将启动jvm进程。jvm进程从类路径中找到一个名为的二进制文件,并将主类信息加载到运行时数据区的方法区中。

然后JVM找到Main的main函数入口,并开始执行main函数。

主函数的第一条命令是AnimalAnimal=newAnimal("Puppy");是让JVM创建一个Animal对象,但是此时方法区中还没有Animal类的信息,所以JVM立即加载Animal类,并将Animal类的类型信息放入方法中区域。

加载Animal类后,Java虚拟机做的第一件事就是在堆区分配内存给一个新的Animal实例,然后调用构造函数来初始化这个Animal实例,这是一个引用指向。到方法区(包含Method表,Java动态绑定的基本实现)中Animal类的类型信息。

使用ame()时,JVM根据Animal引用查找Animal对象,然后根据找到的引用定位方法区中Animal类的类型信息的方法表通过Animal对象,并获取printName()函数的字节码地址。

首先运行printName()函数。


二、java虚拟机的运行过程

上面详细解释了虚拟机的不同部分。我们通过一个具体的例子来分析一下它的执行过程。
虚拟机的启动是通过调用指定类的main方法,向main传递一个字符串数组参数,从而加载指定的类,并绑定和初始化该类使用的其他类型。例如,对于程序:
publicclassHelloApp{
publicstaticvoidmain(String[]args){
n("HelloWorld!");
for(inti=0;i<;i++){
n(args);
}
}
}
编译后,输入行模式命令:javaHelloApprunvirtualmachine
Java虚拟机将通过调用HelloAppmain方法来启动,并向main传递一个包含“run”、“virtual”和“machine”三个字符串的数组。我们现在描述虚拟机在运行HelloApp时可以遵循的步骤。
我开始尝试运行HelloApp类的main方法,发现该类还没有被加载,意味着虚拟机当前不包含该类的二进制表示,因此虚拟机使用ClassLoader来尝试找到这样的二元代表。如果此过程失败,则会引发异常。一旦类被加载,在调用main方法之前,HelloApp类必须链接到其他类型,然后进行初始化。装订涉及三个步骤:检查、准备和分析。该检查检查加载的主类的符号和语义。准备工作创建类或接口的静态字段,并将这些字段初始化为标准默认值。解析负责检查从主类到其他类或接口的符号引用。步骤,可选。初始化类就是执行类中声明的静态初始化函数和静态字段的初始化构造函数。在初始化一个类之前,必须先初始化其父类。整个流程如下:


三、简述JAVA程序的编辑编译和运行过程

第1步(编译):创建源文件后,程序首先被编译成.class文件。Java编译一个类时,如果该类所依赖的类还没有被编译过,编译器会先编译依赖的类,然后再引用它们。否则,这有点像make。

如果Java编译器在指定目录中找不到该类所依赖的.class文件或.java源文件,则编译器会报告“cantfindsymbol”错误。

第二步(执行):Java类的执行过程大致可以分为以下两个过程。1.加载类2.执行类。请注意,JVM仅在程序第一次主动使用类时加载类。换句话说,JVM最初不会将程序的所有类加载到内存中,而只会在您需要使用它们时加载一次。

特别说明:Java类的所有public和protected实例方法都使用动态绑定机制,所有私有方法、静态方法、构造函数、初始化方法都使用静态绑定机制。使用动态绑定机制时会使用方法表,但使用静态绑定时不会使用方法表。

更多信息:

Java的编译和运行的整个过程非常复杂。本文将使用一个简单的程序简要解释整个过程。

Java代码编译:由Java源代码编译器完成。

Java字节码执行:由JVM执行引擎完成。

有两个Java程序。从创建源文件到运行程序的主要步骤:

1.源文件被编译器编译为字节码(ByteCode)。

2.字节码被Java虚拟化。手术。Java被称为“半解释型”语言,因为Java程序必须由JVM编译、解释和执行。