一文带你认识JVM

🚗🚗🚗今天给大家分享的关于JVM的一些基本认识。

清风的CSDN博客

🛩️🛩️🛩️希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流!

✈️✈️✈️动动你们发财的小手,点点关注点点赞!在此谢过啦!哈哈哈!😛😛😛

目录

一、JVM简介 

1.1 JVM 发展简史 

1.1.1 Sun Classic VM

1.1.2 Exact VM  

1.1.3 HotSpot VM  

1.1.4 JRockit 

1.1.5 J9 JVM  

1.1.6 Taobao JVM(国产研发) 

二、JVM 运行流程

2.1 JVM执行流程

 三、JVM 运行时数据区

 3.1 堆(线程共享)

3.2 Java虚拟机栈(线程私有)

3.3 本地方法栈(线程私有)  

3.4 程序计数器(线程私有)   

3.5 方法区(线程共享) 

3.6 运行时常量池 


一、JVM简介 

       JVM 是 Java Virtual Machine 的简称,意为 Java虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统,常见的虚拟机:JVM、VMwaveVirtual Box

JVM 和其他两个虚拟机的区别:
  • VMwaveVirtualBox是通过软件模拟物理CPU的指令集,物理系统中会有很多的寄存器。
  • JVM则是通过软件模拟Java字节码的指令集,JVM中只是主要保留了PC寄存器,其他的寄存器都进行了裁剪。

JVM 是一台被定制过的现实当中不存在的计算机。

1.1 JVM 发展简史 

1.1.1 Sun Classic VM

       早在 1996 Java1.0 版本的时候, Sun 公司发不了一款名为 Sun Classic vm java 虚拟机,它同时也是世界上第一款商业java 虚拟机, jdk1.4 时完全被淘汰。 这款虚拟机内部只提供解释器。 如果使用JIT 编译器,就需要进行外挂,但是一旦使用了 JIT 编译器, JIT 就会接管虚拟机的执行系统。解释器就不再工作。解释器和编译器不能配合工作,现在 Hotspot 内置了此虚拟机。

1.1.2 Exact VM  

       为了解决上一个虚拟机问题, jdk1.2 时, sun 提供了此虚拟机。 Exact 具备现代高性能虚拟机的雏形,包含了一下功能:
  • 热点探测(将热点代码编译为字节码加速程序执行)。
  • 编译器与解析器混合工作模式。
只在 Solaris 平台短暂使用,其他平台上还是 classic vm,英雄气短,终被Hotspot 虚拟机替换。

1.1.3 HotSpot VM  

        最初由一家名为 “Longview Technologies” 的小公司设计,1997年,此公司被 Sun 收购; 2009 年, Sun 公司被甲骨文收购,JDK1.3时, HotSpot VM 成为默认虚拟机。
目前 HotSpot 占用绝对的市场地位,称霸武林。 不管是现在仍在广泛使用JDK6 ,还是使用比较多的 JDK8 中,默认的虚拟机都是 HotSpot、 Sun/Oracle JDK和 OpenJDK 的默认虚拟机。从服务器、桌面到移动端、嵌入式都有应用。 名称中的HotSpot 指的就是它的热点代码探测技术。它能通过计数器找到最具编译价值的代码,触发即时编译(JIT) 或栈上替换,通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡。

1.1.4 JRockit 

        JRockit 是专注于服务器端应用,目前在 HotSpot 的基础上,移植 JRockit 的优秀特性。 它可以不太关注程序的启动速度,因此JRockit 内部不包含解析器实现,全部代码都靠即时编译器编译后执行。大量的行业基准测试显示,JRockit JVM 是世界上最快的 JVM。 使用JRockit 产品,客户已经体验到了显著的性能提高(一些超过了 70% )和硬件成本的减少(达50%)。
优势:全面的 Java 运行时解决方案组合。
JRockit  面向延迟敏感型应用的解决方案  JRockit Real Time  提供以毫秒或微秒级的 JVM 响应时间,适合财务、军事指挥、电信网络的需要。
MissionControl 服务套件,它是一组以极低的开销来监控、管理和分析生产环境中的应用程序的工具。2008, BEA Oracle 收购。 Oracle表达了整合两大优秀虚拟机的工作,大致在 JDK8 中完成。整合的方式是在 HotSpot 的基础上,移植JRockit 的优秀特性。

