浅谈JVM及原理

news2024/11/17 13:20:26

393f4739fafa43298c2336492a820d6e.jpgJVM一直是java知识里面进阶阶段的重要部分,如果希望在java领域研究的更深入,则JVM则是如论如何也避开不了的话题,本系列试图通过简洁易读的方式,讲解JVM必要的知识点。

 

 

运行流程

 

  我们都知道java一直宣传的口号是:一次编译,到处运行。那么它如何实现的呢?我们看下图:

 

image

 

  java程序经过一次编译之后,将java代码编译为字节码也就是class文件,然后在不同的操作系统上依靠不同的java虚拟机进行解释,最后再转换为不同平台的机器码,最终得到执行。这样我们是不是可以推演,如果要在mac系统上运行,是不是只需要安装mac java虚拟机就行了。那么了解了这个基本原理后,我们尝试去做更深的研究,一个普通的java程序它的执行流程到底是怎样的呢?例如我们写了一段这样的代码:

 

public class HelloWorld { public static void main(String[] args) { System.out.print("Hello world"); } }

 

这段程序从编译到运行,最终打印出“Hello world”中间经过了哪些步骤呢?我们直接上图:

 

image

 

  java代码通过编译之后生成字节码文件(class文件),通过:java HelloWorld执行,此时java根据系统版本找到jvm.cfg,各位可以搜索一下自己电脑上的jvm.cfg文件在哪,它会根据你的系统版本放在不同的位置,比如我的这个文件就在:C:\Program Files\Java\jdk1.8.0_101\jre\lib\amd64\jvm.cfg,打开看一下:

 

S{6G7J8WOT3$)72FL1DW5U7

 

  这是我电脑上的文件,其中-server KNOWN就表示名称为server的jvm可用。如果这时你搜索一下你电脑上jvm.dll,你就会发现它一定在你的某个server目录下,比如我的:C:\Program Files\Java\jdk1.8.0_101\jre\bin\server\jvm.dll。简而言之就是通过jvm.cfg文件找到对应的jvm.dll,jvm.dll则是java虚拟机的主要实现。接下来会初始化JVM,并且获取JNI接口,什么是JNI接口,就是java本地接口,你想啊java被编译成了class文件,JVM怎么从硬盘上找到这个文件并装载到JVM里呢,就是通过JNI接口(它还常用于java与操作系统、硬件交互),找到class文件后并装载进JVM,然后找到main方法,最后执行。

 

 

 

 

 

JVM基本结构

 

 

 

 

 

  可能通过上面的描述,大家对JVM运行流程有了一个粗略的认识,那么JVM内部到底是怎么执行一个class文件的呢,也就是上图中最后一步第6步的内部细节是怎样的呢?要了解这个问题,我们首先得看一下JVM的内部结构:

 

image

 

  从这个结构不难看出,class文件被jvm装载以后,经过jvm的内存空间调配,最终是由执行引擎完成class文件的执行。当然这个过程还有其他角色模块的协助,这些模块协同配合才能让一个java程序成功的运行,下面就详细介绍这些模板,它们也是后面学习jvm最重要的部分。

 

 

 

 

 

内存空间:

 

 

 

 

 

JVM内存空间包含:方法区、java堆、java栈、本地方法栈。

 

方法区是各个线程共享的区域,存放类信息、常量、静态变量。

 

java堆也是线程共享的区域,我们的类的实例就放在这个区域,可以想象你的一个系统会产生很多实例,因此java堆的空间也是最大的。如果java堆空间不足了,程序会抛出OutOfMemoryError异常。

 

java栈是每个线程私有的区域,它的生命周期与线程相同,一个线程对应一个java栈,每执行一个方法就会往栈中压入一个元素,这个元素叫“栈帧”,而栈帧中包括了方法中的局部变量、用于存放中间状态值的操作栈,这里面有很多细节,我们以后再讲。如果java栈空间不足了,程序会抛出StackOverflowError异常,想一想什么情况下会容易产生这个错误,对,递归,递归如果深度很深,就会执行大量的方法,方法越多java栈的占用空间越大。

 

