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

java虚拟机可以运行什么文件(哪类文件可以在java虚拟机中执行)


一、Java程序的运行机制是怎么样的?

Java程序的运行机制可以分为以下几个步骤:

编写Java源代码:首先,程序员必须使用Java编程语言编写源代码。Java源代码是扩展名为.java的文本文件,其中包含Java程序的参数和函数。

编译Java源代码:Java源代码需要通过Java编译器编译生成字节码文件。字节码文件是扩展名为.class的二进制文件,其中包含Java程序的指令、变量和方法。

解释和执行字节码文件:Java虚拟机(JVM)负责解释和执行字节码文件。JVM是一种虚拟计算机,它模拟真实计算机的硬件和操作系统,可以运行字节码文件。

类加载:当Java程序执行时,JVM会根据需要动态加载所需的类。Java类库和自定义类都将被加载到内存中。

执行Java程序:JVM会根据程序的逻辑和功能来执行Java程序。程序员可以在程序中使用Java类库和自定义类提供的方法和变量。

垃圾收集:JVM还负责垃圾收集。它会自动回收程序中不再使用的内存空间,防止出现内存泄漏等问题。

编译生成字节码文件->解释并执行字节码文件->加载所需的类->执行Java程序->垃圾收集。


二、我是小菜,大家能说说java虚拟机具体是怎么运行的?和class类的关系的啦Java基础知识非常重要。一旦Java编译器编译出.class文件,我们就需要使用JVM来执行该class文件。那么第一个任务就是将磁盘字节码输入到内存中。这个过程称为【加载】。加载完成后,我们可以进行一系列执行前的准备工作,例如:为类静态变量开辟空间、将常量池存放在方法区内存中、实现解析常量池地址、初始化静态类变量等。本篇我们就来聊聊JVM是如何加载class文件的?
1.加载JVM类的过程
当我们使用命令来运行Java程序(如)时:javaTest
(1)会帮我们找到JRE,然后寻找位于JRE内部。这才是真正的Java虚拟机。最后加载动态库并激活JVM。
(2)虚拟机激活后,首先会执行一些初始化动作,比如读取系统设置等。一旦初始化动作完成,就会生成第一个类加载器——BootstrapLoader(引导类加载器)。
(3)BootstrapLoader所做的初始工作中,除了一些基本的初始化动作外,最重要的就是在中加载ExtClassLoader(扩展类加载器),并将其Parent设置为null,表示其父级加载器是BootstrapLoader。
(4)接下来,BootstrapLoader要求将AppClassLoader(用户定义的类加载器)加载到中,并将其父级设置为之前生成的ExtClassLoader实体。两个加载器都作为静态类存在。
这里请注意,Launcher$和Launcher$都是由BootstrapLoader加载的,所以Parent与它加载的类加载器无关。
初者很难理解这个过程。下面我们将详细解释什么是类加载器和“Parent”。
2.类加载器体系结构
JVM必须通过称为类加载器的程序加载类文件。它的功能是从磁盘中提取要执行的代码字。该节的代码流被加载到内存中(JVM管理的方法区)。这里有几个重要的概念:
(1)引导类加载器:每个JVM实现都必须有一个引导类加载器。它只负责在系统类安装路径(CoreJavaAPI类文件)中查找要加载的类。加载器实现是用C++编写的,是JVM实现的一部分。
(2)扩展类加载器和自定义类加载器:负责加载除核心JavaAPI之外的其他类文件。例如,用于安装或下载标准扩展的类文件、在类路径中找到的类库的类文件、用于运行应用程序的类文件等。这里需要注意一件事:自定义类加载器不是应用程序员自己实现的,它也是JVM
(3)空间名称:JVM为每个类维护一个唯一的标识符。loader.命名空间。Java程序可以多次加载具有相同全名的多个类。JVM必须确定这些“多个类”的唯一性。因此,当多个类加载器加载同名的类时,为了唯一标识该类,必须在类名前添加加载该类的类。。加载器标识符(指示类所在的命名空间)。下图显示了与两个类加载器相关的命名空间。显然,不同的类加载器允许您加载相同的Volcano类。
命名空间使安全实现变得更容易,因为您可以有效地在不同命名空间中加载的类之间放置屏蔽。在JVM中,来自同一命名空间的类可以直接交互,而来自不同命名空间的类甚至无法知道彼此的存在,除非明确提供允许交互的机制。一旦加载,如果允许恶意类访问其他虚拟机加载的当前类,它就可能知道一些它不应该知道的信息,或者干扰程序的正常运行。