1.1.5 J9 JVM  

全称: IBM Technology for Java Virtual Machine ,简称 IT4J ,内部代号: J9
市场定位于 HotSpot 接近,服务器端、桌面应用、嵌入式等多用途 JVM ,广泛用于 IBM 的各种 Java产品。 目前,有影响力的三大商用虚拟机之一,也号称是世界上最快的 Java 虚拟机 ( IBM 自己的产品上稳定 )。 2017 年左右, IBM 发布了开源 J9 VM ,命名 OpenJ9 ,交给 Eclipse 基金会管理,也称为 Eclipse  OpenJ9

1.1.6 Taobao JVM(国产研发) 

AliJVM 团队发布。阿里,国内使用 Java 最强大的公司,覆盖云计算、金融、物流、电商等众多领域,需要解决高并发、高可用、分布式的复合问题。有大量的开源产品。 基于OpenJDK 开发了自己的定制版本 AlibabaJDK, 简称 AJDK 。是整个阿里 JAVA 体系的基石。基于OpenJDK HotSpot JVM 发布的国内第一个优化、深度定制且开源的高性能服务器版 Java 虚拟机,它具有以下特点:
  • 创新的GCIH(GC invisible heap)技术实现了off-heap,即将生命周期较长的Java对象从heap中移heap之外,并且GC不能管理GCIH内部的Java对象,以此达到降低GC的回收评率和提升GC的回收效率的目的。
  • GCIH中的对象还能够在多个Java虚拟机进程中实现共享。
  • 使用crc32指令实现JVM intrinsic降低JNI的调用开销;
  • PMU hardwareJava profiling tool和诊断协助功能;
  • 针对大数据场景的ZenGC 
taobao JVM 应用在阿里产品上性能高,硬件严重依赖  intel  cpu, 损失了兼容性,但提高了性能,目前已经在淘宝、天猫上线,把Oracle 官方 JVM 版本全部替换了。

二、JVM 运行流程

JVM Java 运行的基础,也是实现一次编译到处执行的关键,那么 JVM 是如何执行的呢?

2.1 JVM执行流程

        程序在执行之前先要把  java  代码转换成字节码( class 文件), JVM 首先需要把字节码通过一定的方式  类加载器   把文件加载到内存中 运行时数据区   ,而字节码文件是 JVM 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器 执行引擎 将字节码翻译成底层系统指令再交由 CPU 去执行,而这个过程中需要调用其他语言的接口 本地库接口 来实现整个程序的功能,这就是这 4 个主要组成部分的职责与功能。

总结来看, JVM 主要通过分为以下 4 个部分,来执行 Java 程序的,它们分别是:
  • 类加载器
  • 运行时数据区
  • 执行引擎
  • 本地库接口

 三、JVM 运行时数据区

JVM 运行时数据区域也叫内存布局,但需要注意的是它和 Java 内存模型( (Java Memory Model ,简称JMM)完全不同,属于完全不同的两个概念,它由以下 5 大部分组成:

 3.1 堆(线程共享)

堆的作用:程序中创建的所有对象都在保存在堆中。
堆里面分为两个区域:新生代和老生代,新生代放新建的对象,当经过一定 GC 次数之后还存活的对象会放入老生代。新生代还有 3 个区域:一个 Endn + 两个 Survivor S0/S1 )。

垃圾回收的时候会将 Endn 中存活的对象放到一个未使用的 Survivor 中,并把当前的 Endn 和正在使用的 Survivor 清楚掉。(关于垃圾回收,我后续会给大家详细介绍)。

3.2 Java虚拟机栈(线程私有)

         Java 虚拟机栈的作用: Java 虚拟机栈的生命周期和线程相同, Java 虚拟机栈描述的是 Java 方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame )用于存储局部变量表、操作数栈、动态链接、方法出口等信息。咱们常说的堆内存、栈内存中,栈内存指的就是虚拟机栈。
Java 虚拟机栈中包含了以下 4 部分:

  • 局部变量表: 存放了编译器可知的各种基本数据类型(8大基本数据类型)、对象引用。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在执行期间不会改变局部变量表大小。简单来说就是存放方法参数和局部变量。
  • 操作栈:每个方法会生成一个先进后出的操作栈。
  • 动态链接:指向运行时常量池的方法引用。
  • 方法返回地址:PC 寄存器的地址。