每个帧代表一个方法,Java方法有两种返回方式,return和抛出异常,两种方式都会导致该方法对应的帧出栈和释放内存。

 

 ③ 栈运行原理

     栈中的数据都是以栈帧(Stack Frame)的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法和运行期数据的数据集,当一个方法A被调用时就产生了一个栈帧F1,并被压入到栈中,A方法又调用了B方法,于是产生栈帧F2也被压入栈,B方法又调用了C方法,于是产生栈帧F3也被压入栈…… 依次执行完毕后,先弹出后进......F3栈帧,再弹出F2栈帧,再弹出F1栈帧。

     遵循“先进后出”/“后进先出”原则。

    帧的组成:局部变量区(包括方法参数和局部变量,对于instance方法,还要首先保存this类型,其中方法参数按照声明顺序严格放置,局部变量可以任意放置),操作数栈,帧数据区(用来帮助支持常量池的解析,正常方法返回和异常处理)。

 

本地方法栈角色和java栈类似,只不过它是用来表示执行本地方法的,本地方法栈存放的方法调用本地方法接口,最终调用本地方法库,实现与操作系统、硬件交互的目的。

 

PC寄存器,说到这里我们的类已经加载了,实例对象、方法、静态变量都去了自己改去的地方,那么问题来了,程序该怎么执行,哪个方法先执行,哪个方法后执行,这些指令执行的顺序就是PC寄存器在管,它的作用就是控制程序指令的执行顺序。

 

执行引擎当然就是根据PC寄存器调配的指令顺序,依次执行程序指令。

 

 

 

静态变量+常量+类信息+运行时常量池存在方法区中,实例变量存在堆内存中。

 

 基本类型的变量和对象的引用变量都是在函数的栈内存中分配。

 

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

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

相关文章

【SSM项目案例】数据库增删改查-完整代码

一、搭建环境 1)spring环境搭建 2)spring整合springmvc框架 目的:在controller中能成功调用service对象的方法 在项目启动时,加载applicationContext.xml的配置文件,在web.xml中进行配置 在controller中注入servic…

星巴克激战瑞幸:“咖啡老三们”的危险时刻

老大和老二“打架”,老三却“伤”得不轻。 在国内品牌界,经常出现这种颇有意思的商业现象。凉茶界里的加多宝和王老吉相互厮杀,排在后面的和其正声势渐弱。可口可乐和百事可乐不断较量,结果非常可乐消失了。 眼下在国内的咖啡圈…

这可能是全网最详细的python安装教程(windows)

python安装是学习pyhon第一步,很多刚入门小白不清楚如何安装python,今天我来带大家完成python安装与配置,跟着我一步步来,很简单,你肯定能完成。 第一部分:python安装 (一)准备工作…

CocosCreator3.4.2源码渲染流程解读

首先上一张脑图镇楼,有些流程还有待后续补充,但是整个刷新过程差不多都完成了。 在上一个xmind文件地址https://download.csdn.net/download/m0_37609239/87254684 接下来就正式开始讲代码: 每帧刷新渲染还是从mainloop开始讲,前面…

华为机试 - 对称美学

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 对称就是最大的美学,现有一道关于对称字符串的美学。已知: 第1个字符串:R第2个字符串:BR第3个字符串:RBBR第4个字符串:BRRBRBBR…

达标的字符串

1、题目 给定一个数 NNN,想象只由 0 和 1 两种字符组成的所欲长度为 NNN 的字符串。 如果某个字符串,任何 0 字符的左边都有 1 紧挨着,认为这个字符串达标。 返回有多少达标的字符串。 2、思路 前几项推导: 两种解法&#x…

【滤波专题-第6篇】小波阈值去噪方法看这一篇就明白了~(附MATLAB实现)

