Java虚拟机简介

2022-09-08 10:28:36 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

JVM概念

● JVM 是 Java Virtual Machine(Java虚拟机)的缩写,是 JRE 的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM 有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java 虚拟机 JVM 是属于 JRE 的,而现在我们安装 JDK 时也附带安装了 JRE (当然也可以单独安装JRE)。

● JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

● Java虚拟机实例负责运行一个Java程序。当启动一个Java程序时,一个虚拟机实例就诞生了。当程序结束,这个虚拟机实例也就消亡。在 Java虚拟机规范中,一个虚拟机实例的行为是分别按照子系统、内存区、数据类型和指令来描述的,这些组成部分一起展示了抽象的虚拟机的内部体系结构。

● 作为一种编程语言的虚拟机,实际上不只是专用于Java语言,只要生成的编译文件匹配JVM对载入编译文件格式要求,任何语言都可以由JVM编译运行。

● Java虚拟机与Java语言并没有必然的联系,他只与特定的二进制文件格式—Class文件格式所关联,Class文件中包含了Java虚拟机指令集(或者称为字节码,Bytecodes)和符号表,还有一些其他辅助信息。

● JVM被分为三个主要的子系统:类加载器子系统、运行时数据区和执行引擎 。

● Java虚拟机的主要任务是装载class文件并且执行其中的字节码。由下图可以看出,Java虚拟机包含:类装载器(class loader)可以从程序和API中装载class文件Java API中只有程序执行时需要的类才会被装载字节码由执行引擎来执行

1、跨平台性

Java 语言最重要的特点就是跨平台运行,使用 JVM 就是为了支持与操作系统无关,实现跨平台。JVM至关重要,正是因为它有针对不同平台的虚拟机,其向上屏蔽了操作系统的差异,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。

(1)针对不同平台的虚拟机

(2)屏蔽操作系统的差异

2、JVM体系结构

JVM的内部体系结构可以大致分为三部分,分别是:类装载器(ClassLoader)子系统、运行时数据区和执行引擎。

(1)类装载器

每一个Java虚拟机都由一个类加载器子系统(class loader subsystem),负责加载程序中的类型(类和接口),并赋予唯一的名字。JVM的两种类装载器包括:启动类装载器和用户自定义类装载器,启动类装载器是JVM实现的一部分,用户自定义类装载器则是Java程序的一部分,必须是ClassLoader类的子类。

(2)运行时数据区

运行时数据区主要包括:方法区,堆,Java栈,PC寄存器,本地方法栈。

● 方法区和堆由所有线程共享

①堆:存放所有程序在运行时创建的对象 ②方法区:当JVM的类装载器加载.class文件并进行解析,把解析的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据放入方法区。

● Java栈、PC寄存器和本地方法栈由线程独享

①JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址。 ②PC寄存器:可以看成是当前线程所执行的字节码的行号指示器。 ③本地方法栈:存储本地方法调用的状态

(3)执行引擎(它或者在执行字节码,或者执行本地方法)

每一个Java虚拟机都有一个执行引擎(execution engine)负责执行被加载类中包含的指令。主要的执行技术有:解释即时编译自适应优化芯片级直接执行。其中解释属于第一代JVM,即时编译JIT属于第二代JVM,自适应优化(目前Sun的HotspotJVM采用这种技术)则吸取第一代JVM和第二代JVM的经验,采用两者结合的方式。 。

自适应优化:开始对所有的代码都采取解释执行的方式,并监视代码执行情况,然后对那些经常调用的方法启动一个后台线程,将其编译为本地代码,并进行仔细优化。若方法不再频繁使用,则取消编译过的代码,仍对其进行解释执行。

3、JVM数据类型

Java虚拟机通过某些数据类型来执行计算。数据类型可以分为两种:基本类型和引用类型。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157071.html原文链接:https://javaforall.cn

0 人点赞