JVM虚拟机简介

news2024/11/16 1:27:38

e5ab78f1765547279e07fc1337f0324c.gif、 什么是JVM?

 

  JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。

 

  Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。

 

2、JRE/JDK/JVM是什么关系?

  JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台。所有的Java 程序都要在JRE下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可。 

JDK(Java Development Kit)是程序开发者用来来编译、调试java程序用的开发工具包。JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件。 

  JVM(JavaVirtualMachine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。

 

3、JVM原理

这里写图片描述

 

  Java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。

 

4、JVM的体系结构

这里写图片描述

 

(1)java栈内存,它等价于C语言中的栈, 栈的内存地址是不连续的, 每个线程都拥有自己的栈。 栈里面存储着的是StackFrame,在《JVM Specification》中文版中被译作java虚拟机框架,也叫做栈帧。StackFrame包含三类信息:局部变量,执行环境,操作数栈。局部变量用来存储一个类的方法中所用到的局部变量。执行环境用于保存解析器对于java字节码进行解释过程中需要的信息,包括:上次调用的方法、局部变量指针和 操作数栈的栈顶和栈底指针。操作数栈用于存储运算所需要的操作数和结果。StackFrame在方法被调用时创建,在某个线程中,某个时间点上,只有一个 框架是活跃的,该框架被称为Current Frame,而框架中的方法被称为Current Method,其中定义的类为Current Class。局部变量和操作数栈上的操作总是引用当前框架。当Stack Frame中方法被执行完之后,或者调用别的StackFrame中的方法时,则当前栈变为另外一个StackFrame。Stack的大小是由两种类 型,固定和动态的,动态类型的栈可以按照线程的需要分配。 下面两张图是关于栈之间关系以及栈和非堆内存的关系基本描述:

 

这里写图片描述

 

(2) Java堆是用来存放对象信息的,和Stack不同,Stack代表着一种运行时的状态。换句话说,栈是运行时单位,解决程序该如何执行的问题,而堆是存储的单位, 解决数据存储的问题。Heap是伴随着JVM的启动而创建,负责存储所有对象实例和数组的。堆的存储空间和栈一样是不需要连续的。

 

(3)程序计数寄存器,程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

 

  由于Java 虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。如果线程正在执行的是一个Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Natvie 方法,这个计数器值则为空(Undefined)。此内存区域是唯一一个在Java 虚拟机规范中没有规定任何OutOfMemoryError 情况的区域。

 

(4)方法区域(Method Area),在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代。方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。

 

(5)运行时常量池(Runtime Constant Pool),存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。

 

(6)本地方法堆栈(Native Method Stacks),JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/97090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA maven 向项目添加模块时出错创建项目失败

原因一:Maven 版本太新 || Java 版本选择了 JAVA 18 选择 java 版本为1.8构建 即可成功,第一次maven项目建立的时候下图红框内容如图即可 原因二:IDEA 的 maven插件 没有加载完成 通常发生在重设 maven 路径|仓库之后 原因三:mav…

RK3588平台开发系列讲解(RKNN篇)RKNN Android平台开发说明

平台内核版本安卓版本RK3588Linux 5.10Android12🚀返回专栏总目录 文章目录 一、 Android 平台 RKNN API 库二、EXAMPLE 使用说明沉淀、分享、成长,让自己和他人都能有所收获!😄 📢RKNN SDK 为带有 RKNPU 的芯片平台提供编程接口,能够帮助用户部署使用 RKNN-Toolkit2导…

uni-app卖座电影多端开发纪实(六):多端打包

@打包为H5站点 打包站点 HBuilder中菜单中依次点击【发行】-【网站-PC Web或手机H5(仅适用于uni-app)】填写网站标题,点击发行控制台会输出类似如下信息此时站点需要的文件已经被打包到了unpackage/dist/build/h5目录部署站点 复制上一步中生成的h5目录到Nginx的部署目录下…

【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.5 多段线、多边形

本节对应的视频讲解:B_站_视_频 https://www.bilibili.com/video/BV1ZP4y1S7Ax 本节讲解如何绘制多段线、多边形 1. 相关的 API 直接查看官方的帮助文档,可以看到有多个重载的方法用于绘制多段线、多边形 1.1 多段线 将多个点连接形成多段线 比如&…

Linux基础(4)进程管理

该文章主要为完成实训任务,详细实现过程及结果见【参考文章】 参考文章:https://howard2005.blog.csdn.net/article/details/127066383?spm1001.2014.3001.5502 文章目录一、查看进程1. 进程查看命令 - ps2. Liunx进程状态3. 观察进程变化命令 - top4. …

jsp+ssm计算机毕业设计大学教师年终考核管理信息系统【附源码】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JSPSSM mybatis Maven等等组成,B/S模式 Mave…

浅析nvme原子写的应用场景

1.NVMe原子写简介 NVME协议家族,当前发展的已经非常庞大,来张nvme家族大合影。从最开始的NVME Base Spec,又延伸了更加专业聚焦的模块Command Set Spec、Transport Spec,NVME MI Spec等等。 在Command Set Spec中,我们…

【学习笔记】pytest接口自动化测试框架入门(pytest+yaml)

pytest接口自动化测试框架入门(pytestyaml) 文章目录自动化测试需要包含的内容pytest的安装使用pytest默认的测试用例的规则和基础使用:pytest测试用例的运行方式pytest执行测试用例的顺序分组执行pytest跳过测试用例pytest框架前后置处理解(…

智能指针循环引用——你真的懂了吗?

相信不少同学都在面试中都被问到过c智能指针的问题,接踵而至的必定是循环引用了,而我每次的答案都是一招鲜:因为它们都在互相等待对方先释放,所以造成内存泄漏。面试官很满意,我也很满意。 但是为啥要等到对方先释放&…

STM8开发实例-ADC

ADC 1、ADC介绍 ADC 是任何现代微控制器中非常重要的外设。 它用于读取传感器的模拟输出、检测电压电平等。 例如,我们可以使用 ADC 读取 LM35 温度传感器。 传感器的电压输出与温度成正比,因此我们可以使用电压信息来反算温度。 下图是STM8s的ADC外设框图: 在使用 ADC 之…

猿如意|初识CSDN的开发者工具合集

前言: CSDN网站其实不仅仅有博客,虽然整个网站是基于博客开始的,但无疑博客是整个网站的魂。 那么,现在的CSDN还有第二个和第三个魂,就是云计算服务和猿如意了。 猿如意好像是CSDN5 6月份推出的,具体时间…

CSC7715 同步整流

CSC7715是一款用于开关电源的高效率同步整流控制IC。其具备较高的集成度,在有效的提升开关电源的转换效率的同时,减少了外围元器件的应用。CSC7715可用于DCM/QR开关电源系统。该电路内置45V的功率管,在系统中替代次级肖特基管,并提高整个系统…

Typora+PicGo+阿里云OSS

配置Typora 文章目录配置Typora阿里云1)网页搜索阿里云OSS2)注册账号3)点击立刻开通a) 点击“产品价格”b) 初次付费c) 交钱以免造成后续无法访问d)进入管理控制台e) 创建钥匙PicGo1)下载安装2)设置选择显示…