3.3 本地方法栈(线程私有)  

 本地方法栈和虚拟机栈类似,只不过 Java 虚拟机栈是给 JVM 使用的,而本地方法栈是给本地方法使用的。

3.4 程序计数器(线程私有)   

程序计数器的作用:用来记录当前线程执行的行号的。
程序计数器是一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。 如果当前线程正在执行的是一个Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。
如果正在执行的是一个 Native 方法,这个计数器值为空。 程序计数器内存区域是唯一一个在JVM 规范中没有规定任何 OOM 情况的区域!

3.5 方法区(线程共享) 

方法区的作用:用来存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据的。

3.6 运行时常量池 

运行时常量池是方法区的一部分,存放字面量与符号引用。
  • 字面量 : 字符串(JDK 8 移动到堆中) final常量、基本数据类型的值。
  • 符号引用 : 类和结构的完全限定名、字段的名称和描述符、方法的名称和描述符。

小结 


🚗🚗🚗好啦,今天的分享就到这里,别说还挺晕的,哈哈哈。多看几遍就行啦!也有可能是我没有给大家表述清楚,有什么问题欢迎大家指出。

🎉🎉🎉创作不易,还希望各位大佬支持一下!

✈️✈️✈️点赞,你的认可是我创作的动力!

⭐⭐⭐收藏,你的青睐是我努力的方向!

✏️✏️✏️评论:你的意见是我进步的财富!

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Lambda表达式超详解

目录 背景 Lambda表达式的用法 函数式接口 Lambda表达式的基本使用 语法精简 变量捕获 匿名内部类 匿名内部类中的变量捕获 Lambda的变量捕获 Lambda表达式在类集中的使用 Collection接口 List接口 Map接口 总结 背景 Lambda表达式是Java SE 8中的一个重要的新特性.…

cygwin64环境搭建

文章目录 cygwin64环境搭建概述为了编译GNU软件需要安装的组件如下当缺软件的时候, 可以用搜索功能END cygwin64环境搭建 概述 cygwin64主页 https://cygwin.com/ 用起来确实有用linux的感觉, 而且兼容性特别好. GNU的工程全部能编译过. 编译后的exe在win10上也运行的很正正…

Python教程(17)——python模块是什么?python模块详解

Python模块简介 模块是一个包含了Python定义和语句的文件,可用于将功能组织成可重用和可维护的代码块。每个Python文件都可以作为一个模块,模块可以包含变量、函数、类或可执行代码。通过使用模块,我们可以将代码分离成逻辑单元,…

代码规范-代码注释,及注释辅助工具

文章目录 代码规范-代码注释,及注释辅助工具1.常见代码块注释提示标签2.JSDoc3.注释格式 参考:https://knightyun.github.io/2020/03/13/js-comment-format 代码规范-代码注释,及注释辅助工具 1.常见代码块注释提示标签 descfileauthorpara…

抖音小店怎么做?三大核心做好,一周起店不是问题!

大家好,我是电商糖果 有不少朋友说自己的店铺开好之后,不会做。 店铺一直没有流量,也不出单。 糖果做电商七年了,做抖店四年了,不敢自夸自己做店有多牛逼。 但是一个项目我可以做四年之久,我的做店方法…

条款 9:绝不在构造和析构过程中调用虚函数