小波阈值去噪的算法是近些年比较流行的一种滤波方法,由于其阈值函数有着众多的改进方式和改进空间,改进阈值函数也往往可以作为创新点和亮点写到论文中,所以对于正在搞相关研究的同学们写论文是比较友好的(轻松水论文方式1&#x…

【高并发】超卖一人一单问题

一、超卖问题 1. 超卖场景 高并发场景下用户下单,存在如下所示的超卖问题,其产生的主要原因是一个线程刚读出库存值,还没进行修改时,另一个线程也读出来该库存值,从而导致这两个线程在进行下单时,对同一个…

【无人机】基于Matlab实现四旋翼无人机几何跟踪控制

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

红星美凯龙寻找「反弹线」

文|螳螂观察 作者| 青月 疫情三年,绝大多数企业都处在「水深火热」之中,到今天,这个情况仍未得到改善。 作为自媒体,「螳螂观察」的感触颇深,疫情之前对一家企业表示肯定的词一般是「暴涨」、「同比大增」&#xff…

C语言竞赛

目录 1059:C语言竞赛 输入格式: 输出格式: 输入样例: 输出样例: 思路: 1.结构: 2.判断素数 3.输出宽度调整 代码: 时间复杂度: 总结: 题目链接: 1059:C语言竞赛 C 语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛。…

vue3+vite使用element-plus

前言: vue3vite的项目中使用 element-plus的教程。 官方地址: 安装 | Element Plusa Vue 3 based component library for designers and developershttps://element-plus.gitee.io/zh-CN/guide/installation.html#%E6%B5%8F%E8%A7%88%E5%99%A8%E7%9B%B…

考研408数据结构 · 开端

引言数据结构在学什么对C语言掌握要求数据结构三要素逻辑结构数据运算存储结构数据结构在学什么 如何把问题信息化 场景:现在需要将1000本不同类型的书摆放到图书馆的书架上。研究问题:采取什么办法摆放?方法有: ① 不管不顾从头…

进程优先级与环境变量

目录 一、进程优先级 1.优先级与权限 2.查看进程优先级 3.PRI与NI 4.修改进程的优先级 5.进程优先级的注意事项 二、进程的其他概念 1.竞争性 2.独立性 3.并行和并发 三、环境变量 1.什么是环境变量 2.环境变量的分类 3.查看环境变量内容 (1&#xf…

uniapp easycom教程

easycom 是 uniapp 的一种组件自动引入的规则,使用这种规则可以使满足规则的组件无需注册直接使用。 接下来我们来看一眼效果 这里可以看到我并没有进行组件注册而是直接使用了组件,这样的效果就是通过 easycom 的自定义规则来实现的。 来看一眼我的自…

pandas模块使用介绍

pandas模块使用介绍1.pandas简介 ​ pandas 是基于NumPy 的一种工具,该工具是为解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。…

专访 | 徐鹏程:开源,就是酷

OpenMLDB: 请先来一段自我介绍吧。 徐鹏程: 我本科就读于上海交通大学,硕士在伊利诺伊大学香槟分校,专业都是电子与计算机工程,感兴趣的方向有机器学习在生物信息等领域的应用、计算机系统与架构、分布式系统等。平时…

Java数据结构与Java算法学习Day08---关于树的深度学习(简略笔记记录)

目录 一、平衡树 119 1.1 2-3查找树 119 1.1.1 2-结点和3-结点的含义 119 1.1.2查找 120 1.2 2-3查找树的插入 121 1.2.1 向2-结点中插入新建 121 1.2.2向一棵树只含有一个3-结点的树中插入新建 121 1.2.3向一个父结点为2-结点的3-结点中插入新建 121 1.2.4向一个父…

数据库建表设计技巧

1.名字 建表的时候,给表、字段和索引起个好名字,真的太重要了。 1.1 见名知意 名字就像表、字段和索引的一张脸,可以给人留下第一印象。 好的名字,言简意赅,见名知意,让人心情愉悦,能够提高…