Pandas1.5.2 学习心得

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、pandas是什么? 二、安装 1.pip install pandas 2.Series(系列) 可以通过索引标签获取和设置值 总结 前言 提示:以下是…

深度学习笔记

动手深度学习v2 引言 机器学习中的关键组件 无论什么类型的机器学习,都需要以下组件: 学习的数据转换数据的模型目标函数,量化模型的有效性调整模型参数以优化目标函数的算法 数据 大多时候遵循独立同分布(指随机过程中&…

Java容器源码重点回顾——LinkedList

1. 概述 public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.SerializableLinkedList是实现了List和Deque接口的双端链表。LinkedList的底层数据结构是链表&#xff0c;不支持随机读取&a…

java TCP接收数据

查看本文 你需要先了解 TCP发送数据 如果没有了解过 可以查看我的文章 java TCP发送数据 然后 我们创建一个包 包下创建两个类 sendOut 客户端类 参考代码如下 import java.io.IOException; import java.io.OutputStream; import java.net.Socket;public class sendOut {publ…

13-Java方法

目录 1.方法的基本用法 1.1.什么是方法 1.2.方法定义语法 1.3.方法调用的执行过程 1.4.实参和形参的关系 1.5.方法的返回值 2.方法重载 2.1.方法重载定义 2.2.代码示例 3.方法递归 3.1.方法递归定义 3.2.方法递归使用条件 3.3.递归与非递归优劣比较 3.4.递归执行…

磷脂PEG衍生物Biotin-PEG-DSPE,生物素PEG磷脂,CAS:385437-57-0

英文名称&#xff1a;Biotin-PEG-DSPE、DSPE-PEG-Biotin 中文名称&#xff1a;生物素-聚乙二醇-磷脂 Item no&#xff1a;X-GF-0068-10k Classification&#xff1a;Biotin PEG DSPE PEG CAS&#xff1a;385437-57-0 MV&#xff1a;可定制&#xff0c;2000、1000、3400、1…

241. 楼兰图腾——树状数组

在完成了分配任务之后&#xff0c;西部 314 来到了楼兰古城的西部。 相传很久以前这片土地上(比楼兰古城还早)生活着两个部落&#xff0c;一个部落崇拜尖刀(V)&#xff0c;一个部落崇拜铁锹(∧)&#xff0c;他们分别用 V 和 ∧ 的形状来代表各自部落的图腾。 西部 314 在楼兰…