假设有个类的继承体系,用于建模股票交易,例如买入订单、卖出订单等。此类交易是可审计的,因此每次创建交易对象时,都需要在审计日志中创建适当的条目。 class Transaction { // 所有交易的基类 public: Transaction();virtual vo…

RIPEMD加密算法:原理、应用与安全性

一、引言 在信息时代,数据安全愈发受到重视,加密算法作为保障信息安全的关键技术,其性能和安全性备受关注。RIPEMD(RACE Integrity Primitives Evaluation Message Digest)加密算法作为一种著名的哈希函数&#xff0c…

Folium基础使用-python创建交互式地图与标记

使用 Folium 创建交互式地图与标记 Folium 是一个基于 Leaflet.js 的 Python 库,用于创建交互式地图。下面我们将分别介绍 folium.Map 和 folium.Marker 的使用,展示如何创建一个简单的地图并在上面添加标记点。 创建地图 - folium.Map 首先&#xff…

Stream流的简单使用

stream流的三类方法 获取Stream流 ○ 创建一条流水线,并把数据放到流水线上准备进行操作中间方法 ○ 流水线上的操作 ○ 一次操作完毕之后,还可以继续进行其他操作终结方法 ○ 一个Stream流只能有一个终结方法 ○ 是流水线上的最后一个操作 其实Stream流非常简单,只…

毕设之-消息系统设计(websocket+netty)

文章目录 前言技术选型基本架构 前言 long time no see。 前几天去一家小公司待了待,果断还是选择跑路,第三天就去另一家公司考察环境,和主管聊了两个多小时,非常愉快,就是单位薪资砍了一半。哎,旧事莫提了…

如何给linux内核的config增加新驱动选项?

Kconfig 在Kconfig中添加config选项,可以参考其他同级配置,CAN_F81601最终选中后,会传给Makefile为CONFIG_CAN_F81601,而tristate后面的则是在menuconfig中的文本提示,只要只管可以理解均可 config CAN_F81601trista…

摄影企业网站搭建的作用是什么

几乎每个成年人都有一部手机,在互联网信息时代,手机的作用不言而喻,拍照/摄像成为了不少人经常会做的事,拍一张美美的照片发到社交圈赢得赞声,或是为以后留下回忆或发给自己在意的人,但这只限于生活记叙类图…

玩转大数据21:基于FP-Growth算法的关联规则挖掘及实现

1.引言 关联规则挖掘是大数据领域中重要的数据分析任务之一,其可以帮助我们发现数据集中项目之间的关联关系。关联规则挖掘是指在交易数据或者其他数据集中,发现一些常见的关联项,如购物篮中经常一起出现的商品组合。关联规则挖掘的应用非常…

【FPGA 器件比较】Altera -- Xilinx

比较以下市场前二名的产品线及定位 应用场景XilinxAltera高性能VersalAgilex F/I性能Virtex / Kintex / Artix / Zynq UltraScaleAgilex F/I / Stratix 10中档Virtex / Kintex / Zynq ~ 7 / UltraScaleStratix 10 / Arria 10低成本Artix-7 Sparton-7Cyclone 10 如上表&#x…

【C++】STL 容器 - stack 堆栈容器 ① ( stack 堆栈容器特点 | stack 堆栈容器与 deque 双端数组容器对比 | 简单示例 )

文章目录 一、 stack 堆栈容器简介1、stack 堆栈容器引入2、stack 堆栈容器特点3、stack 堆栈容器与 deque 双端数组容器对比 二、 代码示例 - stack 堆栈容器简单示例1、代码示例2、执行结果 一、 stack 堆栈容器简介 1、stack 堆栈容器引入 C 语言中的 STL 标准模板库 中的 s…

【Java】springmvc

文章目录 SpringMVC1、SpringMVC简单入门2、请求与响应2.1、请求映射路径2.2、接收请求参数2.3、接收请求体2.4、Convertor接口2.5、接收时间日期2.6、响应数据 3、REST风格RESTful快速开发 4、异常处理器5、拦截器5.1、拦截器制作5.2、拦截器三个方法的参数5.3、拦截器链 Spri…

excel统计分析——S-W正态性检验

参考资料: [1]马兴华,张晋昕.数值变量正态性检验常用方法的对比[J].循证医学,2014,14(02):123-128. 统计推断——正态性检验(图形方法、偏度和峰度、统计(拟合优度)检验)_sm.distributions.ecdf-CSDN博客 【统计学】…

智能优化算法应用:基于向量加权平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于向量加权平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于向量加权平均算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.向量加权平均算法4.实验参数设定…

LabVIEW与PID在温度测控系统中的应用

LabVIEW与PID在温度测控系统中的应用 本案例介绍LabVIEW在温度控制系统中的应用,特别是结合PID算法。项目使用abVIEW作为主要开发工具,配合NI PCI-7831R数据采集和控制设备,实现了高效的温度调节。 系统的核心在于LabVIEW的FPGA模块&#x…

基于JAVA的超市账单管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3.3 后端设计在这里插入图片描述 四、系统展示五、核心代码5.1 查询供应商5.2 查询商品5.3 新增超市账单5.4 编辑超市账单5.5 查询超市账单 六、免责说明 一、摘要 1.1 项目介绍 基于…