大家好,又见面了,我是你们的朋友全栈君。
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