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

java虚拟机执行流程


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